可用性区域 有助于保护应用程序和数据免受数据中心故障的影响。 区域是 Azure 区域中的唯一物理位置。 每个区域包括一个或多个配备独立电源、冷却和网络的数据中心。
将 Azure Kubernetes 服务(AKS)与可用性区域物理上跨单个区域中的不同可用性区域分配资源,从而提高可靠性。 在多个区域中部署节点不会产生额外的费用。 有关 AKS 可靠性功能的详细信息,包括可用性区域、多区域配置、服务维护和备份期间的可靠性,请参阅 AKS 中的可靠性。
本文介绍如何配置 AKS 资源以使用可用性区域。
AKS 资源
此图显示了在创建 AKS 群集时创建的 Azure 资源:
AKS 控制平面
Microsoft托管 AKS 控制平面、Kubernetes API 服务器以及托管服务等scheduler
etcd
服务。 Microsoft复制多个区域中的控制平面。
群集的其他资源部署在 Azure 订阅中的托管资源组中。 默认情况下,此资源组的前缀为托管群集的MC_,并包含以下部分中提到的资源。
节点池
节点池在 Azure 订阅中作为虚拟机规模集创建。
创建 AKS 群集时,需要一个 系统节点池 ,并且会自动创建。 它托管关键系统 Pod,例如 CoreDNS
和 metrics-server
。 可以将更多 用户节点池 添加到 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 chinanorth3 chinanorth3-1
aks-nodepool1-34917322-vmss000001 chinanorth3 chinanorth3-2
aks-nodepool1-34917322-vmss000002 chinanorth3 chinanorth3-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-groups
纵向扩展作期间为 true
工作负荷保持跨区域节点的均衡分布。
区域(不使用可用性区域)
如果未在部署模板中设置区域分配(例如, "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 chinanorth3 0
aks-nodepool1-34917322-vmss000001 chinanorth3 0
aks-nodepool1-34917322-vmss000002 chinanorth3 0
部署
豆荚
Kubernetes 了解 Azure 可用性区域,并且可以在不同区域中的节点之间平衡 Pod。 如果某个区域不可用,Kubernetes 会自动将 Pod 移离受影响的节点。
如 Kubernetes 参考 Well-Known 标签、批注和污点中所述,Kubernetes 使用 topology.kubernetes.io/zone
标签在复制控制器或服务中自动分发 Pod,在可用的各种可用区域中。
若要查看哪些 Pod 和节点正在运行,请运行以下命令:
kubectl describe pod | grep -e "^Name:" -e "^Node:"
该 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 托管磁盘,方法是使用永久性卷声明的区域冗余存储。
这些磁盘在区域之间复制,以提高应用程序的复原能力。 此作有助于保护数据免受数据中心故障的影响。
以下示例演示在区域冗余存储中使用 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
对于区域一致的部署,可以使用参数设置为LRS
(本地冗余存储)创建新的存储类skuname
。 然后,可以在永久性卷声明中使用新的存储类。
尽管本地冗余存储磁盘成本较低,但它们不是区域冗余的,不支持将磁盘附加到不同区域中的节点。
以下示例演示本地冗余存储标准 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
局限性
使用可用性区域时,以下限制适用:
- 请参阅 AKS 中的配额、虚拟机大小限制和区域可用性。
- 创建节点池后 ,无法使用 的可用性区域数进行更改。
- 大多数区域支持可用性区域。 请参阅区域列表。
相关内容
- 了解 AKS 中的可靠性。
- 了解 系统节点池。
- 了解 用户节点池。
- 了解 负载均衡器。
- 获取 AKS 中业务连续性和灾难恢复的最佳做法。