K8s的标签应用和调度
K8s资源身份标签Labels
Labels是用于标识和选择K8s资源的键值对;
可以对Pod、Node、Service、Deployment、Namespace等资源使用标签;
用途:
分类和组织:通过标签可以将对象分组,如将同一个应用的所有Pod标记为一个标签。
筛选和管理:使用标签选择器(Label Selector)来选择和操作特定标签的对象。
自动化操作:结合标签选择器,可以在自动化流程中操作和管理对象,如自动缩放、自动部署等。
使用方法:
1.创建资源时,添加标签
apiVersion: v1kind: Podmetadata:name: my-podlabels:app: my-appenvironment: productionspec:containers:- name: my-containerimage: nginx# 通过标签名筛选Podkubectl get pod -l app=my-appkubectl get pod -l app2.在资源运行时,添加或者修改标签(使用kubectl)
# 添加标签(动态添加,yaml文件不显示,但是可以通过这个标签筛选)kubectl label pod <pod-name> server=nginx# 删除标签kubectl label pod <pod-name> server-# 重新添加标签kubectl label pod <pod-name> server=apache在资源中使用标签的方式:
apiVersion: apps/v1kind: Deploymentmetadata:name: my-deploymentspec:replicas: 3selector: # 标签选择器matchLabels: # 通过键值对绑定标签app: my-app # 需要管理Pod的标签template: # 创建Pod的模板,通过Deployment自动创建Podmetadata:labels:app: my-app # Pod的标签,用于被筛选和管理spec:containers:- name: my-containerimage: nginx# 查看标签kubectl describe pod <pod-name># 查看所有Pod的标签kubectl get pod -A --show-labels结合使用
标签和标签选择器在 Kubernetes 中有广泛的应用,以下是一些常见的结合使用场景:
- 服务发现:使用标签选择器将
Service绑定到特定的 Pod,实现负载均衡和服务发现。 - 自动化编排:使用标签选择器自动化编排,如使用
HorizontalPodAutoscaler根据标签选择器自动扩展 Pod。 - 资源分组:使用标签将相关资源分组,便于管理和查询。
最佳实践
- 命名规范:使用有意义的标签键和值,便于理解和维护。
- 避免过度标签:避免添加过多不必要的标签,保持标签的简洁性和实用性。
- 一致性:在不同对象和团队之间保持标签的一致性,便于协作和自动化管理。
K8s集群调度介绍
Scheduler:调度器
作用:
在创建运行Pod时,用于将Pod的创建请求绑定到Node节点上;
可以满足调度的公平、高效、灵活;
核心:
公平:如何保证每个节点都能被分配资源
资源高效利用:集群所有资源最大化被使用
效率:调度的性能要好,能够尽快地对大批量的 pod 完成调度工作
灵活:允许用户根据自己的需求控制调度的逻辑
调度过程:
1、过滤掉不满足条件的节点,预选(predicate) ;
2、按照节点的优先级排序,优选(priority) ;
3、选择优先级最高的Node节点。如果中间任何一步骤有错误,就直接返回错误。
调度方法:
1.自动调度:Scheduler经过一系列的算法计算得出最优节点;
2.定向调度:
NodeName:指定Node名称进行调度
NodeSelector:通过Node标签进行选择调度
3.亲和性调度:
NodeAffinity:节点亲和性
PodAffinity:Pod亲和性
PodAntiAffinity:Pod反亲和性
4.污点(容忍)调度:
Taints:给Node节点打上污点,需要容忍度才能调度(没有该污点容忍度的Pod无法调度);
Toleration:在Pod上设置容忍度,才能运行在有污点的Node上;
几种调度方法的案例
固定调度案例:
# 指定固定节点:Pod.spec.nodeName
vim node1.yaml apiVersion: apps/v1kind: Deploymentmetadata:name: mywebspec:selector:matchLabels:app: mywebreplicas: 6template:metadata:labels:app: mywebspec:nodeName: node1 # 指定Node的名称,实现固定调度containers:- name: mywebimage: 192.168.57.200:8099/yun11/h5-game:1.0ports:- containerPort: 80# 指定固定节点标签:Pod.spec.nodeSelector
vim node-2.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: mywebspec:selector:matchLabels:app: mywebreplicas: 4template:metadata:labels:app: mywebspec:nodeSelector: # 通过给Node节点打标签,使用标签选择器进行Pod调度cname: webservercontainers:- name: mywebimage: docker.io/nginxports:- containerPort: 80# 没有对应标签的节点,所以会卡在Pending# 给node2创建一个标签cname:webserverkubectl label node node2 cname=webserver# 查看结果kubectl get node --show-labelskubectl get pod -o wide# 删除标签kubectl label nodes node2 cname- # 一键删除多个控制器kubectl delete deployment myweb污点与容忍度
如果Node节点上有污点,需要Pod有容忍度才能调度运行;

