K8s资源身份标签Labels
Labels是用于标识和选择K8s资源的键值对;
可以对Pod、Node、Service、Deployment、Namespace等资源使用标签;
用途:
-
分类和组织:通过标签可以将对象分组,如将同一个应用的所有Pod标记为一个标签。
-
筛选和管理:使用标签选择器(Label Selector)来选择和操作特定标签的对象。
-
自动化操作:结合标签选择器,可以在自动化流程中操作和管理对象,如自动缩放、自动部署等。
使用方法:
1.创建资源时,添加标签
javascript
apiVersion: v1
kind: Pod
metadata:
name: my-pod
labels:
app: my-app
environment: production
spec:
containers:
- name: my-container
image: nginx
# 通过标签名筛选Pod
kubectl get pod -l app=my-app
kubectl get pod -l app
2.在资源运行时,添加或者修改标签(使用kubectl)
javascript
# 添加标签(动态添加,yaml文件不显示,但是可以通过这个标签筛选)
kubectl label pod <pod-name> server=nginx
# 删除标签
kubectl label pod <pod-name> server-
# 重新添加标签
kubectl label pod <pod-name> server=apache
在资源中使用标签的方式:
javascript
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector: # 标签选择器
matchLabels: # 通过键值对绑定标签
app: my-app # 需要管理Pod的标签
template: # 创建Pod的模板,通过Deployment自动创建Pod
metadata:
labels:
app: my-app # Pod的标签,用于被筛选和管理
spec:
containers:
- name: my-container
image: 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
javascript
vim node1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myweb
spec:
selector:
matchLabels:
app: myweb
replicas: 6
template:
metadata:
labels:
app: myweb
spec:
nodeName: node1 # 指定Node的名称,实现固定调度
containers:
- name: myweb
image: 192.168.57.200:8099/yun11/h5-game:1.0
ports:
- containerPort: 80
# 指定固定节点标签:Pod.spec.nodeSelector
javascript
vim node-2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myweb
spec:
selector:
matchLabels:
app: myweb
replicas: 4
template:
metadata:
labels:
app: myweb
spec:
nodeSelector: # 通过给Node节点打标签,使用标签选择器进行Pod调度
cname: webserver
containers:
- name: myweb
image: docker.io/nginx
ports:
- containerPort: 80
# 没有对应标签的节点,所以会卡在Pending
# 给node2创建一个标签cname:webserver
kubectl label node node2 cname=webserver
# 查看结果
kubectl get node --show-labels
kubectl 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。
目前,内置的污点也比较多,比如以下几个:
容忍度操作符
在Pod上定义容忍度时,它支持两种操作符:Equal和Exists。
-
Equal:容忍度与污点必须在key、value和effect三者完全匹配。
-
Exists:容忍度与污点必须在key和effect二者完全匹配,容忍度中的value字段要使用空值。
给Node打污点
javascript
# 给节点添加污点:
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增加容忍度
javascript
## 容忍度和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 还能继续在该节点上运行的时间(单位为秒):
javascript
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoExecute"
tolerationSeconds: 3600