在Kubernetes中,污点(Taints)和容忍(Tolerations)是一种机制,用于控制Pod的调度行为。以下是关于污点和容忍的详细信息:
概念:
污点(Taints):污点是一种将节点标记为不适宜运行某些Pod的机制。污点可以用来确保Pod不会被调度到不合适的节点上。与节点亲和性(Node Affinity)相反,污点是一种排斥机制。
容忍(Tolerations):容忍允许Pod被调度到具有匹配污点的节点上。Pod可以通过设置容忍来忽略节点上的污点。
污点的组成
污点由以下三个部分组成:
**键(Key):**表示污点的唯一标识符。
**值(Value):**与键相关联的值,通常用来表示污点的具体信息。
**效果(Effect):**表示污点的作用,有以下几个可选值:
NoSchedule:Kubernetes不会将新Pod调度到具有该污点的节点上,历史存在Pod不受影响。
PreferNoSchedule:Kubernetes会尽量避免将Pod调度到具有该污点的节点上,但不是强制的。
NoExecute:如果Pod已经在具有该污点的节点上运行,它将被驱逐;同时,Kubernetes不会将新的Pod调度到该节点上。
配置污点
添加污点:
bash
kubectl taint nodes <node-name> <key>=<value>:<effect>
例如:
bash
kubectl taint nodes node1 key1=value1:NoSchedule
移除污点:
bash
kubectl taint nodes <node-name> <key>=<value>:<effect>-
例如:
bash
kubectl taint nodes node1 key1=value1:NoSchedule-
配置容忍
在Pod的配置中,可以通过设置tolerations来容忍特定的污点。以下是一个示例:
bash
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
tolerations: #定义 Pod 的容忍策略,用于与节点的污点(Taints)匹配。
- key: "key1" #容忍的污点键为 key1。
operator: "Equal" #操作符为 Equal,表示污点的值必须等于 value1。
value: "value1" #污点的值为 value1。
effect: "NoSchedule" #污点的效果为 NoSchedule,表示不允许调度新的 Pod 到该节点。
tolerationSeconds: 3600 #容忍的时长为 3600 秒(1 小时)。
- key: "key2" #容忍的污点键为 key2。
operator: "Exists" #操作符为 Exists,表示只要污点键存在即可。
effect: "NoExecute" #污点的效果为 NoExecute,表示如果污点存在,Pod 会被驱逐。
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
容忍的operator:
Equal
含义:容忍的污点(Taint)的键值对必须完全匹配。
-用 法:需要同时指定 key、value 和 operator。
示例:
bash
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
这表示容忍的污点必须满足键为 key1、值为 value1,并且污点的效果为 NoSchedule。
Exists
-含义 ****:只要污点的键存在即可,不需要匹配具体的值。
用法:只需要指定 key 和 operator,不需要指定 value。
示例:
bash
tolerations:
- key: "key2"
operator: "Exists"
effect: "NoExecute"
这表示容忍的污点只要键为 key2 即可,无论它的值是什么,只要污点的效果为 NoExecute。
查看污点
bash
kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints