管理 Azure Kubernetes Service (AKS)中的系統節點池

在Azure Kubernetes Service (AKS)中,相同配置的節點會被歸類為節點池。 Node pool 包含執行你應用程式的底層虛擬機(VM)。 系統節點集區和使用者節點集區為兩種不同的 AKS 叢集節點集區模式。 本文說明如何在 AKS 中管理系統節點集區。 關於如何使用多個節點池的資訊,請參閱 建立節點池。

  • 系統節點集區:主要用途是裝載重要的系統 Pod,例如 CoreDNS 和 metrics-server。 系統節點池不應該用來執行你的應用程式。 系統節點池使用 Ubuntu Linux 或 Azure Linux。
  • 使用者節點池:主要目的是託管您的應用程式 Pods,並將應用程式與系統節點池隔離。 這種隔離防止應用程式在叢集系統節點池造成不穩定。 使用者節點池可以使用 Ubuntu Linux、Azure Linux 或 Windows。

具有單一系統節點集區的生產 AKS 叢集必須包含至少兩個節點。 建議採用單一系統節點池的生產 AKS 叢集,至少應有三個節點,以提升容錯能力與可用性區域。 例如,指令 az aks create 預設節點數為三,並建立一個包含單一 Linux 系統節點池及三個 Linux 節點的新叢集。

如果您的 AKS 叢集中只有一個節點集區,則可以在系統節點集區上排程應用程式 Pod,但不建議這樣做。 更好的解決方案是為你的應用程式建立一個使用者節點池。

開始之前

你需要安裝並設定 Azure CLI 2.31 或更新版本。 若要尋找版本,請執行 az --version 命令。 如果你需要安裝或升級,請參考 安裝 Azure CLI。

你需要安裝並設定 Azure PowerShell 7.5.0 或更新版本。 若要尋找版本,請執行 Get-InstalledModule -Name Az 命令。 如果你需要安裝或升級,請參考 安裝 Azure PowerShell。

開始之前,請確定您有下列必要條件:

  • 有效的 Azure 訂用帳戶。
  • Terraform 本地安裝。
  • Azure CLI 已安裝並登入。
  • 建立和管理 AKS 資源的權限。

設定您的訂閱:

az account set --subscription <subscription-id>

限制

建立及管理支援系統節點集區的 AKS 叢集時,適用下列限制。

  • 請參閱 AKS 中的配額、VM 大小限制和區域可用性。
  • 必須使用 API 2020-03-01 版本或更高版本才能設定節點池模式。 在較舊 2020-03-01 版本的 API 上建立的叢集僅包含使用者節點池,但可透過更新 池模式步驟遷移至包含系統節點池。
  • 節點集區的名稱只能包含小寫英數字元,且開頭必須是小寫字母。 如果是 Linux 節點集區,長度必須介於 1 到 12 個字元之間。 對於 Windows 節點池,長度必須介於一到六個字元之間。
  • 使用 ARM 範本或直接 API 呼叫時,節點集區模式為必要的屬性且必須明確設定。

系統和使用者節點集區

對於系統節點池,AKS 會自動將標籤 kubernetes.azure.com/mode: system 指派給節點。 這會導致 AKS 偏好將系統 Pod 排程到包含此標籤的節點集區。 此標籤不會阻止您在系統節點集區上排程應用程式 Pod。 但我們建議您將關鍵系統Pod與應用程式Pod隔離,以防止錯誤設定或惡意應用程式Pod誤刪系統Pod。

您可以建立專用系統節點集區來強制執行此行為。 使用 CriticalAddonsOnly=true:NoSchedule 污點,防止應用程式 Pod 排程到系統節點集區。

系統節點集區具有下列限制:

  • 系統節點集區至少必須支援 30 個 Pod,如 Pod 的最小值和最大值公式所述。
  • 系統池 osType 必須是 Linux。
  • 使用者節點池osType 可以是 Linux 或 Windows。
  • 系統池必須至少包含兩個節點,但建議為三個節點。 用戶節點集區可以包含零個或多個節點。
  • 系統節點池需要至少 4 個 vCPU 和 4 GB 記憶體的虛擬機 SKU。
  • B 系列虛擬機 不支援系統節點池。
  • 建議至少要有三個具有 8 個 vCPU 的節點或兩個至少具有 16 個 vCPU 的節點 (例如 Standard_DS4_v2),尤其是針對大型叢集 (多個 CoreDNS Pod 複本、3-4+ 附加元件等)。
  • 位置節點集區需要使用者節點集區。
  • 新增另一個系統節點集區或變更哪個節點集區是系統節點集區,不會自動移動系統 Pod。 即使將節點集區變更為使用者集區,系統 Pod 還是可以繼續在同一節點集區上執行。 如果您刪除或縮減執行先前屬於系統節點集區之系統 Pod 的節點集區,這些系統 Pod 將會以偏好的排程重新部署至新的系統節點集區。

