在 Azure Arc 群集启用的 AKS 中使用节点污点

适用于:Azure 本地版本 23H2

本文介绍如何在 AKS 群集中使用节点污点。

概述

AKS 计划机制负责将 Pod 放置在节点上,并且基于上游 Kubernetes 计划程序 kube-scheduler。 可以通过指示节点拒绝 使用节点污点(与 AKS 计划程序交互)来限制 Pod 在特定节点上运行。

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

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

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

开始之前

  • 本文假设你有现有 AKS 群集。 如果需要 AKS 群集,可以使用 Azure CLI、Azure PowerShell 或Azure 门户创建群集。
  • 创建节点池时,可以向其添加污点。 添加排斥时,该节点池中的所有节点也会获取该排斥。

重要

应使用 az aksarc nodepool 将污点或标签添加到整个节点池的节点。 不建议使用 kubectl 污点或标签将污点或标签应用于节点池中的单个节点。

设置节点池排斥

使用 az aksarc nodepool add 命令创建具有排斥的节点池。 指定名称 taintnp 并使用 --node-taints 参数指定 sku=gpu:NoSchedule 污点:

az aksarc nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name taintnp \
    --node-count 1 \
    --node-taints sku=gpu:NoSchedule \
    --no-wait

使用 az aksarc nodepool list 以下命令检查节点池的状态:

az aksarc nodepool list -g myResourceGroup --cluster-name myAKSCluster

以下示例输出显示 taintnp 节点池创建具有指定 nodeTaints节点的节点:

[
  {
    ...
    "count": 1,
    ...
    "name": "taintnp",
    ...
    "provisioningState": "Succeeded",
    ...
    "nodeTaints":  [
      "sku=gpu:NoSchedule"
    ],
    ...
  },
 ...
]

排斥信息将显示在 Kubernetes 中,以便于处理节点的计划规则。 Kubernetes 计划程序可以使用排斥和容忍来限制哪些工作负荷可以在节点上运行。

  • 排斥应用到指明了只能计划特定 pod 的节点。
  • 然后,将容忍应用于允许它们“容忍”节点污点的 Pod。

设置节点池容许

在上一步中,你在创建节点池时应用 sku=gpu:NoSchedule 了污点。 以下示例 YAML 清单使用容忍来允许 Kubernetes 计划程序在该节点池中的节点上运行 NGINX Pod:

创建名为 nginx-toleration.yaml 的文件,并复制/粘贴以下示例 YAML:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - image: mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine
    name: mypod
    resources:
      requests:
        cpu: 100m
        memory: 128Mi
      limits:
        cpu: 1
        memory: 2G
  tolerations:
  - key: "sku"
    operator: "Equal"
    value: "gpu"
    effect: "NoSchedule"

使用 kubectl apply 命令计划 pod:

kubectl apply -f nginx-toleration.yaml

只需花费几秒钟时间即可计划 pod 并提取 NGINX 映像。

使用 kubectl describe pod 以下命令检查状态:

kubectl describe pod mypod

以下精简示例输出显示 sku=gpu:NoSchedule 应用容忍。 在“事件”部分中,计划程序将 Pod moc-lbeof1gn6x3 分配到节点:

[...]
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
                 sku=gpu:NoSchedule
Events:
  Type    Reason     Age    From                Message
  ----    ------     ----   ----                -------
  Normal  Scheduled  54s  default-scheduler   Successfully assigned default/mypod to moc-lbeof1gn6x3
  Normal  Pulling    53s  kubelet             Pulling image "mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine"
  Normal  Pulled     48s  kubelet             Successfully pulled image "mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine" in 3.025148695s (3.025157609s including waiting)
  Normal  Created    48s  kubelet             Created container
  Normal  Started    48s  kubelet             Started container

只有应用了此容忍的 Pod 才能在节点上 taintnp计划。 任何其他 Pod 将在 nodepool1 节点池中计划。 如果创建更多节点池,可以使用污点和容忍来限制可在这些节点资源上计划的 pod。

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

更新群集以使用 az aksarc update 命令和 --node-taints 参数为污点指定 sku=gpu:NoSchedule 节点污点。 所有现有污点都替换为新值。 删除旧的污点:

az aksarc update -g myResourceGroup --cluster-name myAKSCluster --name taintnp --node-taints "sku=gpu:NoSchedule"   

后续步骤