taints 是鍵值數(shù)據(jù),用在節(jié)點(diǎn)上,定義污點(diǎn);
tolerations 是鍵值數(shù)據(jù),用在pod上,定義容忍度,能容忍哪些污點(diǎn)。
污點(diǎn)
污點(diǎn)是定義在k8s集群的節(jié)點(diǎn)上的鍵值屬性數(shù)據(jù),可以決定拒絕那些pod。
給了Node選則的主動(dòng)權(quán),給Node打個(gè)污點(diǎn),不容忍 的Pod就調(diào)度不上來(lái)。
現(xiàn)象:剛部署好的K8S集群,默認(rèn)master節(jié)點(diǎn)上不會(huì)被調(diào)度來(lái)任何pod。
原因:master節(jié)點(diǎn)上有個(gè)污點(diǎn)
看 master節(jié)點(diǎn)的信息
kubectl describe nodes k8s-master1
Taints: node-role.kubernetes.io/control-plane:NoSchedule(排斥等級(jí))
查看幫助命令,看如何設(shè)置Node的污點(diǎn)(taints是spec字段下的子字段)
kubectl explain node.spec.taints
解釋說(shuō)明
taints的 effect 字段(必填) 用來(lái)定義對(duì)pod對(duì)象的排斥等級(jí)
- NoSchedule:僅影響pod調(diào)度過(guò)程,僅對(duì)未調(diào)度的pod有影響。(例如:這個(gè)節(jié)點(diǎn)的污點(diǎn)改了,使得之前調(diào)度的pod不能容忍了,對(duì)現(xiàn)存的pod對(duì)象不產(chǎn)生影響)
- NoExecute:既影響調(diào)度過(guò)程,又影響現(xiàn)存的pod對(duì)象(例如:如果現(xiàn)存的pod不能容忍節(jié)點(diǎn)后來(lái)加的污點(diǎn),這個(gè)pod就會(huì)被驅(qū)逐)排斥等級(jí)最高
- PreferNoSchedule:最好不,也可以,是NoSchedule的柔性版本。(例如:pod實(shí)在沒(méi)其他節(jié)點(diǎn)調(diào)度了,也可以到到這個(gè)污點(diǎn)等級(jí)的節(jié)點(diǎn)上)排斥等級(jí)最低
上面看到的 master節(jié)點(diǎn)的污點(diǎn)是Noschedule
所以默認(rèn)創(chuàng)建的pod都不會(huì)調(diào)度到master上,因?yàn)閯?chuàng)建的pod沒(méi)有容忍度
查看部署后master節(jié)點(diǎn)上Pod的信息
kubectl describe pods kube-apiserver-k8s-master1 -n kube-system
相關(guān)信息的片段
可以看到這個(gè)pod的容忍度是NoExecute,則可以調(diào)度到k8s-master1上。
兼容了等級(jí)比NoExecute低的污點(diǎn)。
(注意:在自建pod里污點(diǎn)等級(jí),必須完全匹配才行)
示例1: 使用污點(diǎn)排斥等級(jí)是NoSchedule
給k8s-node2打上污點(diǎn)
污點(diǎn)的key為node-type,值為production,排斥等級(jí)是NoSchedule
kubectl taint node k8s-node2 node-type=production:NoSchedule
ps. 排斥等級(jí)":NoSchedule"必填,否則創(chuàng)建失敗
給k8s-node2打污點(diǎn)后,pod如果不能容忍就不會(huì)調(diào)度過(guò)來(lái)
創(chuàng)建pod資源文件
vim taint-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: taint-pod
namespace: default
labels:
tomcat: tomcat-pod
spec:
containers:
- name: taint-pod
ports:
- containerPort: 8080
image: tomcat:8.5-jre8-alpine
imagePullPolicy: IfNotPresent
創(chuàng)建pod資源
kubectl apply -f taint-pod.yaml
查看pod
kubectl get pods -o wide
可以看到被調(diào)度到k8s-node1上了,因?yàn)閗8s-node2這個(gè)節(jié)點(diǎn)打了污點(diǎn),而在創(chuàng)建pod的時(shí)候沒(méi)有容忍度,所以k8s-node2上不會(huì)有pod調(diào)度上去的
示例2 :使用污點(diǎn)類(lèi)型是NoExecute
在示例1的基礎(chǔ)上,給剛剛的k8s-node1打污點(diǎn)
kubectl taint node k8s-node1 node-type=dev:NoExecute
查看pod
kubectl get pods -o wide
上面可以看到已經(jīng)存在的pod節(jié)點(diǎn)都被攆走了
只看節(jié)點(diǎn)的污點(diǎn)
kubectl describe node k8s-node1|grep Taints
ps. 刪除污點(diǎn)的方式
kubectl taint nodes k8s-node2 node-type-
容忍度
重新給node1打上污點(diǎn),保證2個(gè)工作節(jié)點(diǎn)node上都打了污點(diǎn)。通過(guò)配置Pod的容忍度完成調(diào)度
查看幫助命令,看如何設(shè)置Pod的容忍度(tolerations是spec字段下的子字段)
kubectl explain pod.spec.tolerations
重點(diǎn)部分截圖:
解釋說(shuō)明
- effect:用來(lái)匹配node的污點(diǎn)等級(jí)
- key:node標(biāo)簽的鍵
- operator:匹配表達(dá)式
- value:node標(biāo)簽的值
- tolerationSeconds:與NoExecute搭配使用表示驅(qū)逐時(shí)間
tolerations 中的 effect 字段 用來(lái)匹配污點(diǎn)等級(jí)
- NoExecute
- NoSchedule
- PreferNoSchedule
示例1 創(chuàng)建pod時(shí),指定具體可容忍的node的特征
創(chuàng)建pod資源文件
vim vim pod-demo-1.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-deploy
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
tolerations: # 設(shè)置Pod的容忍度
- key: "node-type" # node標(biāo)簽的鍵
operator: "Equal" # 匹配方式為等值匹配
value: "production" # node標(biāo)簽的值
effect: "NoExecute" # node的污點(diǎn)等級(jí)
tolerationSeconds: 3600 # 與NoExecute搭配使用表示驅(qū)逐時(shí)間
創(chuàng)建pod資源
kubectl apply -f pod-demo-1.yaml
查看pod
kubectl get pods -o wide
還是顯示pending,因使用的是equal(等值匹配),所以 key、value和effect 必須和 node 節(jié)點(diǎn)定義的污點(diǎn)完全匹配才可以。
把上面yaml文件調(diào)整一下:
1、配置effect: “NoExecute"變成"NoSchedule”
2、去掉tolerationSeconds
apiVersion: v1
kind: Pod
metadata:
name: myapp-deploy
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
tolerations:
- key: "node-type"
operator: "Equal"
value: "production"
effect: "NoSchedule"
重建pod資源
kubectl delete -f pod-demo-1.yaml
kubectl apply -f pod-demo-1.yaml
查看pod文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-825527.html
kubectl get pods -o wide
上面就可以調(diào)度到k8s-node2上了,因?yàn)樵趐od中定義的容忍度能容忍node節(jié)點(diǎn)上的污點(diǎn)
示例2:使用非精準(zhǔn)容忍度匹配
再調(diào)整 pod-demo-1.yaml 的部分配置
apiVersion: v1
kind: Pod
metadata:
name: myapp-deploy
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
tolerations:
- key: "node-type"
operator: "Exists" # 調(diào)整了匹配方式
value: "" # 去掉了node的污點(diǎn)值
effect: "NoSchedule" # 匹配的等級(jí)
只要對(duì)應(yīng)的鍵是存在的,exists,其值被自動(dòng)定義成通配符
重建pod資源
kubectl delete -f pod-demo-1.yaml
kubectl apply -f pod-demo-1.yaml
查看pod
kubectl get pods -o wide
發(fā)現(xiàn)還是調(diào)度到k8s-node2上
再次修改
apiVersion: v1
kind: Pod
metadata:
name: myapp-deploy
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
tolerations:
- key: "node-type"
operator: "Exists" # 調(diào)整了匹配方式
value: "" # 去掉了值
effect: "" # 去掉node的污點(diǎn)等級(jí)
有一個(gè)node-type的鍵,不管值是什么,不管是什么污點(diǎn)等級(jí),都能容忍
重建pod資源
kubectl delete -f pod-demo-1.yaml
kubectl apply -f pod-demo-1.yaml
查看pod
kubectl get pods -o wide
可以看到k8s-node2和k8s-node1節(jié)點(diǎn)上都有可能有pod被調(diào)度文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-825527.html
到了這里,關(guān)于K8S之運(yùn)用污點(diǎn)、容忍度設(shè)置Pod的調(diào)度約束的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!