labels用于标识和选择 Kubernetes 对象(如 Pod、Deployment、Service、Namespace 等)的键值对
用途:
①分类和组织
②筛选和管理
③自动化操作
使用方法:
①创建资源时,添加标签
通过标签名,筛选pod
kubectl get pod -l app=pod-1
kubectl get pod -l app,env
apiVersion: v1kind: Pod
metadata:
name: my-pod
labels:
app: my-app
environment: production
spec:
containers:
- name: my-container
image: nginx
②在资源运行时,添加或修改标签
添加标签
kubectl label pod myapp-2-b6f89777f-r5n7x server=nginx
删除标签
kubectl label pod myapp-2-b6f89777f-r5n7x server-
重新添加标签
kubectl label pod myapp-2-b6f89777f-r5n7x server=apache
apiVersion: apps/v1kind: 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
查看一个pod的标签
kubectl describe pod myapp-2-b6f89777f-r5n7x / grep Labels
查看所有pod的标签
kubectl get pod --show-labels
Scheduler:调度器
在创建运行pod时,用于将Pod的创建请求绑定到Pode节点上;
可以满足调度的公平、高效、灵活;
调度过程:
1.过滤掉不满足条件的节点,预选(predicate)
2.按照节点的优先级排序,优选(priority)
3.选择优先级最高的node节点
调度方法:
1.自动调度:Scheduler经过一系列的算法计算得出最优节点;
2.定向调度:
NodeName:指定Node名称进行调度;
NodeSelector:通过Node标签进行选择调度
3.亲和性调度:
NodeAffinity (节点亲和度)
PodAffinity (Pod亲和度)
PodAntiAffinity (Pod反亲和性)
4.污点与容忍度:
Taints 给Node节点打上污点,需要容忍度才能调度
Toleration 在Pod上设置容忍度,才能运行在有污点的Node上
固定调度案例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myweb
spec:
selector:
matchLabels:
app: myweb
replicas: 6
template:
metadata:
labels:
app: myweb
spec:
nodeName: node-1 #通过指定nodeName,实现固定调度
containers:
- name: myweb
image: docker.io/nginx
ports:
- containerPort: 80
污点与容忍度
如果Node节点上有污点,需要Pod有容忍度才能调度运行
污点的三种级别:
NoSchedule:没有容忍的Pod不能新建,已经运行的Pod不受影响;(第二级别)
PreferNoSchedule:没有容忍的Pod尽量不要创建,如果没有其他节点可以选择,也能创建;(最小级别)
NoExecute:驱逐所有Pod应用;(最高级别)
给node打污点:
创建污点
kubectl taint nodes node01 key=value:effect (关键字:taint)
删除污点
kubectl taint nodes node01 key-
给pod添加容忍度:
在 Kubernetes 中,Pod 的容忍度(Tolerations)用于允许 Pod 调度到带有污点(Taints)的节点上。污点和容忍度是 Kubernetes 中用于控制 Pod 调度的一种机制,允许你将某些 Pod 排除在某些节点之外,或者将某些 Pod 明确允许调度到特定的节点上。
1. 污点(Taints)和容忍度(Tolerations)的基本概念
-
污点(Taints):是一种节点属性,用于阻止某些 Pod 调度到该节点上。污点由键(key)、值(value)和效果(effect)组成。
-
effect 的值可以是:
-
NoSchedule:不允许新的 Pod 调度到该节点,但已调度的 Pod 不受影响。 -
PreferNoSchedule:尽量避免将新的 Pod 调度到该节点,但不是强制的。 -
NoExecute:不允许新的 Pod 调度到该节点,并且会驱逐已存在的 Pod。
-
-
-
容忍度(Tolerations):是一种 Pod 属性,用于允许 Pod 调度到带有特定污点的节点上。容忍度也由键(key)、值(value)和效果(effect)组成。
2. 给 Pod 添加容忍度
在 Pod 的定义中,可以通过 tolerations 字段来添加容忍度。以下是一个示例:
示例 Pod 定义
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
tolerations:
- key: "node-type"
operator: "Equal"
value: "gpu"
effect: "NoSchedule"
在这个例子中:
-
key :
node-type,表示容忍的污点键。 -
operator :
Equal,表示键和值必须匹配。 -
value :
gpu,表示容忍的污点值。 -
effect :
NoSchedule,表示容忍的污点效果。
3. 示例场景
假设你有一些节点带有以下污点:
kubectl taint nodes node1 node-type=gpu:NoSchedule
如果没有添加容忍度,Pod 将无法调度到带有该污点的节点上。通过在 Pod 定义中添加上述容忍度,Pod 就可以被调度到带有 node-type=gpu:NoSchedule 污点的节点上。
4. 其他容忍度配置
a. 匹配所有污点
如果你希望 Pod 容忍所有类型的污点,可以使用以下配置:
tolerations:
- operator: "Exists"
effect: "NoSchedule"
b. 容忍特定效果
如果你只想容忍特定效果的污点,可以指定 effect:
tolerations:
- key: "node-type"
operator: "Equal"
value: "gpu"
effect: "NoSchedule"
- key: "node-type"
operator: "Equal"
value: "gpu"
effect: "PreferNoSchedule"
5. 动态添加容忍度
如果你已经创建了 Pod,但需要动态添加容忍度,可以通过修改 Pod 的 YAML 文件并重新应用来实现:
kubectl get pod my-pod -o yaml > my-pod.yaml
编辑 my-pod.yaml 文件,添加 tolerations 部分,然后重新应用:
kubectl apply -f my-pod.yaml
6. 注意事项
-
污点和容忍度的匹配:Pod 的容忍度必须与节点的污点完全匹配(键、值和效果),才能允许调度。
-
动态更新:动态更新 Pod 的容忍度可能需要重新调度 Pod,这可能会导致 Pod 的重启。
-
多节点调度:如果多个节点带有相同的污点,Pod 仍然会根据其他调度策略(如资源需求)选择最适合的节点。
通过合理配置污点和容忍度,你可以更好地控制 Pod 的调度行为,优化资源利用和隔离策略。