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

Azure Kubernetes 服务 (AKS) 中的可用性区域

当数据中心发生故障时,可用性区域可以帮助你保护应用程序和数据。 这些区域是 Azure 地区中独特的物理位置。 每个区域包含一个或多个配备了独立电源、冷却设备和网络的数据中心。

使用 Azure Kubernetes 服务(AKS)时,可通过将资源物理上分布在单个区域内的不同可用性区域来提高可靠性。 在多个区域中部署节点不会产生额外的费用。

本文介绍如何配置 AKS 资源以使用可用性区域。

AKS 资源

此图显示了在创建 AKS 群集时创建的 Azure 资源:

图示显示了各种 AKS 组件,包括由 Microsoft 托管的 AKS 组件以及 Azure 订阅中的 AKS 组件。

AKS 控制平面

Microsoft 将 AKS 控制平面、Kubernetes API 服务器以及 scheduleretcd 等服务作为托管服务进行托管。 Microsoft 将控制平面复制到多个区域中。

群集的其他资源部署在 Azure 订阅中的托管资源组中。 默认情况下,此资源组的前缀是MC_,用于托管群集,并包含以下部分中提到的资源。

节点池

节点池在 Azure 订阅中作为虚拟机规模集创建。

创建 AKS 群集时,需要一个 系统节点池 ,并且会自动创建。 它托管着关键系统 Pod,例如 CoreDNSmetrics-server。 可以将更多 用户节点池 添加到 AKS 群集以托管应用程序。

可以通过三种方式来部署节点池:

  • 跨区域
  • 区域对齐
  • 区域

显示不同模型中跨可用性区域的 AKS 节点分布的关系图。

创建群集或节点池时,将配置系统节点池区域。

跨区域

在此配置中,节点分布在所有所选区域。 这些区域是使用 --zones 参数指定的。

# Create an AKS cluster, and create a zone-spanning system node pool in all three AZs, one node in each AZ
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, two nodes in each
az aks nodepool add --resource-group example-rg --cluster-name example-cluster --name userpool-a  --node-count 6 --zones 1 2 3

AKS 自动平衡区域之间的节点数。

如果发生区域性服务中断,则受影响区域中的节点可能会受到影响,但其他可用性区域中的节点仍不受影响。

若要验证节点位置,请运行以下命令:

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-34917322-vmss000000   eastus   eastus-1
aks-nodepool1-34917322-vmss000001   eastus   eastus-2
aks-nodepool1-34917322-vmss000002   eastus   eastus-3

区域对齐

在此配置中,每个节点都与特定区域对齐(固定)。 为具有三个可用性区域的区域创建三个节点池:

# # Add three new zone-aligned user node pools, two nodes in each
az aks nodepool add --resource-group example-rg --cluster-name example-cluster --name userpool-x  --node-count 2 --zones 1
az aks nodepool add --resource-group example-rg --cluster-name example-cluster --name userpool-y  --node-count 2 --zones 2
az aks nodepool add --resource-group example-rg --cluster-name example-cluster --name userpool-z  --node-count 2 --zones 3

要求节点之间的延迟较低时,可以使用此配置。 对于缩放操作或在你使用群集自动缩放程序时,它还可提供更精细的控制。

注意

如果单个工作负荷跨节点池部署,我们建议设置 --balance-similar-node-groupstrue,在扩展操作期间为工作负荷保持跨区域节点的均衡分布。

区域(不使用可用性区域)

如果未在部署模板中设置区域分配(例如, "zones"=[]"zones"=null) 时使用区域模式。

在此配置中,节点池创建区域(非区域固定)实例,并隐式放置整个区域的实例。 不能保证实例在区域之间均衡或分散,或者实例位于同一可用性区域中。

在极少数情况下出现完全区域性中断,节点池中的任何或所有实例都可能会受到影响。

若要验证节点位置,请运行以下命令:

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-34917322-vmss000000   eastus   0
aks-nodepool1-34917322-vmss000001   eastus   0
aks-nodepool1-34917322-vmss000002   eastus   0

部署

Pod

Kubernetes 了解 Azure 的可用性区域,并且能够将 Pod 分布于不同区域的节点之间以实现均衡。 如果某个区域不可用,Kubernetes 会自动将 Pod 移离受影响的节点。

如 Kubernetes 参考“已知标签、注释和排斥”中所述,Kubernetes 使用 topology.kubernetes.io/zone 标签在各种可用的区域中自动分发复制控制器或服务中的 pod。

若要查看哪些 Pod 和节点正在运行,请运行以下命令:

  kubectl describe pod | grep -e "^Name:" -e "^Node:"

maxSkew 参数描述容器组可能分布不均匀的程度。 假设有三个区域和三个副本,设置此值以确保 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 托管磁盘进行永久性卷声明。

这些磁盘在区域之间复制,以提高应用程序的复原能力。 此作有助于保护数据免受数据中心故障的影响。

以下示例显示区域冗余存储中使用 Azure 标准 SSD 的永久性卷声明:

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(本地冗余存储)。 然后,你可以在持久卷声明中使用新的存储类。

尽管本地冗余存储磁盘成本较低,但它们不是区域冗余的,不支持将磁盘附加到不同区域中的节点。

以下示例演示本地冗余存储标准 SSD 存储类:

kind: StorageClass

metadata:
  name: azuredisk-csi-standard-lrs
provisioner: disk.csi.azure.com
parameters:
  skuname: StandardSSD_LRS
  #skuname: PremiumV2_LRS

负载均衡器

Kubernetes 默认部署 Azure 标准负载均衡器,用于均衡区域中所有区域的入站流量。 如果某个节点变得不可用,则负载均衡器会将流量重新路由到正常运行的节点。

使用 Azure 负载均衡器的示例服务:

apiVersion: v1
kind: Service
metadata:
  name: example
spec:
  type: LoadBalancer
  selector:
    app: myapp
  ports:
    - port: 80
      targetPort: 8080

重要

2025 年 9 月 30 日,基本负载均衡器将停用。 有关详细信息,请查看官方公告。 如果使用基本负载均衡器,请确保在停用日期之前 升级到 标准负载均衡器。

限制

使用可用性区域时,以下限制适用: