共用方式為


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

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

概觀

AKS 排程機制負責將 Pod 放在節點上,並以上游 Kubernetes 排程器 kube-scheduler 為基礎。 您可以使用節點親和性將一組節點附加至 Pod,或指示節點使用與 AKS 排程器互動的節點污點來驅逐一組 Pod,藉此限制 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 預覽。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:

先決條件與限制

  • 您必須安裝並設定 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 \
    --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: 
        ...
        ],
        ...
     ...
    ]
    

下一步