在 Kubernetes 中,节点(Node)的“污点”(Taint)是一种机制,用于防止某些 Pod 被调度到特定的节点上。污点可以让节点排斥某些类型的 Pod,除非这些 Pod 明确声明它们可以容忍(Toleration)这些污点。
在 K3s(Kubernetes 的轻量级发行版)中,设置节点污点的方法与其他 Kubernetes 发行版相同。以下是如何在 K3s 中为节点设置污点的步骤:
首先,你需要知道要设置污点的节点名称。可以使用以下命令查看节点列表:
kubectl get nodes
使用 kubectl taint
命令为节点添加污点。基本语法如下:
kubectl taint nodes <node-name> <key>=<value>:<effect>
其中:
<node-name>
是节点的名称。<key>
是污点的键。<value>
是污点的值(可以为空)。<effect>
是污点的效果,可以是 NoSchedule
、PreferNoSchedule
或 NoExecute
。例如,假设你要为名为 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
上。
设置完污点后,可以使用以下命令查看节点的状态:
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 的定义中添加 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 可以被调度到特定节点上。这对于管理资源分配、隔离环境或处理特定硬件条件下的任务非常有用。