你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure Kubernetes 服务 (AKS) 群集中使用节点污点

本文介绍如何在 Azure Kubernetes 服务 (AKS) 群集中使用节点污点。

概述

AKS 计划机制负责将 Pod 放置在节点上,它基于上游 Kubernetes 计划程序 kube-scheduler。 可以通过使用节点相关性将 Pod 附加到一组节点,或者指示该节点使用节点污点(与 AKS 计划程序交互)来限制 pod 以在特定节点上运行。

节点污点的工作原理是标记节点,以便计划程序避免在标记的节点上放置某些 Pod。 可以在 Pod 上放置容忍,以允许计划程序在具有匹配污点的节点上计划该 Pod。 排斥和容忍协同工作,帮助你控制计划程序如何将 Pod 放置到节点上。 有关详细信息,请参阅污点和容忍的示例用例

污点是键值对,具有效果。 使用节点污点时,效果字段有三个值:NoExecuteNoSchedulePreferNoSchedule

  • NoExecute:如果 Pod 没有匹配的容忍,则会立即逐出节点上运行的 Pod。 如果 Pod 具有匹配的容忍,则如果指定了 tolerationSeconds,可能会将其逐出。
  • NoSchedule:在此节点上只放置具有匹配容忍的 Pod。 不会逐出现有 Pod。
  • PreferNoSchedule:计划程序会避免放置任何没有匹配容忍的 Pod。

节点污点选项

有两种类型的节点污点可以应用于 AKS 节点:节点污点节点初始化污点

  • 节点污点旨在永久保留在节点上,以便计划具有节点相关性的 Pod。 只能使用 AKS API 完全添加、更新或删除节点污点。
  • 节点初始化污点在启动时放置在节点上,旨在暂时使用,例如,在可能需要额外的时间来设置节点的情况下。 可以使用 Kubernetes API 删除节点初始化污点,这在节点生命周期内无法保证。 它们仅在节点纵向扩展或升级/重新映像后显示。 新节点在缩放后仍具有节点初始化污点。 升级后,节点初始化污点将显示在所有节点上。 如果要完全删除初始化污点,可以在使用 Kubernetes API 取消处理节点后使用 AKS API 删除它们。 使用 AKS API 从群集规格中删除初始化污点后,新创建的节点不会出现这些初始化污点。 如果现有节点上仍然存在初始化污点,可以通过执行节点映像升级操作来永久删除它。

注意

使用 AKS 节点池 API 应用的节点排斥和标签不能从 Kubernetes API 进行修改,反之亦然。 不允许修改系统污点。

这不适用于节点初始化污点。

使用节点污点

先决条件

本文假设你有现有 AKS 群集。 如果需要 AKS 群集,可以使用 Azure CLIAzure PowerShellAzure 门户 创建一个。

使用节点污点创建节点池

  1. 使用 az aks nodepool add 命令创建具有污点的节点池,并使用 --node-taints 参数为污点指定 sku=gpu:NoSchedule

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP_NAME \
        --cluster-name $CLUSTER_NAME \
        --name $NODE_POOL_NAME \
        --node-count 1 \
        --node-taints "sku=gpu:NoSchedule" \
        --no-wait
    
  2. 检查节点池的状态

  3. 检查节点上是否已设置污点

更新节点池以添加节点污点

  1. 更新节点池以使用 az aks nodepool update 命令添加节点污点,并使用 --node-taints 参数为污点指定 sku=gpu:NoSchedule

    az aks nodepool update \
        --resource-group $RESOURCE_GROUP_NAME \
        --cluster-name $CLUSTER_NAME \
        --name $NODE_POOL_NAME \
        --node-taints "sku=gpu:NoSchedule" \
        --no-wait
    
  2. 检查节点池的状态

  3. 检查节点上是否已设置污点

使用节点初始化污点(预览版)

重要

AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

先决条件和限制

  • 需要安装并配置 3.0.0b3 或更高版本的 Azure CLI 版本。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI
  • 在使用 AKS API 时,只能通过群集创建或升级来应用初始化污点。 如果使用 ARM 模板,可以在节点池创建和更新期间指定节点初始化污点。
  • 无法使用 Azure CLI 将初始化污点应用到 Windows 节点池。

获取群集的凭据

  • 使用 az aks get-credentials 命令获取 AKS 群集的凭据。

    az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME
    

安装 aks-preview Azure CLI 扩展

  • 使用 az extension addaz extension update 命令注册或更新 aks-preview 扩展。

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    

注册 NodeInitializationTaintsPreview 功能标志

  1. 使用 az feature register 命令注册 NodeInitializationTaintsPreview 功能标志。

    az feature register --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
    

    状态显示为“已注册”需要几分钟时间

  2. 使用 az feature show 命令验证注册状态。

    az feature show --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
    
  3. 当状态反映为已注册时,使用 az provider register 命令刷新 Microsoft.ContainerService 资源提供程序的注册。

    az provider register --namespace Microsoft.ContainerService
    

