目录
一、污点(Taint)
1.1.什么是污点
节点亲和性让 Pod 倾向或强制部署在特定节点上,而 Taint 则是节点用来拒绝不兼容 Pod 的机制。每个节点可设多个 Taint,拒绝不容忍这些 Taint 的 Pod 接入。通过 kubectl taint 命令可以给 Node 添加污点限制,Node 被设置上污点之后就和 Pod 之间存在了一种相斥的关系,可以让 Node 拒绝 Pod 的调度执行,甚至将 Node 已经存在的 Pod 驱逐出去。
污点的组成格式为:key=value:effect。每个污点有一个 key 和 value 作为污点的标签,其中 value 可以为空,effect 描述污点的作用。
1.2.taint effect 支持的选项
NoSchedule:表示 k8s 不会将 Pod 调度到具有该污点的 Node 上;
PreferNoSchedule:表示 k8s 将尽量避免将 Pod 调度到具有该污点的 Node 上;
NoExecute:表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上,同时会将 Node 上已经存在的 Pod 驱逐出去。
master 就是因为有 NoSchedule 污点,k8s 才不会将 Pod 调度到 master 节点上:
[root@master01 ~]# kubectl describe node master | grep -i taints
Taints: node-role.kubernetes.io/master:NoSchedule
1.3.污点相关操作
1.3.1.设置污点
格式:
kubectl taint node node名字 key1=value1:NoSchedule
① 创建副本 yaml 文件
[root@master01 data]#vim pod01.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: pod-nginx
spec:
replicas: 3
selector:
matchLabels:
pod: nginx
template:
metadata:
labels:
pod: nginx
spec:
containers:
- name: nginx
image: nginx:1.14
ports:
- containerPort: 80
② 给 node01 设置污点
[root@master01 data]# kubectl taint node node01 w=d:NoSchedule
node/node01 tainted
③ 启动 pod,并查看 pod 详情信息
[root@master01 data]# kubectl apply -f pod1.yaml
deployment.apps/pod-nginx created
[root@master01 data]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-nginx-76c6c5b65-296dl 1/1 Running 0 69s 10.244.2.18 node02 <none> <none>
pod-nginx-76c6c5b65-jhqt2 1/1 Running 0 69s 10.244.2.20 node02 <none> <none>
pod-nginx-76c6c5b65-kqbc2 1/1 Running 0 69s 10.244.2.19 node02 <none> <none>
由于 node01 节点设置了污点,所以 k8s 不会将 Pod 调度到该节点上。
④ 节点说明,查找 Taints 字段
格式:
kubectl describe node node名字
[root@master01 data]# kubectl describe node node01 | grep -i taints
Taints: w=d:NoSchedule
1.3.2 去除污点
格式:
kubectl taint node node名字 key1:NoSchedule-
① 去除 node01 节点污点
[root@master01 data]# kubectl taint node node01 w:NoSchedule-
node/node01 untainted
[root@master01 data]# kubectl describe node node01 | grep -i taint
Taints: <none>
② 查看 pod 详情信息
[root@master01 data]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-nginx-76c6c5b65-296dl 1/1 Running 0 10m 10.244.2.18 node02 <none> <none>
pod-nginx-76c6c5b65-jhqt2 1/1 Running 0 10m 10.244.2.20 node02 <none> <none>
pod-nginx-76c6c5b65-kqbc2 1/1 Running 0 10m 10.244.2.19 node02 <none> <none>
③ 设置 node02 节点污点,添加 NoExecute 选项
[root@master01 data]# kubectl taint node node02 fql=b:NoExecute
node/node02 tainted
④ 持续查看 pod 详情信息