管理节点污点
污点(Taint)能够使节点排斥某些特定的Pod,从而避免Pod调度到该节点上。
通过控制台管理节点污点
在CCE控制台上同样可以管理节点的污点,且可以批量操作。
- 登录CCE控制台,单击集群名称进入集群。
- 在集群控制台左侧导航栏中选择“节点管理”,切换至“节点”页签,勾选目标节点,并单击左上方“标签与污点管理”。
- 在弹出的窗口中,在“批量操作”下方单击“新增批量操作”,然后选择“添加/更新”或“删除”,选择“K8S 污点(Taints)”。
填写需要操作污点的“键”和“值”,选择污点的效果,单击“确定”。
图1 添加污点
- 污点添加成功后,再次进入该界面,在节点数据下可查看到已经添加的污点。
通过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则不受影响。
- 登录CCE控制台,单击集群名称进入集群。
- 在集群控制台左侧导航栏中选择“节点管理”,切换至“节点”页签。
- 在节点列表中找到目标节点,单击“更多 > 禁止调度”。
图2 禁止调度
- 在弹出的对话框中单击“是”,即可将节点设置为不可调度。
图3 确认设置不可调度
这个操作会给节点打上污点,使用kubectl可以查看污点的内容。
$ kubectl describe node 192.168.10.240 ... Taints: node.kubernetes.io/unschedulable:NoSchedule ...
- 在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"