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 需要被驱逐时才会记录。

污点的效果详解:

【k8s】:深入理解 Kubernetes 中的污点(Taints)与容忍度(Tolerations)-LMLPHP

【k8s】:深入理解 Kubernetes 中的污点(Taints)与容忍度(Tolerations)-LMLPHP

# 添加污点到节点
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

【k8s】:深入理解 Kubernetes 中的污点(Taints)与容忍度(Tolerations)-LMLPHP

例如:查看 kube-apiserver-k8s-master Pod 的详细信息

kubectl describe pod kube-apiserver-k8s-master

【k8s】:深入理解 Kubernetes 中的污点(Taints)与容忍度(Tolerations)-LMLPHP

【k8s】:深入理解 Kubernetes 中的污点(Taints)与容忍度(Tolerations)-LMLPHP

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

【k8s】:深入理解 Kubernetes 中的污点(Taints)与容忍度(Tolerations)-LMLPHP

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-

【k8s】:深入理解 Kubernetes 中的污点(Taints)与容忍度(Tolerations)-LMLPHP


04-16 17:03