您可以透過節點集區執行下列作業:

  • 建立專用的系統節點集區 (偏好將系統 Pod 排程至 mode:system 的節點集區)
  • 將系統節點集區變更為使用者節點集區,前提是您有其他系統節點集區可以取代其在 AKS 叢集中的位置。
  • 將使用者節點集區變更為系統節點集區。
  • 刪除使用者節點集區。
  • 您可以刪除系統節點集區,前提是您有其他系統節點集區可以取代其在 AKS 叢集中的位置。
  • 一個 AKS 叢集可以有多個系統節點池,且至少需要一個系統節點池。
  • 如果您要變更現有節點集區上各種不可變的設定,您可以建立新的節點集區來取代這些集區。 舉例來說,新增一個節點池並設定新 maxPods 設定,然後刪除舊的節點池。
  • 使用節點親和性來要求或偏好根據節點標籤排程哪些節點。 您可以將 key 設定為 kubernetes.azure.com、將 operator 設定為 In,以及將 values 或 user 的 system 設定為您的 YAML,並使用 kubectl apply -f yourYAML.yaml 套用此定義。

使用系統節點集區建立新的 AKS 叢集。

建立新的 AKS 叢集時,初始節點集區預設為 System 類型的模式。 使用 az aks nodepool add 建立新的節點集區時,除非明確指定模式參數,否則這些節點集區將為使用者節點集區。

為本文章中使用的指令建立資源群組、叢集名稱及位置變數。 本文會指定數值,或者你也可以使用你自己的數值。

export RESOURCE_GROUP="myResourceGroup"
export CLUSTER_NAME="myAKSCluster"
export LOCATION="eastus"
export NEW_SYSTEM_NP="systempool"
export NEW_NODE_POOL="mynodepool"

下列範例會在 eastus 地區建立名為 myResourceGroup 的資源群組。

az group create --name $RESOURCE_GROUP --location $LOCATION

使用 az aks create (部分機器翻譯) 命令來建立 AKS 叢集。 下列範例會建立名為 myAKSCluste 的叢集,且其專用系統集區含有兩個節點。 針對生產工作負載,請確保您使用至少有三個節點的系統節點集區。 此操作需時數分鐘完成。

az aks create --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --node-count 2 --generate-ssh-keys

建立新的 AKS 叢集時,初始節點集區預設為 system 類型的模式。 當您使用 New-AzAksNodePool 建立新節點集區時,那些節點集區即是使用者節點集區。 節點集區的模式可以隨時更新。

為本文章中使用的指令建立資源群組、叢集名稱及位置變數。 本文會指定數值,或者你也可以使用你自己的數值。

$ResourceGroup="myResourceGroup"
$ClusterName="myAKSCluster"
$Location="eastus"
$NewSystemNP="systempool"
$NewNodePool="mynodepool"

下列範例會在 eastus 地區建立名為 myResourceGroup 的資源群組。

New-AzResourceGroup -ResourceGroupName $ResourceGroup -Location $Location

使用 New-AzAksCluster cmdlet 建立 AKS 叢集。 下列範例會建立名為 myAKSCluste 的叢集,且其專用系統集區含有兩個節點。 針對生產工作負載,請確保您使用至少有三個節點的系統節點集區。 整個行動需要數分鐘才能完成。

New-AzAksCluster -ResourceGroupName $ResourceGroup -Name $ClusterName -NodeCount 2 -GenerateSshKey

請使用以下 Terraform 設定建立帶有系統節點池的 AKS 叢集。

建立 Terraform 設定檔

建立一個名為 main.tf的檔案,並新增以下共享配置:

terraform {
 required_version = ">= 1.0"
 required_providers {
   azurerm = {
     source  = "hashicorp/azurerm"
     version = "~> 4.0"
   }
 }
}
provider "azurerm" {
 features {}
}

建立資源群組

新增以下資源群組配置:

resource "azurerm_resource_group" "rg" {
 name     = "aks-system-pool-rg"
 location = "East US"
}

資源群組用於組織和管理 Azure 資源。

建立新的 AKS 叢集

新增以下設定以建立 AKS 叢集。 初始節點池作為系統節點池建立,並用於叢集運作。

