在 Kubernetes 中,节点(Node)的“污点”(Taint)是一种机制,用于防止某些 Pod 被调度到特定的节点上。污点可以让节点排斥某些类型的 Pod,除非这些 Pod 明确声明它们可以容忍(Toleration)这些污点。

设置节点污点

在 K3s(Kubernetes 的轻量级发行版)中,设置节点污点的方法与其他 Kubernetes 发行版相同。以下是如何在 K3s 中为节点设置污点的步骤:

1. 查看节点列表

首先,你需要知道要设置污点的节点名称。可以使用以下命令查看节点列表:

kubectl get nodes

2. 设置污点

使用 kubectl taint 命令为节点添加污点。基本语法如下:

kubectl taint nodes <node-name> <key>=<value>:<effect>

其中:

  • <node-name> 是节点的名称。
  • <key> 是污点的键。
  • <value> 是污点的值(可以为空)。
  • <effect> 是污点的效果,可以是 NoSchedulePreferNoScheduleNoExecute

例如,假设你要为名为 node1 的节点设置一个名为 example.com/diskfull 的污点,效果为 NoSchedule

kubectl taint nodes node1 example.com/diskfull:NoSchedule
kubectl taint nodes a2200 k83.cn/master:NoSchedule

这条命令的意思是,任何没有明确声明容忍 example.com/diskfull 污点的 Pod 都不会被调度到 node1 上。

3. 检查节点状态

设置完污点后,可以使用以下命令查看节点的状态:

kubectl describe node node1

在描述信息中,你会看到类似于以下的输出,表示污点已经成功设置:

Taints:             example.com/diskfull:NoSchedule

移除节点污点

如果你想要移除节点上的污点,可以使用以下命令:

kubectl taint nodes node1 example.com/diskfull-
kubectl taint nodes a2200 k83.cn/master-

这里的 - 表示移除对应的污点。

示例:设置多个污点

如果你需要为节点设置多个污点,可以多次使用 kubectl taint 命令,或者一次设置多个污点:

kubectl taint nodes node1 example.com/diskfull:NoSchedule example.com/memorypressure:NoSchedule

示例:Pod 容忍污点

为了让 Pod 能够容忍节点上的污点,需要在 Pod 的定义中添加 tolerations 字段。例如:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  tolerations:
  - key: "example.com/diskfull"
    operator: "Equal"
    value: ""
    effect: "NoSchedule"
  containers:
  - name: my-container
    image: nginx

在这个例子中,Pod 明确声明它可以容忍 example.com/diskfull 污点,因此它可以被调度到设置了相应污点的节点上。

总结

通过为节点设置污点,你可以灵活地控制哪些 Pod 可以被调度到特定节点上。这对于管理资源分配、隔离环境或处理特定硬件条件下的任务非常有用。