【k8s】:深入理解 Kubernetes 中的污点(Taints)与容忍度(Tolerations)
1、污点(Taints)
污点是 Kubernetes 中节点的一个属性,它用于标记节点不接受哪些类型的 Pod。节点上的污点会阻止具有相同键值对的 Pod 被调度到该节点上。
1、查看节点(Node)资源对象的 spec.taints 字段的详细说明
kubectl explain node.spec.taints
污点包含以下几个关键属性:
1、Key(键): 污点的键,用于唯一标识污点。
2、Value(值): 污点的值,与键一起构成键值对,用于具体指定污点的类型。
3、Effect(效果): 污点的效果,表示当 Pod 与节点的污点匹配时所采取的行动。常见的效果包括:
- NoSchedule:阻止调度新的 Pod 到节点上。
- PreferNoSchedule:尽量避免调度新的 Pod 到节点上,但不是强制性的。
- NoExecute:将节点上已有的 Pod 驱逐出去,直到 Pod 满足对应的容忍度规则。
4、timeAdded: 表示污点(Taint)被添加的时间,这个字段只有在 NoExecute 类型的污点中才会被写入。这意味着它仅在节点上已经存在的 Pod 需要被驱逐时才会记录。
污点的效果详解:
# 添加污点到节点
kubectl taint nodes <node-name> <key>=<value>:<effect>
# 删除节点污点
kubectl taint nodes <node-name> key-
key- 表示要删除的污点的键。在键后面加上 -,以表示删除该键对应的污点。
# 查看节点的污点信息
kubectl describe nodes <node-name>
kubectl describe nodes k8s-master
例如:查看 kube-apiserver-k8s-master Pod 的详细信息
kubectl describe pod kube-apiserver-k8s-master
2、容忍度(Tolerations)
容忍度是 Pod 的一个属性,它允许 Pod 在调度时容忍具有指定污点的节点。通过为 Pod 添加容忍度,可以让 Pod 在特定类型的节点上运行。
# 在 Pod 的规范中添加容忍度
tolerations:
- key: <key>
operator: <operator>
value: <value>
effect: <effect>
tolerationSeconds: <seconds>
例如:
apiVersion: v1 # 指定 Kubernetes API 版本为 v1
kind: Pod # 定义资源类型为 Pod
metadata: # 元数据部分,包含 Pod 的名称等信息
name: special-pod # 指定 Pod 的名称为 special-pod
spec: # Pod 的规格部分,包含容器和容忍度等信息
containers: # 容器部分,定义 Pod 中的容器
- name: special-container # 容器的名称为 special-container
image: nginx # 容器使用的镜像为 nginx
tolerations: # 容忍度部分,定义 Pod 的容忍度
- key: special-node # 定义容忍度的键为 special-node
operator: Exists # 定义容忍度的操作符为 Exists,表示只要存在该键即可容忍
effect: NoSchedule # 定义容忍度的效果为 NoSchedule,表示节点上有特定污点时不会调度该 Pod
3、示例演示-测试污点的具体应用场景
3.1 给节点打污点,创建pod
1、不定义容忍度
1、使用 kubectl taint 命令来给节点打上污点。以下是具体的命令:
[root@k8s-master ~]# kubectl taint nodes k8s-node01 special-node=true:NoSchedule
node/k8s-node01 tainted
[root@k8s-master ~]#
## 为 k8s-node01 的节点打上一个名为 special-node 的污点,值为 true,效果为 NoSchedule,
## 即表示这个节点上的 Pod 将不会被调度,除非它们定义了对应的容忍度。
2、创建pod,不定义容忍度,yaml清单:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx-container
image: nginx
## 定义了一个简单的 Pod,其中包含一个名为 nginx-container 的容器,使用了 Nginx 的镜像。
## 由于没有定义任何容忍度,因此这个 Pod 将会尝试在集群中的任何节点上被调度。
3、更新资源文件
kubectl apply -f nginx-pod.yaml
4、查看pod
kubectl get pods -o wide
2、定义污点效果-设置排斥等级
1、删除前面创建的污点
kubectl taint nodes k8s-node01 special-node-
2、定义排斥等级,效果为 NoExecute
kubectl taint nodes k8s-node01 special-node=true:NoExecute
这意味着该节点上的 Pod 如果不满足容忍度条件,将会被驱逐(Evicted)。
3、定义容忍度
创建一个名为 nginx-pod 的 Pod,并定义容忍度以允许在带有 special-node=true:NoExecute 污点的节点上调度:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx-container
image: nginx
tolerations:
- key: special-node # 污点的键值
operator: Equal # 操作符,这里使用等于
value: "true" # 污点的值为 true
effect: NoExecute # 污点的效果为 NoExecute,即会驱逐不满足容忍度的 Pod
# 在spec 部分的 tolerations 字段中定义了容忍度,指定了对于带有 special-node=true:NoExecute 污点的节点的容忍度。
3.2 删除节点污点
要删除节点上的污点,使用 kubectl taint 命令,并指定 - 作为值。
# 删除 k8s-node01 的节点上名为 special-node 的污点。
kubectl taint nodes k8s-node01 special-node-