You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在K8s中实现每个可用区仅运行一个Pod实例

在K8s中实现每个可用区仅运行一个服务实例的方案

要实现每个可用区(AZ)仅运行一个服务实例的需求,核心是利用K8s的Pod拓扑分布约束(TopologySpreadConstraints),它能精准控制Pod在不同拓扑域(比如可用区)的分布。以下是具体实现步骤:

1. 确认节点的可用区标签

K8s依赖节点的topology.kubernetes.io/zone标签来识别可用区,云厂商托管的集群通常会自动为节点添加该标签,自建集群需要手动配置:

  • 检查节点标签:
    kubectl get nodes --show-labels | grep topology.kubernetes.io/zone
    
  • 若节点无该标签,手动添加(替换<node-name>为实际节点名):
    kubectl label node <node-name> topology.kubernetes.io/zone=zone1
    kubectl label node <node-name> topology.kubernetes.io/zone=zone2
    

2. 编写Deployment配置

创建包含拓扑分布约束的Deployment YAML,确保每个可用区仅调度一个实例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: zone-aware-service
spec:
  replicas: 2  # 与可用区数量一致,此处为2个AZ
  selector:
    matchLabels:
      app: zone-aware-service
  template:
    metadata:
      labels:
        app: zone-aware-service
    spec:
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: topology.kubernetes.io/zone
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
          matchLabels:
            app: zone-aware-service
      containers:
      - name: your-container
        image: your-image:latest
        ports:
        - containerPort: 80

关键字段解释

  • maxSkew: 1:限制不同可用区之间的Pod数量差不超过1,保证每个AZ最多1个实例(当副本数等于AZ数量时)
  • topologyKey: topology.kubernetes.io/zone:指定基于可用区标签进行拓扑分布
  • whenUnsatisfiable: DoNotSchedule:如果无法满足分布要求(比如某个AZ无可用节点),则拒绝调度Pod,避免出现多个实例集中在一个AZ
  • labelSelector:仅匹配当前服务的Pod,确保分布计算只针对本服务实例

3. 验证部署效果

部署后,查看Pod的运行节点:

kubectl get pods -o wide

输出结果中,NODE列对应的节点应分别属于zone1和zone2,实现每个可用区一个实例的目标。

注意事项

  • 若集群可用区数量变更,需同步调整replicas值(比如3个AZ则设为3)
  • 若允许极端情况下临时分布不均,可将whenUnsatisfiable改为ScheduleAnyway,但不推荐用于严格要求每个AZ一个实例的场景
  • 确保每个可用区的节点有足够资源(CPU、内存)运行Pod,否则会导致调度失败

内容的提问来源于stack exchange,提问作者Mafei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:00:08