昨天談到了Node Name與Node Selector,那我們今天可以來談談Taints and Tolerations和Node Affinity。
就好像是將殺蟲劑(Taints)噴在自己身上,除非有抵抗這種殺蟲劑基因(Tolerations)的蚊子才可以過來叮你,我們的角色就是Node,而Pod是蚊子。
Taints:污點,用在Node上,除非有容忍這種污點的Pod才可以被部署到這個Node上。
Taints類似Label,也是key=value形式,只是後面會加上這個Taints所造成的效果,key=value:effect
Effect有兩種類型:
要怎麼處理Taints呢?
# 增加Taints
kubectl taint nodes node1 key1=value1:NoSchedule
# 移除Taints
kubectl taint nodes node1 key1=value1:NoSchedule-
# 觀看這個Node上有哪些Taints
kubectl describe nodes node1
Tolerations:容忍度,Pod可以容忍哪些Taints。我們來看看要怎麼設定Tolerations。
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "example-key"
operator: "Exists"
effect: "NoSchedule"
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
tolerationSeconds: 3600
一定要全部Taints都匹配,擁有這些Tolerations的Pod才可以被部署到這個Node。
節點親和性,這是一種更彈性的Scheduling方式,類似於Node Selector,但是提供了Prefer這種方式,讓Pod在逼不得已的情況下,還是可以部署在不具備這些條件的Node上。
我們先來看看它是怎麼設定吧~
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- antarctica-east1
- antarctica-west1
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
containers:
- name: with-node-affinity
image: k8s.gcr.io/pause:2.0
如果同時設置nodeSelector和nodeAffinity,那就必須在符合兩者的條件的Node上部署,如果沒有這種Node,就無法部署。
Kubernetes: How to use Gt operator in pod nodeAffinity
你好, Tolerations 那個yaml檔, 是不是有一個 key 以下參數不可以縮排, 如下圖所示:
這個部分應該是不小心按到,校稿時沒注意,感謝提醒~