如何配置topologySpreadConstraints固定K8s Pod在指定可用区的分布?
解决方案
要实现Pod始终固定在zone-a运行3个、zone-b运行2个,仅靠topologySpreadConstraints做不到——它的作用是维持副本分布的最大偏差(这里maxSkew=1允许差1),但没法强制指定每个zone的精确副本数。最可靠的方式是把原Deployment拆分为两个独立的Deployment,分别绑定到目标zone并设置对应副本数:
方法:拆分Deployment + Node Affinity
1. 针对zone-a的Deployment(3副本)
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-zone-a labels: app: nginx zone: a spec: replicas: 3 selector: matchLabels: app: nginx zone: a template: metadata: labels: app: nginx zone: a spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - a containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
2. 针对zone-b的Deployment(2副本)
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-zone-b labels: app: nginx zone: b spec: replicas: 2 selector: matchLabels: app: nginx zone: b template: metadata: labels: app: nginx zone: b spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - b containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
为什么不继续用topologySpreadConstraints?
topologySpreadConstraints的设计目标是均衡分布,而非精确配额。当总副本数无法被zone数量整除时(比如5个副本分2个zone),它只会保证各zone的副本数差距不超过maxSkew,但不会强制指定哪个zone多一个。拆分Deployment的方式能直接锁定每个zone的副本数,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Boris
相关产品推荐
相关产品推荐