resource "azurerm_kubernetes_cluster" "aks" {
 name                = "aks-system-pool-cluster"
 location            = azurerm_resource_group.rg.location
 resource_group_name = azurerm_resource_group.rg.name
 dns_prefix          = "akssystempool"
 default_node_pool {
   name                = "systemnp"
   vm_size             = "Standard_D4s_v5"
   node_count          = 2
   min_count           = 2
   max_count           = 3
   max_pods            = 30
   enable_auto_scaling = true
 }
 identity {
   type = "SystemAssigned"
 }
 network_profile {
   network_plugin    = "azure"
   load_balancer_sku = "standard"
 }
}

將專用系統節點集區新增到現有 AKS 叢集

您可以將一或多個系統節點集區新增到現有 AKS 叢集。 建議將您的應用程式 Pod 安排在使用者節點池中,並將系統節點池專用於關鍵的系統 Pod。 這種分隔可防止惡意應用程式 Pod 意外刪除系統 Pod。 針對您的系統節點集區使用 CriticalAddonsOnly=true:NoSchedule 污點來強制執行此行為。

以下指令會新增一個由三個節點組成的專用模式類型 System 節點池。 az aks nodepool add這個指令預設會新增三個節點,但你用參數--node-count來指定你想要的節點數量。

az aks nodepool add \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --name $NEW_SYSTEM_NP \
  --node-count 3 \
  --node-taints CriticalAddonsOnly=true:NoSchedule \
  --mode System

您可以將一或多個系統節點集區新增到現有 AKS 叢集。 建議將您的應用程式 Pod 安排在使用者節點池中,並將系統節點池專用於關鍵的系統 Pod。 新增更多系統節點集區可防止惡意應用程式 Pod 意外刪除系統 Pod。 針對您的系統節點集區使用 CriticalAddonsOnly=true:NoSchedule 污點來強制執行此行為。

以下指令會新增一個由三個節點組成的專用模式類型 System 節點池。

$systempoolparams = @{
  ResourceGroupName = $ResourceGroup
  ClusterName = $ClusterName
  Name = $NewSystemNP
  Count = 3
  Mode = 'System'
  NodeTaint = 'CriticalAddonsOnly=true:NoSchedule'
}

New-AzAksNodePool @systempoolparams

新增第二個節點池,作為系統節點池來隔離關鍵系統工作負載。

resource "azurerm_kubernetes_cluster_node_pool" "system_pool" {
 name                  = "systempool"
 kubernetes_cluster_id = azurerm_kubernetes_cluster.aks.id
 vm_size               = "Standard_D4s_v5"
 node_count            = 3
 mode                  = "System"
 max_pods              = 30
 node_taints = [
   "CriticalAddonsOnly=true:NoSchedule"
 ]
}

此配置會套用 CriticalAddonsOnly=true:NoSchedule 污點,以確保應用程式工作負載不會被排入專用的系統節點池。

新增使用者節點池

為了將應用程式工作負載與系統元件分離,請新增使用者節點池。

resource "azurerm_kubernetes_cluster_node_pool" "user_pool" {
 name                  = "userpool"
 kubernetes_cluster_id = azurerm_kubernetes_cluster.aks.id
 vm_size               = "Standard_D4s_v5"
 node_count            = 2
 mode                  = "User"
 max_pods              = 30
 enable_auto_scaling = true
 min_count           = 2
 max_count           = 4
}

使用者節點池為應用程式 Pod 提供專用環境。

部署前的最後檢查

你的 main.tf 應包含:

  • Terraform 與提供者配置
  • 資源群組
  • AKS 叢集與預設系統節點池
  • 專用系統節點池
  • 選用的使用者節點集區 (如有需要)

完成的配置看起來類似以下範例:

