共用方式為


在 Azure Arc 叢集所啟用的 AKS 中使用節點污點

適用於:Azure 本機版本 23H2

本文說明如何在 AKS 叢集中使用節點污點。

概觀

AKS 排程機制負責將Pod放在節點上,並且以上游 Kubernetes 排程器 kube-scheduler 為基礎。 您可以藉由指示節點使用 節點污點來拒絕與 AKS 排程器互動的一組 Pod,限制 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,讓 Pod 能夠「容忍」節點的污點。

設定節點集區容忍

在上一個步驟中,您已在建立節點集區時套用 sku=gpu:NoSchedule 污點。 下列範例 YAML 指令清單會使用 Toleration,讓 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 已套用Toleration。 在 [ 事件] 區段中,排程器將 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"   

下一步