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

如何将Kubernetes Deployment的Pod调度至同一故障域并支持故障自动切换?

解决方案:将Deployment的所有Pod调度至同一故障域(自动故障转移)

核心思路

利用**Pod亲和性(Pod Affinity)**结合节点的故障域拓扑标签,让Deployment的Pod自动聚集到同一故障域,同时在当前故障域失效时,新Pod会自动调度至其他可用故障域,无需手动干预。

具体配置

在Deployment的Pod模板中添加亲和性规则,让后续Pod强制亲和到已有同标签Pod所在的故障域:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: your-deployment-name
spec:
  replicas: 3  # 替换为你的实际副本数
  selector:
    matchLabels:
      app: your-app-label  # 统一的Pod标签,需与template.metadata.labels保持一致
  template:
    metadata:
      labels:
        app: your-app-label
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchLabels:
                app: your-app-label  # 匹配自身Deployment的Pod标签
            topologyKey: "topology.kubernetes.io/zone"  # 替换为集群中标识故障域的节点标签
      containers:
      - name: your-container-name
        image: your-image:tag

关键说明

  1. 拓扑标签适配:topologyKey需替换为你的Kubernetes集群中标识故障域的节点标签,常见值包括:
    • topology.kubernetes.io/zone(Kubernetes标准标签)
    • failure-domain.beta.kubernetes.io/zone(旧版兼容标签)
    • 自定义标签(如company.com/failure-domain,若集群使用自定义标识)
  2. 调度逻辑:
    • 第一个Pod会被调度至任意可用故障域的节点;
    • 后续所有Pod会强制调度至与第一个Pod相同故障域的节点;
    • 当该故障域内所有节点失效时,新Pod(如滚动更新、故障恢复时创建的Pod)会自动寻找其他可用故障域,无需修改配置。
  3. 规则特性:requiredDuringSchedulingIgnoredDuringExecution表示调度时强制检查亲和规则,但Pod运行后忽略规则变更,确保故障域失效时新Pod能正常调度至其他域。

验证方式

  1. 部署后查看Pod所在节点的故障域:
    kubectl get pods -o wide | awk '{print $1, $7}'
    kubectl describe node <node-name> | grep "topology.kubernetes.io/zone"
    
  2. 模拟故障域失效(如关闭该域所有节点),触发Deployment滚动更新或删除原有Pod,观察新Pod是否自动调度至其他故障域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:20:30