我的头脑围绕着topologySpreadConstraints,但我被困在这一点上。 我的 7 个部署中的所有 2-Pod 对都安排在同一区域 europe-west1-b 中。没有一个部署分布在 2 个区域中。值得一提的是,以前在不同区域进行调度通常是有效的。当在没有拓扑SpreadConstraints 的情况下启动 2 个或更多副本时,Pod 会跨区域(或分别在同一区域中)随机调度。 同样重要的是:我已经有 3 个“占位符”部署,分别将它们强制安排在区域 b、c 和 d 中。 e.我的集群保证在所有 3 个区域中都有节点。
我的清单现在看起来都是这样的(服务名称不同;容器已被删除):
apiVersion: apps/v1
kind: Deployment
metadata:
name: some-microservice
namespace: some-namespace
labels:
app: some-microservice
spec:
replicas: 2
selector:
matchLabels:
app: some-microservice
template:
metadata:
labels:
app: some-microservice
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: some-microservice
nodeSelector:
cloud.google.com/gke-spot: "true"
我还尝试了“zone”而不是“topology.kubernetes.io/zone”,因为这是 kubernetes.io 上记录的方式,但是根本没有安排第二个 Pod。
解决了!
我提到我在 b、c 和 d 区安排了 3 个“占位符”部署。情况确实如此,但我忘记添加
cloud.google.com/gke-spot: "true"
节点选择器,因此创建了非点节点。这就导致了 Kubernetes 调度器确实无法在类型为“spot”的区域 c 和 d 中找到任何合适的节点的问题。
这种情况再次强调了这样一个事实:GKE Autopilot 中需要这些“节点占位符”部署来保证所有区域中节点的存在。