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
就刪除了節點污點