创建具有节点初始化污点的群集

  1. 使用 az aks create 命令和 --node-initialization-taints 参数为污点指定 sku=gpu:NoSchedule,创建具有节点初始化污点的群集。

    重要

    指定的节点初始化污点适用于群集中的所有节点池。 若要将初始化污点应用到特定节点,可以使用 ARM 模板而不是 CLI。

    az aks create \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $CLUSTER_NAME \
        --node-count 1 \
        --node-init-taints "sku=gpu:NoSchedule" \
        --generate-ssh-keys
    
  2. 检查节点池的状态

  3. 检查节点上是否已设置污点

更新群集以添加节点初始化污点

  1. 使用 az aks update 命令和 --node-initialization-taints 参数为污点指定 sku=gpu:NoSchedule,更新群集以创建添加节点初始化污点。

    重要

    使用节点初始化污点更新群集时,污点将应用于群集中的所有节点池。 可以在重置映像操作后查看节点上节点初始化污点的更新。

    az aks update \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-init-taints "sku=gpu:NoSchedule"
    
  2. 检查节点池的状态

  3. 检查节点上是否已设置污点

检查节点池的状态

  • 应用节点排斥或初始化污点后,请使用 az aks nodepool list 命令检查节点池的状态。

    az aks nodepool list --resource-group $RESOURCE_GROUP_NAME --cluster-name $CLUSTER_NAME
    

    如果应用了节点污点,以下示例输出显示 <node-pool-name> 节点池是具有指定 nodeTaintsCreating 节点:

    [
      {
        ...
        "count": 1,
        ...
        "name": "<node-pool-name>",
        "orchestratorVersion": "1.15.7",
        ...
        "provisioningState": "Creating",
        ...
        "nodeTaints":  [
          "sku=gpu:NoSchedule"
        ],
        ...
      },
     ...
    ]
    

    如果应用了节点初始化污点,以下示例输出显示 <node-pool-name> 节点池是具有指定 nodeInitializationTaintsCreating 节点池:

    [
      {
        ...
        "count": 1,
        ...
        "name": "<node-pool-name>",
        "orchestratorVersion": "1.15.7",
        ...
        "provisioningState": "Creating",
        ...
        "nodeInitializationTaints":  [
          "sku=gpu:NoSchedule"
        ],
        ...
      },
     ...
    ]
    

检查节点上是否已设置污点

  • 使用 kubectl describe node 命令检查节点配置中的节点污点和节点初始化污点。

    kubectl describe node $NODE_NAME
    

    如果应用了节点污点,以下示例输出显示具有指定的 Taints<node-pool-name> 节点池:

    [
        ...
        Name: <node-pool-name>
        ...
        Taints: sku=gpu:NoSchedule
        ...
        ],
        ...
     ...
    ]
    

删除节点污点

删除特定节点污点

  • 使用 az aks nodepool update 命令删除节点污点。 以下示例命令从节点池中删除 "sku=gpu:NoSchedule" 节点污点。

    az aks nodepool update \
    --cluster-name $CLUSTER_NAME \
    --name $NODE_POOL_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --node-taints "sku=gpu:NoSchedule"
    

删除所有节点污点

  • 使用 az aks nodepool update 命令从节点池中删除所有节点污点。 以下示例命令从节点池中删除所有节点污点。

    az aks nodepool update \
    --cluster-name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $NODE_POOL_NAME \
    --node-taints ""
    

删除节点初始化污点

可以使用以下选项从节点中删除节点初始化污点:

  • 使用 Kubernetes API 暂时删除节点初始化污点。 如果以这种方式删除它们,则会在节点缩放或升级后重新出现污点。 新节点在缩放后仍具有节点初始化污点。 升级后,节点初始化污点将显示在所有节点上。
  • 通过使用 Kubernetes API 取消初始化节点,然后使用 AKS API 删除污点,从而永久删除节点初始化污点。 使用 AKS API 从群集规范中删除初始化污点后,重新映像操作后新建的节点不再具有初始化污点。

从节点池副本中删除所有初始化排斥事件时,使用任何新的初始化污点升级后,现有初始化污点可能会重新出现。

暂时删除节点初始化污点

  • 使用 kubectl taint nodes 命令暂时删除节点初始化污点。

    此命令仅从指定的节点中删除污点。 如果要从节点池中的每个节点中删除污点,则需要针对要从中删除污点的每个节点运行该命令。

    kubectl taint nodes $NODE_POOL_NAME sku=gpu:NoSchedule-
    

    删除后,节点初始化污点会在节点缩放或升级后重新出现。

永久删除节点初始化污点

  1. 按照暂时删除节点初始化污点中的步骤,使用 Kubernetes API 删除节点初始化污点。

  2. 使用 az aks update 命令使用 AKS API 从节点中删除污点。 此命令从群集中的每个节点中删除节点初始化污点。

    az aks update \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-init-taints ""
    

检查是否已从节点中删除污点

  • 使用 kubectl describe node 命令检查节点配置中的节点污点和节点初始化污点。

    kubectl describe node $NODE_NAME
    

    如果删除了节点污点,以下示例输出显示 <node-pool-name> 节点池在 Taints 下已没有删除后的污点:

    [
        ...
        Name: <node-pool-name>
        ...
        Taints: 
        ...
        ],
        ...
     ...
    ]
    

后续步骤