你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure Kubernetes 服务 (AKS) 中管理系统节点池

在Azure Kubernetes 服务 (AKS)中,同一配置的节点将分组到 node 池。 节点池包含运行应用程序的基础虚拟机(VM)。 系统节点池和用户节点池是 AKS 群集的两种不同的节点池模式。 本文介绍如何在 AKS 中管理系统节点池。 有关如何使用多个节点池的信息,请参阅 创建节点池

  • 系统节点池:主要目的是托管关键系统 Pod,例如 CoreDNSmetrics-server。 系统节点池不应用于运行应用程序。 系统节点池使用 Ubuntu Linux 或 Azure Linux。
  • 用户节点池:主要目的是托管应用程序 Pod 并将应用程序与系统节点池隔离。 这种隔离可防止应用程序导致群集的系统节点池不稳定。 用户节点池可以使用 Ubuntu Linux、Azure Linux 或Windows。

具有单个系统节点池的生产 AKS 群集必须至少包含两个节点。 对于具有单个系统节点池的生产 AKS 群集,建议至少有三个节点以提高容错和可用性区域。 例如, az aks create 命令的默认节点计数为三个,并创建一个具有单个 Linux 系统节点池和三个 Linux 节点的新群集。

如果 AKS 群集中只有一个节点池,也可以在系统节点池上调度应用程序 Pod,但不建议这样做。 更好的解决方案是为应用程序创建用户节点池。

开始之前

需要安装并配置Azure CLI版本 2.3.1 或更高版本。 若要查找版本,请运行 az --version 命令。 如果需要安装或升级,请参阅 Install Azure CLI

需要安装并配置Azure PowerShell版本 7.5.0 或更高版本。 若要查找版本,请运行 Get-InstalledModule -Name Az 命令。 如果需要安装或升级,请参阅 Install Azure PowerShell

在开始之前,请确保满足以下先决条件:

  • 一个有效的 “Azure” 订阅。
  • 在本地安装 Terraform。
  • 已安装并登录 Azure CLI。
  • 创建和管理 AKS 资源的权限。

设置订阅:

az account set --subscription <subscription-id>

限制

创建和管理支持系统节点池的 AKS 群集时存在以下限制。

  • 请参阅 AKS 中的配额、VM 大小限制和区域可用性
  • API 版本 2020-03-01 或更高版本必须用于设置节点池模式。 在 API 版本低于 2020-03-01 上创建的群集仅包含用户节点池,但可以按照 更新池模式步骤将其迁移以包含系统节点池。
  • 节点池的名称只能包含小写字母数字字符,且必须以小写字母开头。 对于 Linux 节点池,长度必须为 1 到 12 个字符。 对于Windows节点池,长度必须介于 1 到 6 个字符之间。
  • 节点池模式是必需属性,当使用 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 内存的 VM SKU。
  • 系统节点池不支持 B 系列 VM
  • 建议至少使用包含 8 个 vCPU 的三个节点或至少包含 16 个 vCPU 的两个节点(例如 Standard_DS4_v2),特别是对于大型群集(多个 CoreDNS Pod 副本、3-4 个以上附加项,等等)。
  • 现成节点池需要用户节点池。
  • 添加其他系统节点池或更改哪个节点池为系统节点池不会自动移动系统 Pod。 即使将系统 Pod 更改为用户节点池,该系统 Pod 也可以继续在同一节点池上运行。 如果删除或纵向缩减运行系统 Pod 的节点池(以前是系统节点池),则这些系统 Pod 将通过优先调度重新部署到新的系统节点池。

对于节点池,可以执行以下操作:

  • 创建专用系统节点池(优先将系统 Pod 计划到 mode:system 的节点池)
  • 将系统节点池更改为用户节点池,但前提是 AKS 群集中有另一个可以取代它的系统节点池。
  • 将用户节点池更改为系统节点池。
  • 删除用户节点池。
  • 可以删除系统节点池,前提是在 AKS 群集中有另一个可取代它的系统节点池。
  • AKS 群集可以有多个系统节点池,并且至少需要一个系统节点池。
  • 如果希望更改现有节点池上的各种不可变设置,可以新建节点池将其替换。 一个示例是添加新设置的新节点池 maxPods ,并删除旧节点池。
  • 使用节点相关性要求或首选可以根据节点标签计划的节点。 可以将 key 设置为 kubernetes.azure.com,将 operator 设置为 In,并将 valuesusersystem 设置为你的 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 群集。 以下示例创建包含一个专用系统池(包含两个节点)的名为 myAKSCluster 的群集。 对于生产工作负载,请确保使用至少包含三个节点的系统节点池。 此操作需要几分钟才能完成。

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 群集。 以下示例创建包含一个专用系统池(包含两个节点)的名为 myAKSCluster 的群集。 对于生产工作负载,请确保使用至少包含三个节点的系统节点池。 该操作需要几分钟才能完成。

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}"

将为系统节点池定义“系统”类型的模式,并为用户节点池定义“用户”类型的模式。 对于系统池,请验证属性 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

将为系统节点池定义“系统”类型的模式,并为用户节点池定义“用户”类型的模式。 对于系统池,请验证污点是否设置为 CriticalAddonsOnly=true:NoSchedule,这将防止在此节点池上计划应用程序 Pod。

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

此步骤包含在上一部分的 “验证部署 步骤”中。

将为系统节点池定义“系统”类型的模式,并为用户节点池定义“用户”类型的模式。 对于系统池,请验证属性 nodeTaints 是否设置为 CriticalAddonsOnly=true:NoSchedule,以阻止应用程序 Pod 被调度到此节点池上。

更新现有的群集系统和用户节点池

注意

API 版本 2020-03-01 或更高版本必须用于设置系统节点池模式。 而在 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

注意

API 版本 2020-03-01 或更高版本必须用于设置系统节点池模式。 而在 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

若要将专用系统节点池更改为用户节点池,请将modesystem_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 节点池