

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 方案：防止在特定节点上调度容器组（pod）
<a name="node-taints-managed-node-groups"></a>

## 概览
<a name="_overview"></a>

具有专用处理器（例如 GPU）的节点运行成本可能比在标准计算机上的节点更昂贵。为防止这些节点被不需要专用硬件的工作负载占用，您可以使用 Kubernetes 污点。污点会将节点标记为排斥容差不匹配的容器组（pod），从而确保仅调度兼容的工作负载。有关更多信息，请参阅 Kubernetes 文档中的 [Taints and Tolerations](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/)。

可以使用 AWS 管理控制台 或通过 Amazon EKS API，将 Kubernetes 节点污点应用于新的和现有的托管节点组。此方案展示了如何使用 AWS CLI 对 Amazon EKS 托管节点组应用污点。有关使用 AWS 管理控制台 创建带有污点的节点组的信息，请参见 [为集群创建托管式节点组](create-managed-node-group.md)。

## 先决条件
<a name="_prerequisites"></a>
+ [现有 Amazon EKS 集群](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html)。
+  [AWS CLI 已安装并配置](https://docs.aws.amazon.com/eks/latest/userguide/setting-up.html)适当的权限。

## 步数
<a name="_steps"></a>

### 步骤 1：创建带污点的节点组
<a name="_step_1_create_a_node_group_with_taints"></a>

使用 `aws eks create-nodegroup` 命令创建带污点的新托管节点组。此示例应用了一个键为 `dedicated`、值为 `gpuGroup`、效果为 `NO_SCHEDULE` 的污点。

```
aws eks create-nodegroup \
 --cli-input-json '
{
  "clusterName": "my-cluster",
  "nodegroupName": "node-taints-example",
  "subnets": [
     "subnet-1234567890abcdef0",
     "subnet-abcdef01234567890",
     "subnet-021345abcdef67890"
   ],
  "nodeRole": "arn:aws:iam::111122223333:role/AmazonEKSNodeRole",
  "taints": [
     {
         "key": "dedicated",
         "value": "gpuGroup",
         "effect": "NO_SCHEDULE"
     }
   ]
}'
```

有关更多信息和示例，请参阅 Kubernetes 参考文档中的 [taint](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#taint)。

### 步骤 2：更新现有节点组上的污点
<a name="_step_2_update_taints_on_an_existing_node_group"></a>

使用 [aws eks update-nodegroup-config](https://docs.aws.amazon.com/cli/latest/reference/eks/update-nodegroup-config.html) AWS CLI 命令为托管节点组添加、删除或替换污点。

```
aws eks update-nodegroup-config
  --cluster-name my-cluster
  --nodegroup-name node-taints-example
  --taints 'removeTaints=[{key=dedicated,value=gpuGroup,effect=NO_SCHEDULE}]'
```

## 备注
<a name="_notes"></a>
+ 创建节点组后，可以使用 `UpdateNodegroupConfig` API 更新污点。
+ 污点键必须以字母或数字开头。可以包含字母、数字、连字符（`-`）、句点（`.`）和下划线（`_`）。最长可为 63 个字符
+ 污点键也可以以 DNS 子域前缀和单个 `/` 开头。如果它以 DNS 子域前缀开头，则长度可以为 253 个字符。
+ 值是可选的，必须以字母或数字开头。可以包含字母、数字、连字符（`-`）、句点（`.`）和下划线（`_`）。最长可为 63 个字符
+ 直接使用 Kubernetes 或 AWS 管理控制台 时，污点效果必须为 `NoSchedule`、`PreferNoSchedule` 或 `NoExecute`。但是，使用 AWS CLI 或 API 时，污点效果必须是 `NO_SCHEDULE`、`PREFER_NO_SCHEDULE` 或 `NO_EXECUTE`。
+ 每个节点组最多允许 50 个污点。
+ 如果从节点中手动删除使用托管节点组创建的污点，则 Amazon EKS 不会将污点重新添加回该节点。即使在托管节点组配置中指定了污点，也是如此。