kubernetes(k8s)Pod污點與容忍


污點(taints)與容忍(tolerations)

對於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 的節點,除了 NoSchedule 外,還有另外兩個選項:

PreferNoSchedule:NoSchedule 的軟策略版本,表示盡量不調度到污點節點上去
NoExecute:該選項意味着一旦 Taint 生效,如該節點內正在運行的 pod 沒有對應 Tolerate 設置,會直接被逐出
污點 taint 標記節點的命令如下:

$ kubectl taint nodes node02 test=node02:NoSchedule
node "node02" tainted

上面的命名將 node02 節點標記為了污點,影響策略是 NoSchedule,只會影響新的 pod 調度,如果仍然希望某個 pod 調度到 taint 節點上,則必須在 Spec 中做出Toleration定義,才能調度到該節點,比如現在我們想要將一個 pod 調度到 master 節點:(taint-demo.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: "node-role.kubernetes.io/master"
        operator: "Exists"
        effect: "NoSchedule"

由於 master 節點被標記為了污點節點,所以我們這里要想 pod 能夠調度到 master 節點去,就需要增加容忍的聲明:

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

然后創建上面的資源,查看結果:

$ kubectl create -f taint-demo.yaml
deployment.apps "taint" created
$ kubectl get pods -o wide
NAME                                      READY     STATUS             RESTARTS   AGE       IP             NODE
......
taint-845d8bb4fb-57mhm                    1/1       Running            0          1m        10.244.4.247   node02
taint-845d8bb4fb-bbvmp                    1/1       Running            0          1m        10.244.0.33    master
taint-845d8bb4fb-zb78x                    1/1       Running            0          1m        10.244.4.246   node02
......

我們可以看到有一個 pod 副本被調度到了 master 節點,這就是容忍的使用方法。

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

如果 operator 的值是 Exists,則 value 屬性可省略
如果 operator 的值是 Equal,則表示其 key 與 value 之間的關系是 equal(等於)
如果不指定 operator 屬性,則默認值為 Equal
另外,還有兩個特殊值:

$ kubectl taint nodes node01 key=value:NoSchedule

    tolerations:
    - key: "key"
      operator: "Equal"
      value: "value"
      effect: "NoScheduale"

 

空的 key(是指key沒有指定,而不是指key為空字符串) 如果再配合operator Exists 就能匹配所有的 key 與 value,也是能容忍所有 node 的所有 Taints
空的 effect 匹配所有的 effect


最后,如果我們要取消節點的污點標記,可以使用下面的命令:

$ kubectl taint nodes node02 test-
node "node02" untainted

這就是污點和容忍的使用方法。

 

原文:https://www.jianshu.com/p/0d08337e5943


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM