共用方式為


在 Azure Kubernetes Service (AKS) 叢集中使用節點污點

本文說明如何在 Azure Kubernetes Service (AKS) 叢集中使用節點污點。

概觀

AKS 排程機制負責將Pod放在節點上,並且以上游 Kubernetes 排程器 kube-scheduler 為基礎。 您可以藉由使用節點親和性將Pod附加至一組節點,或指示節點使用節點污點來驅逐一組Pod,以在特定節點上執行,而節點會與AKS排程器互動。

節點污點的運作方式是標記節點,讓排程器避免將特定Pod放在標示的節點上。 您可以將任用放在Pod上,讓排程器在具有相符污點的節點上排程該Pod。 污點和容忍會一起運作,以協助您控制排程器如何將Pod放在節點上。 如需詳細資訊,請參閱 污點和容忍的範例使用案例。

Taints 是具有效果索引鍵/值組。 使用節點污點時,效果欄位有三個值: NoExecuteNoSchedulePreferNoSchedule

  • NoExecute:如果 Pod 沒有相符的容忍,則會立即收回節點上執行的 Pod。 如果 Pod 具有相符的容忍,則如果 tolerationSeconds 已指定,可能會收回它。
  • NoSchedule:只有具有相符托勒的 Pod 會放在這個節點上。 不會收回現有的Pod。
  • PreferNoSchedule:排程器可避免放置任何沒有相符 Toleration 的 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 預覽。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:

先決條件與限制

  • 您需要安裝及設定 Azure CLI 版本或更新版本 3.0.0b3 。 執行 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> 節點集區是 Creating 具有指定 nodeTaints之的節點:

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

    如果您套用節點初始化污點,下列範例輸出會顯示 <node-pool-name> 節點集區是 Creating 具有指定 nodeInitializationTaints之的節點:

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

檢查節點上是否已設定污點

  • 使用 kubectl describe node 命令檢查節點組態中的節點污點和節點初始化污點。

    kubectl describe node $NODE_NAME
    

    如果您套用節點污點,下列範例輸出會顯示 <node-pool-name> 節點集區具有指定的 Taints

    [
        ...
        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 \
    --node-taints "sku=gpu:NoSchedule"
    

拿掉所有節點污點

  • 使用 az aks nodepool update 命令從節點集區中移除所有節點污點。 下列範例命令會從節點集區中移除所有節點污點。

    az aks nodepool update \
    --cluster-name $CLUSTER_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 "sku=gpu:NoSchedule"
    

檢查是否已從節點移除污點

  • 使用 kubectl describe node 命令檢查節點組態中的節點污點和節點初始化污點。

    kubectl describe node $NODE_NAME
    

    如果您移除節點污點,下列範例輸出會顯示 <node-pool-name> 節點集區在 下 Taints沒有移除的污點:

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

下一步