用节点污点控制调度

本页面简要介绍 Google Kubernetes Engine 上的节点污点。当您安排工作负载以在集群上进行部署时,可使用节点污点来控制允许工作负载在哪些节点上运行。

概览

当您提交要在集群中运行的工作负载时,调度程序会确定要在何处放置与工作负载关联的 Pod。调度程序可以在任何满足 Pod 的 CPU、内存和自定义资源要求的节点上自由放置 Pod。

如果您的集群运行各种工作负载,您可能希望对特定节点池上可以运行哪些工作负载进行一些控制。

利用节点污点,您可以标记节点,以使调度程序避免或阻止将其用于某些 Pod。补充功能“容忍”可让您指定可在“有污点的”节点上使用的 Pod。

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

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

准备工作

请执行以下步骤为此任务做准备:

  • 确保您已启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 确保您已安装 Cloud SDK
  • 设置默认项目 ID
    gcloud config set project [PROJECT_ID]
  • 如果您使用的是地区级集群,请设置默认计算地区
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 如果您使用的是区域级集群,请设置默认计算区域
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud 更新到最新版本:
    gcloud components update

使用节点污点创建集群

创建集群时,您可以将节点污点分配给集群。此操作会将污点分配给使用集群创建的所有节点。

gcloud

要使用节点污点创建集群,请运行以下命令:

gcloud container clusters create [CLUSTER_NAME] --node-taints [KEY]=[VALUE]:[EFFECT]

其中:

  • [CLUSTER_NAME] 是要创建的集群的名称。
  • [EFFECT]PreferNoScheduleNoScheduleNoExecute
  • [KEY] 和 [VALUE] 形成与 [EFFECT] 关联的键值对。

例如,此命令会应用具有键 dedicated、值 experimental 和效果 PreferNoSchedule 的污点:

gcloud container clusters create example-cluster --node-taints dedicated=experimental:PreferNoSchedule

Console

要使用节点污点创建集群,请执行以下步骤:

  1. 访问 GCP Console 中的 Google Kubernetes Engine 菜单。

    访问 Google Kubernetes Engine 菜单

  2. 点击创建集群

  3. 根据需要配置集群。然后,针对要修改的节点池点击高级修改

  4. 节点污点部分中,点击添加污点

  5. 效果中,选择所需的效果。

  6. 使用所需的键值对填充

  7. 如果需要,添加其他节点污点。

  8. 点击保存以关闭高级修改叠加层。

  9. 点击创建

API

当您使用 API 创建集群时,请在 nodeConfig 下方添加 nodeTaints 字段。示例如下:

POST https://container.googleapis.com/v1/projects/[PROJECT_ID]/zones/[ZONE]/clusters

{
  'cluster': {
    'name': 'example-cluster',
    'nodeConfig': {
      'nodeTaints': [
        {
          'key': 'special',
          'Value': 'gpu',
          'effect': 'PreferNoSchedule'
        }
      ]
      ...
    }
    ...
  }
}

使用节点污点创建节点池

将污点应用于节点时,只允许容忍污点的 Pod 在节点上运行。在 GKE 集群中,您可以将污点应用于节点池,这会将污点应用于池中的所有节点。

要使用节点污点创建节点池,您可以使用 gcloud 命令行工具或 GKE API。

gcloud

要使用节点污点创建节点池,请运行以下命令:

gcloud container node-pools create [POOL_NAME] --cluster [CLUSTER_NAME] \
--node-taints [KEY]=[VALUE]:[EFFECT]

其中:

  • [POOL_NAME] 是要创建的节点池的名称。
  • [CLUSTER_NAME] 是在其中创建节点池的集群的名称。
  • [EFFECT]PreferNoScheduleNoScheduleNoExecute
  • [KEY] 和 [VALUE] 形成与 [EFFECT] 关联的键值对。

例如,此命令会应用具有键 dedicated、值 experimental 和效果 NoSchedule 的污点:

gcloud container node-pools create example-pool --cluster example-cluster \
--node-taints dedicated=experimental:NoSchedule

此命令会应用具有键 special、值 gpu 和效果 NoExecute 的污点:

gcloud container node-pools create example-pool-2 --cluster example-cluster \
--node-taints special=gpu:NoExecute

Console

要使用节点污点创建节点池,请执行以下步骤:

  1. 访问 GCP Console 中的 Google Kubernetes Engine 菜单。

    访问 Google Kubernetes Engine 菜单

  2. 点击集群的“修改”按钮(看起来像一支铅笔)。

  3. 节点池中,点击添加节点池

  4. 节点污点部分中,点击添加污点

  5. 效果中,选择所需的效果。

  6. 使用所需的键值对填充

  7. 如果需要,添加更多节点污点。

  8. 点击保存以退出节点池修改叠加层。

  9. 点击创建

API

当您使用 API 创建节点池时,请在 nodeConfig 下方添加 nodeTaints 字段。示例如下:

POST https://container.googleapis.com/v1/projects/[PROJECT_ID]/zones/[ZONE]/clusters/[CLUSTER_ID]/nodePools

{
  'nodePool': {
    'name': 'example-pool',
    'nodeConfig': {
      'nodeTaints': [
        {
          'key': 'dedicated',
          'Value': 'experimental',
          'effect': 'NoSchedule'
        }
      ]
      ...
    }
    ...
  }
}

配置 Pod 以容忍污点

要配置 Pod 以容忍污点,您可以在 Pod 的规范中加入 tolerations 字段。以下是 Pod 规范的一部分。

此 Pod 可以安排在具有污点 dedicated=experimental:NoSchedule 的节点上:

tolerations:
- key: dedicated
  operator: Equal
  value: experimental
  effect: NoSchedule

向现有节点添加污点

您可以使用 kubectl taint 命令向现有节点添加污点:

kubectl taint nodes [NODE_NAME] [KEY]=[VALUE]:[EFFECT]

例如:

kubectl taint nodes node1 key=value:NoSchedule

您还可以向具有特定标签的节点添加污点:

kubectl taint node -l myLabel=X dedicated=foo:PreferNoSchedule

如需了解详情,请参阅 Kubernetes 文档中的污点和容忍

检查节点的污点

要查看节点的污点,可以使用 kubectl 命令行工具。

首先,要获取集群中所有节点的列表,请运行以下命令:

kubectl get nodes

然后,要检查一个节点,请运行以下命令:

kubectl describe node [NODE_NAME]

在返回的节点说明中,查找 Taints 字段:

Taints: [KEY]=[VALUE]:[EFFECT]

从节点中移除污点

您可以使用 kubectl taint 移除污点,也可以通过键、键值对或键效果对移除污点。

例如,以下命令会从节点 foo 中移除所有具有键 dedicated 的污点:

kubectl taint nodes foo dedicated-

使用节点污点的优点

与使用 kubectl 手动设置污点相比,使用节点污点有几个优点:

  • 重启或替换节点时会保留污点。
  • 将节点添加到节点池或集群时会自动创建污点。
  • 在集群自动扩缩期间会自动创建污点。

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Kubernetes Engine 文档