# 管理节点污点
污点（Taint）能够使节点排斥某些特定的Pod，从而避免Pod调度到该节点上。
#### 通过控制台管理节点污点
在CCE控制台上同样可以管理节点的污点，且可以批量操作。
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在集群控制台左侧导航栏中选择"节点管理"，切换至"节点"页签，勾选目标节点，并单击左上方"标签与污点管理"。
3. 在弹出的窗口中，在"批量操作"下方单击"新增批量操作"，然后选择"添加/更新"或"删除"，选择"K8S 污点(Taints)"。 
   填写需要操作污点的"键"和"值"，选择污点的效果，单击"确定"。
   图1添加污点   
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001946666093.png "点击放大")
   
   
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控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在集群控制台左侧导航栏中选择"节点管理"，切换至"节点"页签。
3. 在节点列表中找到目标节点，单击"更多 \> 禁止调度"。 
   图2禁止调度   
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001915426604.png "点击放大")
   
   
4. 在弹出的对话框中单击"是"，即可将节点设置为不可调度。 
   图3确认设置不可调度   
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001915426672.png "点击放大")
   这个操作会给节点打上污点，使用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"
```
