k8s-Pod汙點與容忍

Jeff的技術棧發表於2021-11-25

Pod汙點與容忍

大白話先解釋一下汙點與容忍

汙點:被打上汙點Taints的節點,不會被排程器部署pod應用。
容忍:允許排程器部署pod應用到打上汙點Taints的節點。

為什麼要用汙點和容忍?

為什麼用汙點?
因為k8s叢集每一個請求都需要走master節點kube-apiserver,因此master節點非常重要,所以pod應用一般不部署master節點。那麼給master節點打上汙點Taints,這樣排程的時候就不會部署到帶有汙點的機器了

為什麼用容忍?
比如被打上汙點Taints的master節點需要部署某個pod應用,那麼就需要容忍宣告,這樣就可以排程到帶有汙點的機器了

官方解釋

對於nodeAffinity無論是硬策略還是軟策略方式,都是排程 pod 到預期節點上,而Taints恰好與之相反,如果一個節點標記為 Taints ,除非 pod 也被標識為可以容忍汙點節點,否則該 Taints 節點不會被排程 pod。

比如使用者希望把 Master 節點保留給 Kubernetes 系統元件使用,或者把一組具有特殊資源預留給某些 pod,則汙點就很有用了,pod 不會再被排程到 taint 標記過的節點。我們使用kubeadm搭建的叢集預設就給 master 節點新增了一個汙點標記,所以我們看到我們平時的 pod 都沒有被排程到 master 上去:
$ kubectl describe node master
Name:               master
Roles:              master
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/hostname=master
                    node-role.kubernetes.io/master=
......
Taints:             node-role.kubernetes.io/master:NoSchedule
Unschedulable:      false
我們可以使用上面的命令檢視 master 節點的資訊,其中有一條關於 Taints 的資訊:node-role.kubernetes.io/master:NoSchedule,就表示給 master 節點打了一個汙點的標記,其中影響的引數是NoSchedule,表示 pod 不會被排程到標記為 taints 的節點

Taints引數

node-role.kubernetes.io/master:NoSchedule

NoSchedule: 不排程到汙點節點上去
PreferNoSchedule:NoSchedule 的軟策略版本,表示儘量不排程到汙點節點上去
NoExecute:該選項意味著一旦Taint生效,如該節點內正在執行的pod沒有對應Tolerate設定,會直接被逐出

標記汙點

# kubectl taint node sg-14 test=sg14:PreferNoSchedule

node/sg-14 tainted

上面的命名將 sg-14 節點標記為了汙點,影響策略是 PreferNoSchedule,只會影響新的 pod 排程,如果仍然希望某個 pod 排程到 taint 節點上,則必須在 Spec 中做出Toleration定義,才能排程到該節點,

由於 master 節點被標記為了汙點節點,所以我們這裡要想 pod 能夠排程到 master 節點去,就需要增加容忍的宣告:

容忍汙點

tolerations:
- key: "node-role.kubernetes.io/master"
  operator: "Exists"
  effect: "NoSchedule"

eg:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment
spec:
  replicas: 1  		# pod數量
  selector:  			# 選擇器
    matchLabels:  # 標籤
      release: stable # 選擇標籤
  template:  				# 模版
    metadata:
      name: test-tag  # 控制器名字
      labels:
        release: stable # 設定控制器標籤
    spec:
      containers:
        - name: nginx  # 映象名稱
          image: nginx # 映象 
      tolerations:
      - key: "node-role.kubernetes.io/master"
        operator: "Exists"
        effect: "NoSchedule"

然後建立上面的資源,我們可以看到有一個 pod 副本被排程到了 master 節點,這就是容忍的使用方法。

對於 tolerations 屬性的寫法,其中pod的 key、value、effect 與 Node 的 Taint 設定需保持一致, 還有以下幾點說明:

如果 operator 的值是 Exists,則 value 屬性可省略
如果 operator 的值是 Equal,則表示其 key 與 value 之間的關係是 equal(等於)
如果不指定 operator 屬性,則預設值為 Equal
另外,還有兩個特殊值:
  tolerations:
  - key: "key"
    operator: "Equal"
    value: "value"
    effect: "NoScheduale"

取消所有節點汙點

[root@sg-14 deployment]# kubectl taint node sg-14 test-

node/sg-14 untainted
就刪除了節點汙點

相關文章