1. 程式人生 > 其它 >Kubernetes的Node汙點與Pod親和性

Kubernetes的Node汙點與Pod親和性

技術標籤: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節點上