污点和容忍度
污点就是定义在节点上的键值属性数据,可以决定拒绝哪些pod
taints是键值数据,用在节点上,定义污点。
tolerations是键值数据,用在pod上,定义容忍度,能容忍哪些污点。
查看node污点:
NoSchedule:仅影响pod调度过程,当pod能容忍这个节点的污点,就可以调度到该节点。如果这个节点污点改了,之 对以后新的pod产生影响,对已存在的pod不影响
NoExecute:既影响调度过程,又影响现存pod
PreferNoSchedule:最好不,也可以。是NoSchedule的不强制版本
mast的污点是NoSchedule,所以如果创建的pod没有容忍度,都不会调度到master,只会调度到node节点
而kube-system命名空间中的pod,是由定义容忍度的:
# 给node02打上污点
kubectl taint node node02 node-type=production:NoSchedule
vi pod-taints.yaml
kind: Pod
metadata:
name: taint-pod
namespace: default
labels:
app: nginx-pod
spec:
containers:
- name: taint-pod
image: 172.16.80.140/nginx/nginx:1.26
imagePullPolicy: IfNotPresent
kubectl apply -f pod-taints.yaml
kubectl get pods -owide
# 该pod无法调度到node02上,只能调度到node01上
# 给node01也打上污点 NoExecute,发现pod不见了,重新应用,也只能是pending状态
kubectl taint node node01 node-type=dev:NoExecute
# 给pod打上容忍度,node-type=dev:NoExecute,发现pod又可以调度到node01上了
vi pod-tolerations.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-tole
namespace: default
labels:
app: nginx
release: canary
spec:
containers:
- name: nginx-tole
image: 172.16.80.140/nginx/nginx:1.26
imagePullPolicy: IfNotPresent
tolerations:
- key: "node-type"
operator: "Equal"
value: "dev"
effect: "NoExecute"
tolerationSeconds: 3600
kubectl apply -f pod-tolerations.yaml
kubectl get pods -owide