容忍和污点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,它

   将给当前节点添加一个Taint将其标记为不可用。在cloud-controller-manager的一个controller初始化这个
   节点后,Kubelet将删除这个Taint。
  
  2-1、节点宕机快速恢复示例:
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

  

posted @ 2023-02-21 22:05  点点滴滴的努力  阅读(162)  评论(0)    收藏  举报