terraform {
 required_version = ">= 1.0"
 required_providers {
   azurerm = {
     source  = "hashicorp/azurerm"
     version = "~> 4.0"
   }
 }
}
provider "azurerm" {
 features {}
}
resource "azurerm_resource_group" "rg" {
 name     = "aks-system-pool-rg"
 location = "East US"
}
resource "azurerm_kubernetes_cluster" "aks" {
 name                = "aks-system-pool-cluster"
 location            = azurerm_resource_group.rg.location
 resource_group_name = azurerm_resource_group.rg.name
 dns_prefix          = "akssystempool"
 default_node_pool {
   name                = "systemnp"
   vm_size             = "Standard_D4s_v5"
   node_count          = 2
   min_count           = 2
   max_count           = 3
   max_pods            = 30
   enable_auto_scaling = true
 }
 identity {
   type = "SystemAssigned"
 }
 network_profile {
   network_plugin    = "azure"
   load_balancer_sku = "standard"
 }
}
resource "azurerm_kubernetes_cluster_node_pool" "system_pool" {
 name                  = "systempool"
 kubernetes_cluster_id = azurerm_kubernetes_cluster.aks.id
 vm_size               = "Standard_D4s_v5"
 node_count            = 3
 mode                  = "System"
 max_pods              = 30
 node_taints = [
   "CriticalAddonsOnly=true:NoSchedule"
 ]
}
resource "azurerm_kubernetes_cluster_node_pool" "user_pool" {
 name                  = "userpool"
 kubernetes_cluster_id = azurerm_kubernetes_cluster.aks.id
 vm_size               = "Standard_D4s_v5"
 node_count            = 2
 mode                  = "User"
 max_pods              = 30
 enable_auto_scaling = true
 min_count           = 2
 max_count           = 4
}

驗證設定

執行以下指令來格式化、初始化並驗證設定:

terraform fmt
terraform init
terraform validate

檢視執行計畫

在部署前執行以下指令以檢視執行計畫:

terraform plan

套用設定

執行以下指令來建立 AKS 叢集與節點池:

terraform apply

驗證部署

檢查專用系統節點池的配置:

az aks nodepool show \
 --resource-group aks-system-pool-rg \
 --cluster-name aks-system-pool-cluster \
 --name systempool

檢查輸出並確認節點池已設定 mode 為 System。 連接叢集並列出節點:

az aks get-credentials \
 --resource-group aks-system-pool-rg \
 --name aks-system-pool-cluster

kubectl get nodes

顯示節點集區的詳細資料

您可以使用下列命令來查看節點集區的詳細資料。

az aks nodepool show \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --name $NEW_SYSTEM_NP \
  --query "{Count:count, Mode:mode, NodePool:name, NodeTaint:nodeTaints, ResourceGroup:resourceGroup}"

系統已針對系統節點集區定義 System 類型模式,並針對使用者節點集區定義 User 類型模式。 對於系統池,請確認 nodeTaints 屬性設定為 CriticalAddonsOnly=true:NoSchedule,以防止應用程式 Pod 被排程到該節點池。

{
  "Count": 3,
  "Mode": "System",
  "NodePool": "systempool",
  "NodeTaint": [
    "CriticalAddonsOnly=true:NoSchedule"
  ],
  "ResourceGroup": "myResourceGroup"
}

您可以使用下列命令來查看節點集區的詳細資料。

Get-AzAksNodePool -ResourceGroupName $ResourceGroup -ClusterName $ClusterName -Name $NewSystemNP |
  Select-Object -Property Count, Mode, Name, NodeTaints

系統已針對系統節點集區定義 System 類型模式,並針對使用者節點集區定義 User 類型模式。 針對系統集區,請驗證污點已設定為CriticalAddonsOnly=true:NoSchedule,這可防止應用程式 Pod 遭排程到此節點集區。

Count Mode   Name       NodeTaints
----- ----   ----       ----------
    3 System systempool {CriticalAddonsOnly=true:NoSchedule}

此步驟已包含於前一節的 「驗證部署 」步驟中。

系統已針對系統節點集區定義 System 類型模式,並針對使用者節點集區定義 User 類型模式。 對於系統池,請確認 nodeTaints 屬性設定為 CriticalAddonsOnly=true:NoSchedule,以防止應用程式 Pod 被排程到該節點池。

更新現有叢集系統和使用者節點集區

注意

需使用 2020-03-01 或以上版本的 API 來設定系統節點池模式。 因此,基於較舊 2020-03-01 API 版本建立的叢集僅包含使用者節點池。 要在舊叢集上獲得系統節點池的功能與好處,請在最新 Azure CLI 版本上使用以下指令更新現有節點池的模式。

你可以同時切換系統節點池和使用者節點池的模式。 只有當 AKS 叢集上已有另一個系統節點池時,才能將系統節點池改為使用者節點池。

執行此指令以建立新的系統模式節點池。

az aks nodepool add \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --name $NEW_NODE_POOL \
  --node-count 3 \
  --mode System

你可以用以下指令驗證模式。

az aks nodepool show \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --name $NEW_NODE_POOL \
  --query mode --output tsv
System

執行此指令即可將系統節點池變更為使用者節點池。

az aks nodepool update \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --name $NEW_NODE_POOL \
  --mode User

你可以用以下指令驗證模式的變更。

az aks nodepool show \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --name $NEW_NODE_POOL \
  --query mode --output tsv
User

注意

