如何将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
关键说明
- 拓扑标签适配:
topologyKey需替换为你的Kubernetes集群中标识故障域的节点标签,常见值包括:topology.kubernetes.io/zone(Kubernetes标准标签)failure-domain.beta.kubernetes.io/zone(旧版兼容标签)- 自定义标签(如
company.com/failure-domain,若集群使用自定义标识)
- 调度逻辑:
- 第一个Pod会被调度至任意可用故障域的节点;
- 后续所有Pod会强制调度至与第一个Pod相同故障域的节点;
- 当该故障域内所有节点失效时,新Pod(如滚动更新、故障恢复时创建的Pod)会自动寻找其他可用故障域,无需修改配置。
- 规则特性:
requiredDuringSchedulingIgnoredDuringExecution表示调度时强制检查亲和规则,但Pod运行后忽略规则变更,确保故障域失效时新Pod能正常调度至其他域。
验证方式
- 部署后查看Pod所在节点的故障域:
kubectl get pods -o wide | awk '{print $1, $7}' kubectl describe node <node-name> | grep "topology.kubernetes.io/zone" - 模拟故障域失效(如关闭该域所有节点),触发Deployment滚动更新或删除原有Pod,观察新Pod是否自动调度至其他故障域。
内容的提问来源于stack exchange,提问作者mdnfiras
相关产品推荐
相关产品推荐

