污点与容忍
污点(Taints)与容忍(Tolerations)是Kubernetes调度系统中的核心机制,用于实现节点与Pod之间的"选择性匹配",为生产环境提供了精细化的调度控制能力。
如果node节点有多个污点的话,在pod中需要全部设置。
污点(Taints)
污点是节点(Node)上的属性,用于排斥不符合条件的Pod被调度到该节点。
污点组成
每个污点包含三个部分:
key: 污点的标识符value: 污点的值effect: 污点的效果,决定如何排斥Pod
污点命名规范
标准化前缀
使用
node-role.kubernetes.io/master作为键名,这是Kubernetes社区广泛认可的命名规范语义化值
reserved:表示节点为系统保留资源dedicated:表示专用节点(二选一)
效果选择
NoSchedule(生产首选)比NoExecute更温和,允许已有Pod继续运行
污点策略
| 策略 | 说明 |
|---|---|
NoSchedule | 不容忍该污点的Pod不会被调度到该节点 |
PreferNoSchedule | 尽量避免调度不容忍的Pod,但不是强制的 |
NoExecute | 不容忍的Pod不会被调度到该节点,且已运行的Pod会被驱逐 |
污点操作命令
添加污点
bash
kubectl taint nodes <node-name> <key>=<value>:<effect>
# 示例:给master01添加dedicated专用污点
kubectl taint nodes k8s-master01 dedicated=master:NoSchedule查看污点
bash
kubectl describe nodes <node-name> | grep Taints删除污点
bash
kubectl taint nodes <node-name> <key>[:<effect>]-
# 示例:删除master01的dedicated污点
kubectl taint nodes k8s-master01 dedicated:NoSchedule-容忍(Tolerations)
容忍是Pod上的配置,允许(但不强制)Pod被调度到带有特定污点的节点上。
容忍字段说明
| 字段 | 说明 | 可选值 |
|---|---|---|
key | 要匹配的污点键 | 字符串 |
operator | 匹配操作符 | Exists(存在即可)或Equal(值相等) |
value | 要匹配的污点值 | 字符串 |
effect | 要匹配的污点效果 | NoSchedule, PreferNoSchedule, NoExecute |
tolerationSeconds | 仅对NoExecute有效,指定被驱逐前的等待时间 | 秒数 |
容忍配置
NoSchedule
yaml
apiVersion: v1
kind: Pod
metadata:
name: demo-app
spec:
containers:
- name: demo-pod
image: nginx
imagePullPolicy: IfNotPresent
# pod 容忍
tolerations:
- key: "dedicated"
operator: "Equal"
value: "master"
# 污点策略
effect: "NoSchedule"Exists
yaml
apiVersion: v1
kind: Pod
metadata:
name: demo-app
spec:
containers:
- name: demo-pod
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "dedicated"
operator: "Equal"
value: "master"
effect: "Exists"带延迟的NoExecute容忍
yaml
apiVersion: v1
kind: Pod
metadata:
name: demo-app
spec:
containers:
- name: demo-pod
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "dedicated"
operator: "Equal"
value: "master"
effect: "NoExecute"
tolerationSeconds: 3600 # 1小时后才被驱逐