需使用 2020-03-01 或以上版本的 API 來設定系統節點池模式。 因此,基於較舊 2020-03-01 API 版本建立的叢集僅包含使用者節點池。 要在舊叢集上獲得系統節點池的功能與好處,請在最新 Azure PowerShell 版本中以以下指令更新現有節點池的模式。

你可以同時切換系統節點池和使用者節點池的模式。 只有當 AKS 叢集上已有另一個系統節點池時,才能將系統節點池改為使用者節點池。

執行此指令以建立新的系統模式節點池。

$newpoolparams = @{
  ResourceGroupName = $ResourceGroup
  ClusterName = $ClusterName
  Name = $NewNodePool
  Count = 3
  Mode = 'System'
}

New-AzAksNodePool @newpoolparams

你可以用以下指令驗證模式。

Get-AzAksNodePool -ResourceGroupName $ResourceGroup -ClusterName $ClusterName -Name $NewNodePool |
  Select-Object -Property Mode
Mode
----
System

執行此指令即可將系統節點池變更為使用者節點池。

$updateuserpoolparams = @{
  ResourceGroupName = $ResourceGroup
  ClusterName = $ClusterName
  Name = $NewNodePool
  Mode = 'User'
}

Update-AzAksNodePool @updateuserpoolparams

你可以用以下指令驗證模式。

Get-AzAksNodePool -ResourceGroupName $ResourceGroup -ClusterName $ClusterName -Name $NewNodePool |
  Select-Object -Property Mode
Mode
----
User

若要更改現有節點池的模式,請更新 mode Terraform 設定中的值並重新套用部署。

例如,以下配置會將 user_pool 節點池改為系統節點池:

resource "azurerm_kubernetes_cluster_node_pool" "user_pool" {
 name                  = "userpool"
 kubernetes_cluster_id = azurerm_kubernetes_cluster.aks.id
 vm_size               = "Standard_D4s_v5"
 node_count            = 2
 mode                  = "System"
 max_pods              = 30
 enable_auto_scaling = true
 min_count           = 2
 max_count           = 4
}

更新設定後,執行:

terraform plan
terraform apply

若要將專用系統節點池改為使用者節點池,請更新 mode 的 system_pool 值 到 並 User 重新套用設定。

刪除系統節點集區

注意

若要在 API 版本 2020-03-01前的 AKS 叢集使用系統節點池,先新增一個系統節點池,然後刪除原本的預設節點池。

您的 AKS 叢集必須包含至少兩個系統節點集區,您才能刪除其中一個節點集區。

az aks nodepool delete \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --name $NEW_NODE_POOL

刪除系統節點池後,應保留原本隨叢集建立的系統節點池,以及你在為現有 AKS 叢集新增一個專用系統節點池該區段中建立的系統節點池。

az aks nodepool list \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --query "[].{Name:name, Mode:mode}" --output table

注意

若要在 API 版本 2020-03-01前的 AKS 叢集使用系統節點池,先新增一個系統節點池,然後刪除原本的預設節點池。

您的 AKS 叢集必須包含至少兩個系統節點集區,您才能刪除其中一個節點集區。

以下指令會提示您確認是否刪除節點池。 輸入 Y 來確認。

Remove-AzAksNodePool $ResourceGroup -ClusterName $ClusterName -Name $NewNodePool

刪除系統節點池後,應保留原本隨叢集建立的系統節點池,以及你在為現有 AKS 叢集新增一個專用系統節點池該區段中建立的系統節點池。

Get-AzAksNodePool -ResourceGroupName $ResourceGroup -ClusterName $ClusterName

叢集必須至少包含一個系統節點池。 如果叢集有多個系統節點池,你可以從 Terraform 設定中刪除其資源區塊並套用變更來移除其中一個。

例如,移除 system_pool 資源區塊後執行:

terraform plan
terraform apply

清除資源

當你刪除 AKS 叢集的資源群組時,所有叢集資源及相關的節點資源群組MC_()都會被刪除。

若要刪除叢集,請使用 az group delete 命令來刪除 AKS 資源群組:

az group delete --name $RESOURCE_GROUP --yes --no-wait

若要刪除叢集,請使用 Remove-AzResourceGroup 命令來刪除 AKS 資源群組:

Remove-AzResourceGroup -Name $ResourceGroup -Force

完成後,移除以下資源:

terraform destroy

下一步

在本文中,您已學會如何在 AKS 叢集中建立及管理系統節點集區。 如需如何啟動和停止 AKS 節點集區的相關資訊,請參閱啟動和停止 AKS 節點集區。