Kubernetes官方文档——污点和容忍度
建议先去看下官方文档下
简介:
Taint(污点),它使节点能够排斥一类特定的 Pod。
容忍度(Tolerations)是应用于 Pod 上的,允许(但并不要求)Pod 调度到带有与之匹配的污点的节点上
。
污点和容忍度(Toleration)相互配合
,可以用来避免 Pod 被分配到不合适的节点上
。 每个节点上都可以应用一个或多个污点
,这表示对于那些不能容忍这些污点的 Pod
,是不会被该节点接受
的。
关键词 | 注解 |
---|---|
NoSchedule | 不会将Pod调度到具有污点的节点上 |
PreferNoSchedule | 尽量避免将 Pod 调度到具有污点的节点上 |
NoExecute | 不会将Pod调度到具有污点的节点上,同时驱逐Node节点上已存在的Pod |
一、查看当前存在的节点
kubectl get nodes
二、使用命令 kubectl taint 给节点k8s-node2增加一个污点
kubectl taint node k8s-node2 node-role.kubernetes.io=k8s-node2:NoSchedule
若要移除上述命令所添加的污点,你可以执行:
kubectl taint node k8s-node2 node-role.kubernetes.io:NoSchedule-
三、查看k8s-node2节点详细信息
kubectl describe nodes k8s-node2
kubectl create deployment noschedule --image=nginx:latest -o yaml --dry-run=client > noschedule.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: noschedule
name: noschedule
spec:
replicas: 1
selector:
matchLabels:
app: noschedule
template:
metadata:
labels:
app: noschedule
spec:
affinity:
nodeAffinity: #这里强制将pod调度到k8s-node2节点上进行测试
requiredDuringSchedulingIgnoredDuringExecution: # 定义硬亲和性
nodeSelectorTerms:
- matchExpressions: #集合选择器
- key: kubernetes.io/hostname
operator: In
values:
- k8s-node2
containers:
- image: nginx:latest
name: nginx
2、创建并且查看Pod调度情况
kubectl apply -f noschedule.yaml && kubectl get pod -o wide
五、为Pod添加容忍点
1、生成Pod文件
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: noschedule
name: noschedule
spec:
replicas: 1
selector:
matchLabels:
app: noschedule
template:
metadata:
labels:
app: noschedule
spec:
affinity:
nodeAffinity: #这里强制将pod调度到k8s-node2节点上进行测试
requiredDuringSchedulingIgnoredDuringExecution: # 定义硬亲和性
nodeSelectorTerms:
- matchExpressions: #集合选择器
- key: kubernetes.io/hostname
operator: In
values:
- k8s-node2
containers:
- image: nginx:latest
name: nginx
tolerations:
- key: "node-role.kubernetes.io" #污点的key
operator: "Equal"
value: "k8s-node2" #污点的键
effect: "NoSchedule" #污点策略
2、更新Pod文件
kubectl apply -f noschedule.yaml && kubectl get po
六、使用污点NoExecute策略进行测试
1、k8s-node2添加NoExecute污点
kubectl taint node k8s-node2 node-role.kubernetes.io=k8s-node2:NoExecute
2、更新yaml文件并且更新Pod
vim noschedule.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: noschedule
name: noschedule
spec:
replicas: 1
selector:
matchLabels:
app: noschedule
template:
metadata:
labels:
app: noschedule
spec:
affinity:
nodeAffinity: #这里强制将pod调度到k8s-node2节点上进行测试
requiredDuringSchedulingIgnoredDuringExecution: # 定义硬亲和性
nodeSelectorTerms:
- matchExpressions: #集合选择器
- key: kubernetes.io/hostname
operator: In
values:
- k8s-node2
containers:
- image: nginx:latest
name: nginx
tolerations:
- key: "node-role.kubernetes.io" #污点的key
operator: "Equal"
value: "k8s-node2" #污点的键
effect: "NoSchedule" #污点策略
- key: "node-role.kubernetes.io" #污点的key
operator: "Equal"
value: "k8s-node2" #污点的键
effect: "NoExecute" #污点策略
tolerationSeconds: 60 #Pod在节点上运行60秒
kubectl apply -f noschedule.yaml && kubectl get pod -w
七、使用污点PreferNoSchedule策略进行测试
k8s-node2添加PreferNoSchedule污点
kubectl taint node k8s-node2 node-role.kubernetes.io=k8s-node2:PreferNoSchedule
1、实验一测试是否有软性质(强制调度到node2节点上)
vim noschedule.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: noschedule
name: noschedule
spec:
replicas: 3
selector:
matchLabels:
app: noschedule
template:
metadata:
labels:
app: noschedule
spec:
affinity:
nodeAffinity: #这里强制将pod调度到k8s-node2节点上进行测试
requiredDuringSchedulingIgnoredDuringExecution: # 定义硬亲和性
nodeSelectorTerms:
- matchExpressions: #集合选择器
- key: kubernetes.io/hostname
operator: In
values:
- k8s-node2
containers:
- image: nginx:latest
name: nginx
tolerations:
- key: "node-role.kubernetes.io" #污点的key
operator: "Equal"
value: "k8s-node2" #污点的键
effect: "NoSchedule" #污点策略
- key: "node-role.kubernetes.io" #污点的key
operator: "Equal"
value: "k8s-node2" #污点的键
effect: "NoExecute" #污点策略
kubectl get pod -o wide
可以看到也可以正常调度到node2节点上。
2、实验二测试是否有软性质(不强制调度到node2节点上,随机调度策略)
在这里插入代码片
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: noschedule
name: noschedule
spec:
replicas: 3
selector:
matchLabels:
app: noschedule
template:
metadata:
labels:
app: noschedule
spec:
#affinity:
# nodeAffinity: #这里强制将pod调度到k8s-node2节点上进行测试
# requiredDuringSchedulingIgnoredDuringExecution: # 定义硬亲和性
# nodeSelectorTerms:
# - matchExpressions: #集合选择器
# - key: kubernetes.io/hostname
# operator: In
# values:
# - k8s-node2
containers:
- image: nginx:latest
name: nginx
tolerations:
- key: "node-role.kubernetes.io" #污点的key
operator: "Equal"
value: "k8s-node2" #污点的键
effect: "NoSchedule" #污点策略
- key: "node-role.kubernetes.io" #污点的key
operator: "Equal"
value: "k8s-node2" #污点的键
effect: "NoExecute" #污点策略
kubectl delete -f noschedule.yaml && kubectl apply -f noschedule.yaml && kubectl get pod -o wide
总结:
1、如果未被过滤的污点中存在至少一个 effect 值为 NoSchedule 的污点
, 则 Kubernetes 不会将 Pod 分配到该节点
2、如果被过滤的污点中不存在
effect 值为NoSchedule
的污点, 但是存在 effect 值
为 PreferNoSchedule
污点, 则 Kubernetes 会 尝试
将 Pod 分配到该节点
。
3、如果未被过滤的污点
中存在至少一个
effect 值为NoExecute
的污点, 则 Kubernetes 不会将 Pod 分配到该节点
(如果 Pod 还未在节点上
运行), 或者将 Pod 从该节点驱逐
(如果 Pod 已经在节点上运行
)。