如何列出特定zone中运行的pod?多可用区集群如何保证pod分布到各zone?
K8s 多可用区使用问题解答
1、查询运行在特定可用区下的所有Pod
K8s 集群节点默认会携带可用区相关标签,1.17+版本标签为 topology.kubernetes.io/zone,更早版本为 failure-domain.beta.kubernetes.io/zone,你可以通过标签筛选出对应可用区的节点,再匹配节点上运行的Pod即可。
分步操作(不易出错,适合手动查询)
- 首先筛选目标可用区的所有节点,假设你要查询的可用区为
cn-shanghai-a:
kubectl get nodes -l topology.kubernetes.io/zone=cn-shanghai-a
记下返回的节点名称列表。
2. 筛选指定节点上运行的所有Pod,替换<节点名1>,<节点名2>为上一步拿到的节点名,用英文逗号分隔:
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<节点名1>,<节点名2>
单行命令(适合脚本自动化调用)
直接合并两步操作,无需手动复制节点名:
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=$(kubectl get nodes -l topology.kubernetes.io/zone=cn-shanghai-a -o jsonpath='{.items[*].metadata.name}' | tr ' ' ',')
2、配置Pod分布到集群的每一个可用区
推荐使用 Pod拓扑分布约束(Pod Topology Spread Constraints) 实现,该特性在K8s 1.19版本正式GA,可以灵活控制Pod在不同拓扑维度的分布策略。
配置示例(硬约束,必须每个可用区都有Pod)
假设你的集群共有3个可用区,Deployment副本数设置≥3即可保证每个可用区至少有1个Pod:
apiVersion: apps/v1 kind: Deployment metadata: name: biz-app spec: replicas: 6 # 副本数建议设置为可用区数量的整数倍,分布更均匀 selector: matchLabels: app: biz-app template: metadata: labels: app: biz-app spec: # 拓扑分布约束核心配置 topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: app: biz-app containers: - name: biz-app image: your-image-address:tag
配置参数说明
maxSkew: 1:任意两个可用区之间的该应用Pod数量差最大为1,保证分布绝对均匀topologyKey: topology.kubernetes.io/zone:指定按照可用区作为分布的维度whenUnsatisfiable: DoNotSchedule:如果分布规则不满足,新Pod就不调度,属于硬约束;如果可以接受极端情况优先保证Pod运行,改成ScheduleAnyway就是软约束labelSelector:匹配要做分布控制的Pod标签,不要写错
低版本K8s替代方案(1.19版本之前)
如果集群版本较低,可以用Pod反亲和性实现,适合副本数和可用区数量完全一致的场景:
spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: biz-app topologyKey: topology.kubernetes.io/zone
该配置的效果是同一个可用区下不会调度两个相同标签的Pod,只要副本数等于可用区数量,就能实现每个可用区一个Pod。
内容的提问来源于stack exchange,提问作者kr_devops
相关产品推荐
相关产品推荐

