使用污点和容忍设置来控制调度

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

概览

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

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

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

污点和容忍协同工作,确保 Pod 不会被调度到不当的节点上。

污点是与“效果”相关联的键值对。下表列出了可用的变量效果:

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

在 Google Distributed Cloud 中设置节点污点的优势

虽然您可以使用 kubectl taint 命令设置节点污点,但相比使用 kubectl,使用 gkectl 或 Google Cloud 控制台设置节点污点具有以下优势:

  • 重启或替换节点时会保留污点。
  • 将节点添加到节点池时,系统会自动创建污点。
  • 使用 gkectl 添加污点时,系统会在集群自动扩缩期间自动创建污点。(自动扩缩功能目前不支持在 Google Cloud 控制台中创建的节点池。)

设置节点污点

您可以在创建用户集群时或者在创建集群后,在节点池中设置节点污点。本部分介绍如何向已创建的集群添加污点,但该过程与创建新集群时添加污点的过程类似。

您可以添加新的节点池并设置污点,也可以更新现有节点池并设置污点。在添加其他节点池之前,请验证集群上是否有足够的可用 IP 地址

如果您在 Google Cloud 控制台中创建了集群,则可以使用 Google Cloud 控制台添加或更新节点池。

在新的节点池中设置污点

控制台

  1. 在控制台中,进入 Google Kubernetes Engine 集群概览页面。

    转到 GKE 集群

  2. 选择用户集群所在的 Google Cloud 项目。

  3. 在集群列表中,点击集群的名称,然后点击详细信息面板中的查看详细信息

  4. 点击添加节点池

  5. 配置节点池:

    1. 输入节点池名称
    2. 输入池中每个节点的 vCPUs 数量(每个用户集群工作器最少 4 个)。
    3. 输入池中每个节点的内存大小(以兆字节 (MiB) 为单位,每个用户集群工作器节点最少 8192 MiB,并且必须是 4 的倍数)。
    4. 副本字段中,输入池中的节点数(最少 3 个)。
    5. 选择操作系统映像类型Ubuntu ContainerdCOS

    6. 输入启动磁盘大小(以吉比字节 (GiB) 为单位,默认值为 40 GiB)。

  6. 节点池元数据(可选)部分中,点击 + 添加污点。输入污点的效果。根据需要重复上述步骤。

  7. (可选)点击 + 添加 Kubernetes 标签。输入标签的。根据需要重复上述步骤。

  8. 点击创建

  9. Google Cloud 控制台会显示集群状态:正在更改。点击显示详情,以查看资源状态条件状态消息

命令行

  1. 用户集群配置文件中,填写 nodePools 部分。

    您必须指定以下字段:

    • nodePools.[i].name
    • nodePools[i].cpus
    • nodePools.[i].memoryMB
    • nodePools.[i].replicas

    以下字段是可选的。如果您未添加 nodePools[i].bootDiskSizeGBnodePools[i].osImageType,则系统会使用默认值。

  2. 请填写 nodePools[i].taints 部分。例如:

    nodePools:
    - name: "my-node-pool"
      taints:
      - key: "staging"
        value: "true"
        effect: "NoSchedule"
    
  3. (可选)填写以下部分:

    • nodePools[i].labels
    • nodePools[i].bootDiskSizeGB
    • nodePools[i].osImageType
    • nodePools[i].vsphere.datastore
    • nodePools[i].vsphere.tags
  4. 运行以下命令:

    gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG
    

    替换以下内容:

    • [ADMIN_CLUSTER_KUBECONFIG] 替换为管理员集群的 kubeconfig 文件的路径。

    • [USER_CLUSTER_CONFIG] 替换为用户集群配置文件的路径。

在现有节点池中设置污点

控制台

  1. 在控制台中,进入 Google Kubernetes Engine 集群概览页面。

    转到 GKE 集群

  2. 选择用户集群所在的 Google Cloud 项目。

  3. 在集群列表中,点击集群的名称,然后点击详细信息面板中的查看详细信息

  4. 点击节点标签页。

  5. 点击要修改的节点池的名称。

  6. 点击节点池元数据(可选)旁边的 修改,然后点击 + 添加污点。输入污点的效果。根据需要重复上述步骤。

  7. 点击完成

  8. 点击 以返回到上一页。

  9. Google Cloud 控制台会显示集群状态:正在更改。点击显示详情,以查看资源状态条件状态消息

命令行

  1. 用户集群配置文件中,找到要更新的节点池的 nodePools 部分。

  2. 请填写 nodePools[i].taints。例如:

    nodePools:
    - name: "my-node-pool"
      taints:
      - key: "staging"
        value: "true"
        effect: "NoSchedule"
    
  3. 运行以下命令:

    gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG
    

    替换以下内容:

    • [ADMIN_CLUSTER_KUBECONFIG] 替换为管理员集群的 kubeconfig 文件的路径。

    • [USER_CLUSTER_CONFIG] 替换为用户集群配置文件的路径。

配置 Pod 以容忍污点

要配置 Pod 以容忍污点,您可以在 Pod 的规范中加入 tolerations 字段。在以下示例中,Pod 可以安排在具有 dedicated=experimental:NoSchedule 污点的节点上:

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

如需了解其他示例,请参阅污点和容忍设置