赞
踩
目录
Taint 和 toleration 相互配合,可以用来避免 pod 被分配到不合适的节点上。每个节点上都可以应用一个或多个 taint ,这表示对于那些不能容忍这些 taint 的 pod,是不会被该节点接受的。如果将 toleration 应用于 pod 上,则表示这些 pod 可以(但不要求)被调度到具有匹配 taint 的节点上。
使用 `kubectl taint` 命令可以给某个 Node 节点设置污点,Node 被设置上污点之后就和 Pod 之间存在了一种相斥的关系,可以让 Node 拒绝 Pod 的调度执行,甚至将 Node 已经存在的 Pod 驱逐出去
key=value:effect
每个污点有一个 key 和 value 作为污点的标签,其中 value 可以为空,effect 描述污点的作用。当前 taint effect 支持如下三个选项:
- NoSchedule:表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上
-
- PreferNoSchedule:表示 k8s 将尽量避免将 Pod 调度到具有该污点的 Node 上
-
- NoExecute:表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上,同时会将 Node 上已经存在的 Pod 驱逐出去。
- kubectl taint nodes node1 key1=value1:NoSchedule
- # 设置污点
-
- kubectl describe node node-name
- # 节点说明中,查找 Taints 字段
-
- kubectl taint nodes node1 key1:NoSchedule-
- # 去除污点
- kubectl describe node k8s-master01
- #主节点自带污点,所以master节点不能被调度

- kubectl taint node k8s-master01 node-role.kubernetes.io/master=:NoSchedule-
- #取消master节点的污点
-
- kubectl describe node k8s-master01
- #查看污点已被删除
-
- kubectl create deployment taint_deploy --image=nginx:latest
- #创建名为taint_deploy的deployment,使用nginx:latest作为pod内容器创建的镜像。
-
- kubectl scale deployment taint_deploy --replicas=20
- #设置刚刚创建的deployment的pod副本数为20
-
- kubectl get pod -o wide
- #观察刚刚创建的pod,因为取消了master节点的污点,所以pod可以被调度到master节点运行了
- #master节点没有污点的情况下,运行daemonset,master节点也会运行一个daemonset。
设置了污点的 Node 将根据 taint 的 effect:NoSchedule、PreferNoSchedule、NoExecute 和 Pod 之间产生互斥的关系,Pod 将在一定程度上不会被调度到 Node 上。 但我们可以在 Pod 上设置容忍 ( Toleration ) ,意思是设置了容忍的 Pod 将可以容忍污点的存在,可以被调度到存在污点的 Node 上。
pod.spec.tolerations
- tolerations: #容忍
-
- 第一种方案:
- - key: "key1" #指定污点的key1
- operator: "Equal" #运算符等于
- value: "value1" #value是污点value1
- effect: "NoSchedule" #策略是NoSchedule
- #这种写法的含义是key,value,effect必须全部匹配,有一个不一样都匹配不到。
-
- 第二种方案:
- - key: "key1"
- operator: "Equal"
- value: "value1"
- effect: "NoExecute"
- tolerationSeconds: 3600 #容忍3600秒
-
- 第三种方案:
- - key: "key2" #只要匹配到key和dffect,value是什么无所谓。
- operator: "Exists"
- effect: "NoSchedule"

例:
- Ⅰ、当不指定 key 值时,表示容忍所有的污点 key:**
- tolerations:
- - operator: "Exists" #只写一个存在,只要有污点,就能容忍
-
- Ⅱ、当不指定 effect 值时,表示容忍所有的污点作用**
- tolerations:
- - key: "key"
- operator: "Exists" #只要key匹配到了,其他的无所谓
-
- Ⅲ、有多个 Master 存在时,防止资源浪费,可以如下设置
- kubectl taint nodes Node-Name node-role.kubernetes.io/master=:PreferNoSchedule
- kubectl taint node k8s-master01 node-role.kibernetes.io/master=:NoSchedule
- #将主节点的污点恢复回来
-
- kubectl get daemonset -n kube-system
- #查看有哪些daemonset资源
-
- kubectl get daemonset -n kube-system calico-node -o yaml
- #查看calico的容忍
- #策略NoSchedule,运算符Exists(存在),key和value无所谓
- #value和策略无所谓
- #还能容忍NoExecute策略的,value和key无所谓

- kubectl describe node k8s-master01
- #查询master节点的key
-
- vim tolerations_daemonset.yaml
-
- apiVersion: apps/v1
- kind: DaemonSet
- metadata:
- name: tolerations-daemonset
- labels:
- app: daemonset
- spec:
- selector:
- matchLabels:
- name: tolerations-daemonset-pod
- template:
- metadata:
- labels:
- name: tolerations-daemonset-pod
- spec:
- tolerations:
- - key: "node-role.kubernetes.io/master" #master节点的污点的key。
- operator: "Exists" #匹配规则为exists,存在key就容忍。
- containers:
- - name: tolerations-daemonset-pod
- image: nginx:latest
- imagePullPolicy: IfNotPresent
-
- kubectl apply -f tolerations_daemonset.yaml
-
- kubectl get daemonset
- #查看创建的daemonset
-
- kubectl get pod -o wide
- #查看daemonset的pod是否调度在master上。

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。