容忍和污点Taint和Toleration
说明:
Taint在一类服务器上打上污点,让不能容忍这个污点的Pod不能部署在打了污点的服务器上。
Toleration是让Pod容忍节点上配置的污点,可以让一些需要特殊配置的Pod能够调用到具有
污点和特殊配置的节点上
一、Taint配置解析
1-1、创建一个污点(一个节点可以有多个污点)
kubectl taint nodes NODE_NAME TAINT_KEY=TAINT_VALUE:EFFECT
创建基本命令。例如在node1节点上面创建污点命令如下:
[root@k8s-master1 ~]# kubectl taint node node-1 node=node:NoSchedule node/node-1 tainted
1-2、污点类型
NoSchedule:禁止调度到该节点,已经在该节点上的Pod不受影响
NoExecute:禁止调度到该节点,如果不符合这个污点,会立马被驱逐(或在一段时间后)
PreferNoSchedule:尽量避免将Pod调度到指定的节点上,如果没有更合适的节点,可以部署到该节点
1-3、Toleration配置解析
#方式一完全匹配: tolerations: - key: "taintKey" operator: "Equal" value: "taintValue" effect: "NoSchedule" #方式二不完全匹配: tolerations: - key: "taintKey" operator: "Exists" effect: "NoSchedule" #方式三大范围匹配(不推荐key为内置Taint) tolerations: - key: "taintKey" operator: "Exists" #方式四匹配所有(不推荐): tolerations: - operator: "Exists" #停留时间配置: tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoExecute" tolerationSeconds: 120 #停留120秒后在驱逐
1-4、利用Deployment 控制器配置nginx容器指定到node-1节点部署示例
- 节点上打上污点和标签
#禁止调度到该解决,如果不符合这个污点会立马驱逐(或在一段时间内) [root@k8s-master1 taint]# kubectl taint node node-1 web=web:NoExecute node/node-1 tainted #禁止调度到该节点,已经存在该节点上的pod不受影响。 [root@k8s-master1 taint]# kubectl taint node node-1 web=web:NoSchedule node/node-1 tainted #给节点打上标签,利用spec.nodeSelector把创建的pod调度到设置的标签节点上面 [root@k8s-master1 taint]# kubectl label nodes node-1 web=web node/node-1 labeled
- 利用nodeSelector指定标签key:value部署容器到node-1节点。及结合Toleration配置Deployment。
apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx-taint name: nginx-taint spec: replicas: 1 selector: matchLabels: app: nginx-taint template: metadata: labels: app: nginx-taint spec: containers: - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12-alpine name: nginx-taint nodeSelector: web: "web" #这里是上面设置web=web标签。key:value例如:上面设置的是web:web tolerations: - key: "web" #这里是taint key名称 web operator: "Equal" #匹配规则 value: "web" #这里是taint value值 web
- 创建状态
[root@k8s-master1 taint]# kubectl get pod -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-taint-68c7f46677-vk8xh 1/1 Running 0 6s 172.23.119.165 node-1 <none> <none>
注:在使用nodeSelector的时候不能在tolerations下设置effect 匹配Taint规则
- 在不使用nodeSelector指定标签。创建示例:
apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx-taint name: nginx-taint spec: replicas: 1 selector: matchLabels: app: nginx-taint template: metadata: labels: app: nginx-taint spec: containers: - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12-alpine name: nginx-taint tolerations: - key: "web" operator: "Equal" value: "web" effect: "NoExecute" #指定Taint 污点规则
- 创建状态
[root@k8s-master1 taint]# kubectl get pod -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-taint-667d7688dd-mlhcd 1/1 Running 0 9s 172.24.247.48 node-2 <none> <none>
注:在没有使用nodeSelector 指定标签的时候,创建的容器部署到了其它节点上面
二、内置污点
➢ node.kubernetes.io/not-ready:节点未准备好,相当于节点状态Ready的值为False。
➢ node.kubernetes.io/unreachable:Node Controller访问不到节点,相当于节点状态Ready的值为Unknown。
➢node.kubernetes.io/out-of-disk:节点磁盘耗尽。
➢ node.kubernetes.io/memory-pressure:节点存在内存压力。
➢ node.kubernetes.io/disk-pressure:节点存在磁盘压力。
➢ node.kubernetes.io/network-unavailable:节点网络不可达。
➢ node.kubernetes.io/unschedulable:节点不可调度。
➢ node.cloudprovider.kubernetes.io/uninitialized:如果Kubelet启动时指定了一个外部的cloudprovider,它
apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx-taint name: nginx-taint spec: replicas: 1 selector: matchLabels: app: nginx-taint template: metadata: labels: app: nginx-taint spec: containers: - image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx:1.15.12-alpine name: nginx-taint nodeSelector: web: "web" tolerations: - key: "web" operator: "Equal" value: "web" - effect: NoExecute key: node.kubernetes.io/unreachable #设置的是内置污点 operator: Exists #设置的tolerations不完全匹配规则 tolerationSeconds: 10 #节点不健康,10秒以后迁移该节点 - effect: NoExecute #指定Taint污点规则 key: node.kubernetes.io/not-ready #内置污点规则 operator: Exists tolerationSeconds: 10 #节点状态为NotReady 10秒以后迁移
注:在设置nodeSelector指定节点部署容器的时候。节点宕机后其它节点要有相同的标签key和value如果不相同
或没有迁移后会一直处于Pending状态
2-2、查看节点机器宕机后迁移状态
[root@k8s-master1 taint]# kubectl get pod -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-taint-5f69bb844-8mq54 1/1 Terminating 0 11m 172.23.119.167 node-1 <none> <none> nginx-taint-5f69bb844-khrmt 1/1 Running 0 5m3s 172.24.247.49 node-2 <none> <none> taint-nginx-6bfcd7dff-wx768 1/1 Terminating 0 14m 172.23.119.166 node-1 <none> <none> taint-nginx-6bfcd7dff-zttzj 1/1 Running 0 13s 172.24.247.50 node-2 <none> <none>
注:从上面状态可以看出设置了内置污点10秒健康检查很快进行了迁移,另一个容器没有设置使用默认时间(300秒)等很长时间进行迁移。
Terminating状态会在该节点启动会自动去除
三、Taint 常用命令
#创建一个污点(一个节点可以有多个污点): kubectl taint nodes NODE_NAME TAINT_KEY=TAINT_VALUE:EFFECT #示例: kubectl taint nodes k8s-node01 ssd=true:PreferNoSchedule #查看一个节点的污点: kubectl get node k8s-node01 -o go-template --template {{.spec.taints}} kubectl describe node k8s-node01 | grep Taints -A 10 #删除污点(和label类似): 基于Key删除: kubectl taint nodes k8s-node01 ssd- 基于Key+Effect删除: kubectl taint nodes k8s-node01 ssd:PreferNoSchedule- #修改污点(Key和Effect相同): kubectl taint nodes k8s-node01 ssd=true:PreferNoSchedule --overwrite