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

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

概览

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

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

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

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

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

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

在 GKE on VMware 中设置节点污点的优势

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

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

设置节点污点

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

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

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

在新的节点池中设置污点

控制台

  1. 在 Google Cloud 控制台中,进入 GKE Enterprise 集群页面。

    进入 GKE Enterprise 集群页面

  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 Cloud 控制台中,进入 GKE Enterprise 集群页面。

    进入 GKE Enterprise 集群页面

  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

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