1. Taint和Toleration
- 节点亲和性,是pod的一种属性(偏好或硬性要求),它使pod被吸引到一类特定的节点。
Taint
则相反,它使节点能够排斥一类特定的pod。 Taint
和Toleration
相互配合,可以用来避免pod被分配到不合适的节点上。每个节点上都可以应用一个或多个taint
,这表示对于那些不能容忍这些taint的pod,是不会被该节点接爱的。如果将toleration
应用于pod上,则表示这些pod可以(但不要求)被调度到具有匹配taint
的节点上
2. 污点(Taint)
2.1. 污点(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驱逐出去
2.2. 污点的设置、查看和去除
//设置污点:
[root@master1 scheduler]# kubectl taint nodes node1 check=yangshuang:NoExecute ---在"node1"的节点上添加一个名为"check=yangshuang"的污点(taint),并指定该污点的效果为"NoExecute",即将污点节点上的Pod驱逐(Evict)
node/node1 tainted
//去除污点:
[root@master1 scheduler]# kubectl taint nodes node1 check=yangshuang:NoExecute-
node/node1 untainted
//去除master的污点
kubectl taint nodes --all node-role.kubernetes.io/master-
3. 容忍(Tolerations)
- 设置了污点的 Node将根据
taint
的effect: NoSchedule、PreferNoSchedule、 NoExecute
和Pod之间产生互斥的关系,Pod将在一定程度上不会被调度到Node上。但我们可以在Pod上设置容忍(Toleration
),意思是设置了容忍的Pod将可以容忍污点的存在,可以被调度到存在污点的Node上。
//在node1上添加污点:
[root@master1 scheduler]# kubectl taint nodes node1 check=yangshuang:NoExecute
vim node-affinity-pod-1.yaml
apiVersion: v1 #指定使用的Kubernetes API版本
kind: Pod #指定资源的类型,这里是Pod
metadata: #包含有关Pod元数据的信息,如名称和标签
name: my-nginx #指定pod的名称
labels: #Pod定义标签,用于标识和组织Pod
app: my-nginx
spec: #定义了Pod的规范
affinity: #指定节点亲和性配置
nodeAffinity: #定义节点亲和性规则
requiredDuringSchedulingIgnoredDuringExecution: #指定在调度过程中必须满足的节点亲和性规则
nodeSelectorTerms: #定义节点选择器的条件
- matchExpressions: #定义节点选择器的匹配表达式
- key: kubernetes.io/hostname #指定用于匹配的节点标签键
operator: In #指定匹配操作符。在此示例中,使用的是In,表示匹配具有指定值的节点
values: #指定要匹配的节点的值列表。在此示例中,匹配名为node1的节点,意思是在node1节点创建该pod
- node1
containers: #容器列表
- name: my-nginx #容器名称
image: nginx #容器使用的镜像
tolerations: #指定Pod容忍的规则
- key: check #指定用于匹配的标签的键
operator: Equal #指定匹配操作符
value: yangshuang #指定用于匹配的标签值
effect: NoExecute #指定容忍的效果,可以是NoSchedule、PreferNoSchedule或NoExecute
tolerationSeconds: 3600 #指定容忍的时间持续秒数
//创建pod
[root@master1 scheduler]# kubectl apply -f node-affinity-pod-1.yaml
pod/my-nginx created
//查看pod是否创建成功
[root@master1 scheduler]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-nginx 1/1 Running 0 9s 10.244.1.65 node1 <none> <none>
---可以看的出来pod在node1上创建的,这样就达到了容忍的效果。
-
其中
key、vaule、effect
要与Node上设置的taint
保持一致,如图所示:
-
operator
的值为Exists将会忽略value值 -
tolerationSeconds
用于描述当pod需要被驱逐时可以在Node上继续保留运行的时间 -
当不指定key值时,表示容忍所有污点key:
tolerations:
- operator: Exists
- 当不指定effect值时,表示容忍所有的污点作用
tolerations:
- key: key
operator: Exists