污点的三种排斥级别
NoSchedule:没有容忍度的Pod不能新建,已经运行的Pod不受影响;(没有配置此污点容忍度的新Pod不能调度到此节点,节点上现存的Pod不受影响)。
PreferNoSchedule:没有容忍度的Pod尽量不要创建,如果没有其他节点可以选择,也能创建;(没有配置此污点容忍度的新Pod尽量不要调度到此节点,如果找不到合适的节点,依然会调度到此节点)。
NoExecute:驱逐所有Pod应用;(没有配置此污点容忍度的新Pod对象不能调度到此节点,节点上现存的Pod会被驱逐)。
用法
污点定义在节点的nodeSpec中,容忍度定义在Pod的podSpec中。
污点和容忍度都是键值对的数据格式,但是要增加一个排斥等级(effect)标记。
语法格式为:"key=value:effect"。
使用场景
1、独占节点
如果想拿出部分节点给特定的Pod使用,可以通过给节点添加污点,然后特定的Pod加入对应的容忍度。
在集群中有些机器设备可能比较特殊,比如CPU性能很好、内存很大等等,不希望普通Pod占用这部分特殊节点,可以通过污点和容忍度来解决。
2、驱逐Pod
上文中定义了Node对Pod的排斥等级有3种。Node如果定义的排斥等级是NoExecute,那么没有配置该污点容忍度的Pod会被驱逐。
K8S 也会使用污点自动标识有问题的节点,比如节点在内存不足的情况下,节点控制器会自动为该节点打上污点信息,并且使用 NoExecute作为排斥等级,此时没有设置此类污点容忍度的Pod 会被驱逐。
DaemonSet控制器会无视此类污点,以便能在节点上部署重要的Pod。
目前,内置的污点也比较多,比如以下几个:
node.kubernetes.io/not-ready:节点未就绪
node.kubernetes.io/unreachable:节点不可触达
node.kubernetes.io/memory-pressure:节点内存空间已满。
node.kubernetes.io/disk-pressure:节点磁盘空间已满。
node.kubernetes.io/network-unavailable:节点网络不可用。
容忍度操作符
在Pod上定义容忍度时,它支持两种操作符:Equal和Exists。
Equal:容忍度与污点必须在key、value和effect三者完全匹配。
Exists:容忍度与污点必须在key和effect二者完全匹配,容忍度中的value字段要使用空值。
给Node打污点
# 给节点添加污点:kubectl taint nodes node1 key=value:effect# 举例kubectl taint nodes node1 aihao=shuijiao:Noschedule(单个的)kubectl taint nodes node1 exi=dubo:NoExecute# 给节点删除污点,此处的effect可以没有kubectl taint nodes node1 key[:effect]-# 举例:kubectl taint nodes node1 exi-给Pod增加容忍度
## 容忍度和container平级,注意缩进,需要多几个副本一起测试建议用deployment# 使用Equal的场景:(根据键的值容忍)tolerations:- key: "key"operator: "Equal"value: "value"effect: "NoExecute"# 使用Exists的场景:(根据键是否存在来容忍)tolerations:- key: "key"operator: "Exists"effect: "NoExecute"补充:
如果Node上污点的排斥等级是NoExecute时,该Node上正在运行的Pod如果没有该污点的容忍度,就会被立刻驱逐。不过系统增加了tolerationSeconds字段,用来延迟驱逐Pod。
tolerationSeconds字段的意思是:如果 Pod 的容忍度配置里存在排斥等级为 NoExecute ,并且指定了属性 tolerationSeconds 的值,那么Pod 还能继续在该节点上运行的时间(单位为秒):
tolerations:
- key: "key"operator: "Equal"value: "value"effect: "NoExecute"tolerationSeconds: 3600