如何在GKE集群两节点池调度Pod?需确保默认池至少运行1个Pod
实现GKE集群Pod的强制调度约束:至少1个Pod在default-pool
方案一:拆分Deployment(最稳妥)
直接把4个Pod拆成两个独立的Deployment,彻底避免调度不确定性:
- 第一个Deployment固定1个副本,通过
nodeAffinity强制调度到default-pool:
apiVersion: apps/v1 kind: Deployment metadata: name: app-default spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: cloud.google.com/gke-nodepool operator: In values: - default-pool containers: - name: my-container image: your-image:tag
- 第二个Deployment设置3个副本,可灵活调度(也可配置优先调度到temp-pool):
apiVersion: apps/v1 kind: Deployment metadata: name: app-temp spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 preference: matchExpressions: - key: cloud.google.com/gke-nodepool operator: In values: - temp-pool containers: - name: my-container image: your-image:tag
方案二:单Deployment结合拓扑分布约束+节点亲和性
如果不想拆分资源,可通过topologySpreadConstraints配合亲和性实现强制约束:
apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 4 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 50 preference: matchExpressions: - key: cloud.google.com/gke-nodepool operator: In values: - default-pool topologySpreadConstraints: - maxSkew: 3 topologyKey: cloud.google.com/gke-nodepool whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: app: my-app containers: - name: my-container image: your-image:tag
这里maxSkew:3限制两个节点池的Pod数量差不能超过3,总副本数为4时,调度器必须保证default-pool至少有1个Pod(否则temp-pool会有4个,差值为4,违反约束)。同时通过优先亲和性引导调度器优先往default-pool分配Pod。
注意事项
- GKE节点池默认标签为
cloud.google.com/gke-nodepool,若自定义过节点标签,需替换为对应的键名 - 方案一逻辑简单、绝对可靠;方案二适合不想拆分资源的场景,但需确保拓扑分布参数配置准确
内容的提问来源于stack exchange,提问作者iamarunk
相关产品推荐
相关产品推荐

