在K8S中,容忍如果Pod能容忍某个节点上的分钟污点,那么Pod就可以调度到该节点。搞懂如果不能容忍,污点和度那就无法调度到该节点。容忍污点和容忍度就像谈恋爱的分钟小情侣,你情我愿,搞懂女生知道男生的污点和度缺点,却依然选择容忍,容忍这样他们可以生活在一起。分钟如果女生容忍不了男生的搞懂缺点,那就没法生活在一起。污点和度
Node对Pod对象的排斥等级有3种:
在Pod上定义容忍度时,它支持两种操作符:Equal和Exists。
污点定义在节点的nodeSpec中,容忍度定义在Pod的podSpec中。
污点和容忍度都是键值对的数据格式,但是要增加一个排斥等级(effect)标记。
语法格式为:"key=value:effect"。
上文中定义了Node对Pod的排斥等级有3种。Node如果定义的排斥等级是NoExecute,那么没有配置该污点容忍度的Pod会被驱逐。
K8S 也会使用污点自动标识有问题的节点,比如节点在内存不足的情况下,节点控制器会自动为该节点打上污点信息,并且使用 NoExecute作为排斥等级,此时没有设置此类污点容忍度的Pod 会被驱逐。
DaemonSet控制器会无视此类污点,以便能在节点上部署重要的Pod。
目前,内置的污点也比较多,比如以下几个:
给节点添加污点:
kubectl taint nodes node01 key=value:effect
给节点删除污点,此处的effect可以没有
kubectl taint nodes node01 key[:effect]-
上文中提到了,容忍度的操作符有2种:Equal和Exists,同时把排斥等级也要加上。
使用Equal的场景:
tolerations:- key: "key" operator: "Equal" value: "value" effect: "NoExecute"
使用Exists的场景:
tolerations:- key: "key" operator: "Exists" effect: "NoExecute"
如果Node上污点的排斥等级是NoExecute时,该Node上正在运行的Pod如果没有该污点的容忍度,就会被立刻驱逐。不过系统增加了tolerationSeconds字段,用来延迟驱逐Pod。
tolerationSeconds字段的意思是:如果 Pod 的容忍度配置里存在排斥等级为 NoExecute ,并且指定了属性 tolerationSeconds 的值,那么Pod 还能继续在该节点上运行的时间(单位为秒):
tolerations:- key: "key" operator: "Equal" value: "value" effect: "NoExecute" tolerationSeconds: 3600
kubectl get nodes --show-labels
kubectl label node k8s-worker-2 special-app=specialwebapp
查看某节点的污点情况,可以看到Taints这一栏是none,也可以看到label情况。
kubectl describe node k8s-worker-2
步骤:
操作过程:
kubectl taint nodes k8s-worker-2 question-node=broken-disk:NoSchedule
kubectl taint nodes k8s-worker-2 question-node-
apiVersion: v1kind: Podmetadata: name: webapp namespace: demo labels: app: webappspec: nodeSelector: # 选择调度到具有这个label的节点 "special-app": "specialwebapp"# kubernetes.io/hostname: k8s-worker-2 tolerations: - key: "question-node" operator: "Equal" value: "broken-disk" effect: "NoSchedule" containers: - name: webapp image: nginx ports: - containerPort: 80
在K8S中,如果Pod能容忍某个节点上的污点,那么Pod就可以调度到该节点。如果不能容忍,那就无法调度到该节点。
责任编辑:华轩 来源: 不焦躁的程序员 Kubernetes云原生(责任编辑:探索)
寰亚传媒(08075.HK)中期亏损收窄至1916万港元 每股亏损4.58港仙