Kubernetes的Node汙點與Pod親和性
阿新 • • 發佈:2021-01-05
技術標籤:KubernetesDevops
簡介:
新增汙點的Node節點預設不會參與日常排程,有兩種策略分別為“NoSchedule”和“NoExecute”,加入汙點的Node只有在Pod的Yaml檔案設定相對應的容忍,Pod才會排程到該節點,但是注意不是
NoSchedule:軟策略,表示儘量不排程到汙點節點上去,只會影響到新的pod而不會對已經執行在該Node節點其他pod造成影響
NoExecute:該選項意味著一旦 Taint 生效,如該節點內正在執行的 pod 沒有對應 Tolerate 設定,會直接被逐出
eg:
NoSchedule
Node節點上的舊Pod不會被驅逐
#新增汙點到Node節點上
kubectl taint node k8s-03 test=k8s-03:NoSchedule
#檢視Node節點汙點
kubectl describe node k8s-03#建立測試Pod的yaml
apiVersion: apps/v1beta1 kind: Deployment metadata: name: taint labels: app: taint spec: replicas: 3 revisionHistoryLimit: 10 template: metadata: labels: app: taint spec: containers: - name: nginx image: nginx:1.7.9 ports: - name: http containerPort: 80 tolerations: #新增容忍 - key: "test" operator: "Equal" #"Equal"表示key與value之間的關係是等於 value: "k8s-03" effect: "NoSchedule"
結果:原來該Node上的Pod並沒有被驅逐,建立沒有與該Node汙點對應容忍的Pod不會排程到該節點
NoExecute
在給Node節點新增汙點後,Node節點上的舊Pod會被驅逐
這裡配合排程親和性的硬策略,可以實現deployment/statefulset下面所有的pod只執行在該節點上,且該節點不參與普通排程舊Pod被驅逐
#Node新增汙點
kubectl taint node k8s-04 ceshi=ceshi:NoExecute
#檢視Node節點汙點
kubectl describe node k8s-04#建立測試Pod的yaml
apiVersion: apps/v1beta1 kind: Deployment metadata: name: taint labels: app: taint spec: replicas: 3 revisionHistoryLimit: 10 template: metadata: labels: app: taint spec: affinity: #指定排程親和性 nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: #排程硬策略 nodeSelectorTerms: - matchExpressions: #指定標籤,可以寫其他該Node的唯一標籤 - key: kubernetes.io/hostname operator: In values: - k8s-04 containers: - name: nginx image: nginx:1.7.9 ports: - name: http containerPort: 80 tolerations: #指定容忍策略 - key: "ceshi" operator: "Equal" value: "ceshi" effect: "NoExecute"
結果:
所有的Pod都被排程到了有汙點的Node(k8s-04)上,且建立普通pod不會考慮排程到該Node節點上