更新时间:2024-12-04 GMT+08:00

管理节点污点(Taint)

污点(Taint)能够使节点排斥某些特定的Pod,从而避免Pod调度到该节点上。

通过控制台管理节点污点

在CCE控制台上同样可以管理节点的污点,且可以批量操作。

  1. 登录CCE控制台,单击集群名称进入集群。
  2. 在集群控制台左侧导航栏中选择“节点管理”,切换至“节点”页签,勾选目标节点,并单击左上方“标签与污点管理”
  3. 在弹出的窗口中,在“批量操作”下方单击“新增批量操作”,然后选择“添加/更新”“删除”,选择“污点(Taints)”

    填写需要操作污点的“键”和“值”,选择污点的效果,单击“确定”。

  4. 污点添加成功后,再次进入该界面,在节点数据下可查看到已经添加的污点。

通过kubectl命令管理污点

节点污点是与“效果”相关联的键值对。以下是可用的效果:

  • NoSchedule:不能容忍此污点的 Pod 不会被调度到节点上;现有 Pod 不会从节点中逐出。
  • PreferNoSchedule:Kubernetes 会尽量避免将不能容忍此污点的 Pod 安排到节点上。
  • NoExecute:如果 Pod 已在节点上运行,则会将该 Pod 从节点中逐出;如果尚未在节点上运行,则不会将其安排到节点上。

使用 kubectl taint node nodename 命令可以给节点增加污点,如下所示。

$ kubectl get node
NAME             STATUS   ROLES    AGE    VERSION
192.168.10.170   Ready    <none>   73d    v1.19.8-r1-CCE21.4.1.B003
192.168.10.240   Ready    <none>   4h8m   v1.19.8-r1-CCE21.6.1.2.B001
$ kubectl taint node 192.168.10.240 key1=value1:NoSchedule
node/192.168.10.240 tainted

通过describe命名和get命令可以查看到污点的配置。

$ kubectl describe node 192.168.10.240
Name:               192.168.10.240
...
Taints:             key1=value1:NoSchedule
...
$ kubectl get node 192.168.10.240 -oyaml
apiVersion: v1
...
spec:
  providerID: 06a5ea3a-0482-11ec-8e1a-0255ac101dc2
  taints:
  - effect: NoSchedule
    key: key1
    value: value1
...

去除污点可以在增加污点命令的基础上,在最后加一个“-”,如下所示。

$ kubectl taint node 192.168.10.240 key1=value1:NoSchedule-
node/192.168.10.240 untainted
$ kubectl describe node 192.168.10.240
Name:               192.168.10.240
...
Taints:             <none>
...

一键设置节点调度策略

您可以通过控制台将节点设置为不可调度,系统会为该节点添加键为node.kubernetes.io/unschedulable,效果为NoSchedule的污点。节点设置为不可调度后,新的Pod将无法调度至该节点,节点上已运行的Pod则不受影响。

  1. 登录CCE控制台,单击集群名称进入集群。
  2. 在集群控制台左侧导航栏中选择“节点管理”,切换至“节点”页签。
  3. 在节点列表中找到目标节点,单击“更多 > 禁止调度
  4. 在弹出的对话框中单击“是”,即可将节点设置为不可调度

    这个操作会给节点打上污点,使用kubectl可以查看污点的内容。

    $ kubectl describe node 192.168.10.240
    ...
    Taints:             node.kubernetes.io/unschedulable:NoSchedule
    ...

  5. 在CCE控制台相同位置再次设置,单击“更多 > 开启调度。即可去除污点,将节点设置为可调度。

系统污点说明

当节点出现某些问题时,Kubernetes会自动给节点添加一个污点,当前内置的污点包括:

  • node.kubernetes.io/not-ready:节点未准备好。这相当于节点状况 Ready 的值为 "False"。
  • node.kubernetes.io/unreachable:节点控制器访问不到节点。这相当于节点状况 Ready 的值为 "Unknown"。
  • node.kubernetes.io/memory-pressure:节点存在内存压力。
  • node.kubernetes.io/disk-pressure:节点存在磁盘压力。
  • node.kubernetes.io/pid-pressure:节点存在 PID 压力。
  • node.kubernetes.io/network-unavailable:节点网络不可用。
  • node.kubernetes.io/unschedulable:节点不可调度。
  • node.cloudprovider.kubernetes.io/uninitialized:如果 kubelet 启动时指定了一个“外部”云平台驱动, 它将给当前节点添加一个污点将其标志为不可用。在 cloud-controller-manager 的一个控制器初始化这个节点后,kubelet 将删除这个污点。

相关操作:容忍度(Toleration)

容忍度应用于Pod上,允许(但并不要求)Pod 调度到带有与之匹配的污点的节点上。

污点和容忍度相互配合,可以用来避免 Pod 被分配到不合适的节点上。 每个节点上都可以应用一个或多个污点,这表示对于那些不能容忍这些污点的 Pod,是不会被该节点接受的。

在 Pod 中设置容忍度示例如下:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  tolerations:
  - key: "key1"
    operator: "Equal"
    value: "value1"
    effect: "NoSchedule"  

上面示例表示这个Pod容忍标签为key1=value1,效果为NoSchedule的污点,所以这个Pod能够调度到对应的节点上。

同样还可以按如下方式写,表示当节点有key1这个污点时,可以调度到节点。

tolerations:
- key: "key1"
  operator: "Exists"
  effect: "NoSchedule"