Availability zones可帮助保护应用程序和数据免受数据中心故障的影响。 区域是Azure区域中的唯一物理位置。 每个区域包括一个或多个配备独立电源、冷却和网络的数据中心。
使用可用性区域的Azure Kubernetes 服务 (AKS)在单个区域内将资源物理分布到不同的可用性区域,从而提高可靠性。 在多个区域中部署节点不会产生额外的费用。 本文介绍如何使用 Azure CLI 或 Terraform 配置 AKS 资源以使用可用性区域。
先决条件
有效的 Azure 订阅。 如果没有Azure订阅,请在开始前创建 Trial。
使用
az account set命令设置订阅上下文。 例如:az account set --subscription "00000000-0000-0000-0000-000000000000"Azure CLI安装和配置。 有关安装说明,请参阅 install Azure CLI。
已安装 kubectl 。 您可以使用
az aks install-cli命令在本地安装它。
- 在本地安装 Terraform。 有关安装说明,请参阅 安装 Terraform。
限制和注意事项
在 AKS 中使用可用性区域时,请记住以下限制和注意事项:
- 查看 AKS 中的配额、虚拟机大小限制和区域可用性。
- 大多数Azure区域都支持可用性区域。 有关详细信息,请参阅 Azure 区域的 List。
- 创建节点池后 ,无法更改 可用性区域的数量。 若要更改可用性区域数,必须创建具有所需区域数的新节点池,并将工作负荷迁移到新的节点池。
AKS 群集组件
下图显示了 AKS 群集的各个组件,包括由 Microsoft 托管的 AKS 组件和 Azure 订阅中的 AKS 组件:
AKS 控制平面
Microsoft托管 AKS 控制平面、Kubernetes API 服务器和服务(如 scheduler 和 etcd)作为托管服务。 Microsoft将控制平面复制到多个区域。
群集的其他资源部署在Azure订阅中的托管资源组中。 默认情况下,此资源组的前缀为 MC_ (对于 托管群集),并包含以下部分中介绍的资源。
节点池
节点池在 Azure 订阅中作为虚拟机规模集创建。
创建 AKS 群集时,需要一个 系统节点池。 将自动创建此节点池,并托管关键系统 Pod,例如 CoreDNS 和 metrics-server。 可以将更多 user 节点池添加到 AKS 群集以托管应用程序。
可以通过三种方式部署节点池: 区域跨区域、 区域对齐或 区域 (不使用可用性区域)。
下图显示了这三种模型中每个可用性区域中节点的分布情况:
创建群集或节点池时,系统会配置系统节点池区域。
跨区域节点池
在跨区域节点池中,节点分布在所有所选区域。 AKS 自动平衡区域之间的节点数。 如果发生区域中断,则受影响区域中的节点可能会受到影响,但其他可用性区域中的节点仍不受影响。
区域对齐节点池
注释
如果单个工作负荷跨节点池部署,我们建议在扩展操作期间将 --balance-similar-node-groups 设置为 true 以保持工作负荷期间区域之间节点的均衡分布。
在此配置中,每个节点都与特定区域对齐(固定)。 当需要 降低节点之间的延迟、更精细地控制缩放操作或使用 群集自动缩放程序时,可以使用此配置。
区域节点池
如果未在部署模板中设置区域分配(例如, "zones"=[] 或 "zones"=null) 时,将使用区域模式。
在此配置中,节点池创建区域(非区域固定)实例,并隐式放置整个区域的实例。 不能保证实例在区域之间均衡或分散,或者实例位于同一可用性区域中。 在极少数情况下,整个区域发生故障时,节点池中的任意或全部实例都可能受到影响。
部署
Azure Kubernetes 服务 (AKS)跨区域使用 Pod、存储和卷以及负载均衡器来维护应用程序的高可用性。
豆荚
Kubernetes 能识别 Azure 可用区,并可以在不同区域的节点之间分配 Pod 以实现负载均衡。 如果某个区域不可用,Kubernetes 会自动将 Pod 移离受影响的节点。
如 Kubernetes 参考已知标签、注释和排斥中所述,Kubernetes 使用 topology.kubernetes.io/zone 标签自动在复制控制器或服务中将 Pod 分布到各种可用性区域。
该 maxSkew 参数描述 Pod 分布不均匀的程度。 假设有三个区域和三个副本,设置此值以确保 1 每个区域至少有一个 Pod 正在运行。 例如:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: my-app
containers:
- name: my-container
image: my-image
存储和卷
默认情况下,从 Kubernetes 版本 1.29 开始,及其更高版本使用 Azure 托管磁盘时,会通过区域冗余存储来支持持久卷声明(PVC)。 这些磁盘在区域之间复制,以提高应用程序的复原能力。
以下示例演示了在区域冗余存储中使用Azure标准 SSD 的 PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: azure-managed-disk
spec:
accessModes:
- ReadWriteOnce
storageClassName: managed-csi
#storageClassName: managed-csi-premium
resources:
requests:
storage: 5Gi
对于区域一致的部署,您可以创建新的存储类,将参数skuname 设置为LRS(本地冗余存储)。 然后,您可以在您的 PVC 中使用新的存储类。
尽管本地冗余存储磁盘的成本较低,但它们不是区域冗余的,并且不支持将磁盘附加到不同区域中的节点。
以下示例演示本地冗余存储标准SSD存储类别:
kind: StorageClass
metadata:
name: azuredisk-csi-standard-lrs
provisioner: disk.csi.azure.com
parameters:
skuname: StandardSSD_LRS
#skuname: PremiumV2_LRS
负载均衡器
重要
从 September 30, 2025 开始,Azure Kubernetes 服务 (AKS)不再支持 Basic 负载均衡器。 为了避免任何潜在的服务中断,我们建议对新部署使用 标准负载均衡器,并将任何现有部署升级到 标准负载均衡器。 有关此停用的详细信息,请参阅 Retirement GitHub 问题和 Azure 更新的停用公告。 若要随时了解公告和更新,请按照 AKS 发行说明进行操作。
Kubernetes 默认部署Azure 标准负载均衡器,用于均衡区域中所有区域的入站流量。 如果某个节点不可用,则load balancer将流量重新路由到正常的节点。
以下示例演示使用Azure 负载均衡器的服务:
apiVersion: v1
kind: Service
metadata:
name: example
spec:
type: LoadBalancer
selector:
app: myapp
ports:
- port: 80
targetPort: 8080
使用 Azure CLI 创建节点池
使用Azure CLI创建 AKS 群集和跨区域节点池,其中包含可用性区域和区域一致的节点池和可用性区域。
创建跨区域节点池
在创建 AKS 群集时,可以使用--zones参数指定区域,或通过az aks create命令创建节点池使用az aks nodepool add命令。 例如:
# Create an AKS cluster with a zone-spanning system node pool in all three availability zones with one node in each availability zone
az aks create \
--resource-group example-rg \
--name example-cluster \
--node-count 3 \
--zones 1 2 3
# Add one new zone-spanning user node pool with two nodes in each availability zone
az aks nodepool add \
--resource-group example-rg \
--cluster-name example-cluster \
--name userpoola \
--node-count 6 \
--zones 1 2 3
创建区域对齐节点池
以下命令使用 az aks nodepool add 命令及其 --zones 参数为具有三个可用性区域的某一区域创建三个节点池,并为每个节点池指定一个区域:
# Add three new zone-aligned user node pools with two nodes in each
az aks nodepool add \
--resource-group example-rg \
--cluster-name example-cluster \
--name userpoolx \
--node-count 2 \
--zones 1
az aks nodepool add \
--resource-group example-rg \
--cluster-name example-cluster \
--name userpooly \
--node-count 2 \
--zones 2
az aks nodepool add \
--resource-group example-rg \
--cluster-name example-cluster \
--name userpoolz \
--node-count 2 \
--zones 3
创建 Terraform 配置文件
Terraform 配置文件定义 Terraform 创建和管理的基础结构。
创建名为
main.tf的文件,并添加以下代码以定义 Terraform 版本并指定Azure提供程序:terraform { required_version = ">= 1.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 4.0" } } } provider "azurerm" { features {} }将以下代码添加到
main.tf,以创建Azure资源组。 根据需要随时更改资源组的名称和位置。resource "azurerm_resource_group" "example" { name = "aks-rg" location = "East US" }
创建具有跨区域系统节点池的 AKS 群集
在所有三个可用性区域中创建一个 AKS 群集,并将以下代码添加到 main.tf,使其拥有一个在三个可用性区中每个区都有一个节点的跨区系统节点池:
resource "azurerm_kubernetes_cluster" "example" {
name = "aks-zones"
location = azurerm_resource_group.example.location
resource_group_name = azurerm_resource_group.example.name
dns_prefix = "akszones"
default_node_pool {
name = "system"
node_count = 1
vm_size = "Standard_DS2_v2"
zones = ["1", "2", "3"]
}
identity {
type = "SystemAssigned"
}
}
将跨区域用户节点池添加到 AKS 群集
添加以下代码以 main.tf 创建一个新的跨区域用户节点池,其中包含每个可用性区域中的两个节点:
resource "azurerm_kubernetes_cluster_node_pool" "zonespan" {
name = "userpool"
kubernetes_cluster_id = azurerm_kubernetes_cluster.example.id
vm_size = "Standard_DS2_v2"
node_count = 2
zones = ["1", "2", "3"]
}
将区域对齐的用户节点池添加到 AKS 群集
添加以下代码到 main.tf,以在每个可用区中创建三个新的与可用区对齐的用户节点池,每个池中包含两个节点:
resource "azurerm_kubernetes_cluster_node_pool" "zone1" {
name = "userpool1"
kubernetes_cluster_id = azurerm_kubernetes_cluster.example.id
vm_size = "Standard_DS2_v2"
node_count = 1
zones = ["1"]
}
resource "azurerm_kubernetes_cluster_node_pool" "zone2" {
name = "userpool2"
kubernetes_cluster_id = azurerm_kubernetes_cluster.example.id
vm_size = "Standard_DS2_v2"
node_count = 1
zones = ["2"]
}
resource "azurerm_kubernetes_cluster_node_pool" "zone3" {
name = "userpool3"
kubernetes_cluster_id = azurerm_kubernetes_cluster.example.id
vm_size = "Standard_DS2_v2"
node_count = 1
zones = ["3"]
}
初始化 Terraform
使用main.tf命令在包含terraform init文件的目录中初始化 Terraform。 此命令下载用于通过 Terraform 管理 Azure 资源所需的 Azure 提供程序。
terraform init
创建 Terraform 执行计划
使用 terraform plan 命令创建 Terraform 执行计划。 此命令显示 Terraform 将在Azure订阅中创建或修改的资源。
terraform plan
应用 Terraform 配置
查看并确认执行计划后,使用 terraform apply 命令应用 Terraform 配置。 此命令创建或修改Azure订阅中main.tf文件中定义的资源。
terraform apply
验证可用性区域配置
创建 AKS 群集和节点池后,可以使用 az aks show 命令,并指定 --query 参数来筛选输出,以验证节点是否分布在可用性区域。 例如:
az aks show \
--name example-cluster \
--resource-group example-rg \
--query agentPoolProfiles[].availabilityZones \
--output tsv
验证节点位置
使用 kubectl get nodes 以下命令验证跨可用性区域的节点分布:
kubectl get nodes -o custom-columns='NAME:metadata.name, REGION:metadata.labels.topology\.kubernetes\.io/region, ZONE:metadata.labels.topology\.kubernetes\.io/zone'
示例输出:
NAME REGION ZONE
aks-nodepool1-12345678-vmss000000 eastus eastus-1
aks-nodepool1-12345678-vmss000001 eastus eastus-2
aks-nodepool1-12345678-vmss000002 eastus eastus-3
列出正在运行的 Pod 和节点
使用 kubectl describe 命令检查哪些 Pod 和节点正在运行。 例如:
kubectl describe pod | grep -e "^Name:" -e "^Node:"
相关内容
若要详细了解 AKS 中的可靠性,请参阅以下文章: