如何在GKE中给节点打标签并自动实现Pod按命名空间调度到指定节点
实现步骤
1. 拆分GKE节点池(核心解决节点更新自动继承配置问题)
把原有3节点的单节点池拆分为两个独立节点池即可,GKE节点池的所有节点会自动继承节点池配置的标签、污点,节点升级、自动修复、扩缩容产生的新节点都会自动带上配置,完全不需要手动干预:
- 非生产节点池:配置节点数量为1,添加如下配置
- 节点标签:
node-env: non-prod - 节点污点:
node-env=non-prod:NoSchedule(作用:禁止未容忍该污点的Pod调度到该节点,避免生产负载跑到非生产节点抢占资源)
- 节点标签:
- 生产节点池:配置节点数量为2(后续可按需扩容),添加如下配置
- 节点标签:
node-env: prod - 可选配置污点:
node-env=prod:NoSchedule(如果希望严格禁止非生产Pod调度到生产节点,就加这个污点,否则可以不加,生产节点允许空闲时被其他负载使用)
- 节点标签:
注意:拆分节点池时可先完成新节点池创建,再逐步驱逐旧节点池的Pod,不会影响现有业务运行。
2. 配置命名空间默认调度规则
给对应命名空间配置默认的Pod调度亲和性和容忍度,推荐用GKE支持的PodDefault资源,给每个命名空间下的Pod自动注入调度配置,不需要修改业务的YAML文件:
给dev/qa/stage命名空间注入配置
给这三个命名空间分别创建如下PodDefault,自动给所有Pod添加容忍度和节点亲和性,优先调度到非生产节点:
apiVersion: kubeflow.org/v1alpha1 kind: PodDefault metadata: name: non-prod-scheduling namespace: dev # 同理给qa、stage命名空间各创建一份 spec: selector: matchLabels: {} # 匹配该命名空间下所有Pod tolerations: - key: "node-env" operator: "Equal" value: "non-prod" effect: "NoSchedule" affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 preference: matchExpressions: - key: node-env operator: In values: ["non-prod"]
给prod命名空间注入配置
给prod命名空间创建如下PodDefault,优先调度到生产节点,同时允许使用其他空闲节点:
apiVersion: kubeflow.org/v1alpha1 kind: PodDefault metadata: name: prod-scheduling namespace: prod spec: selector: matchLabels: {} # 如果生产节点加了污点,这里要取消注释添加对应容忍度 # tolerations: # - key: "node-env" # operator: "Equal" # value: "prod" # effect: "NoSchedule" affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 preference: matchExpressions: - key: node-env operator: In values: ["prod"]
可选:严格隔离场景配置
如果要完全禁止非生产Pod跑到生产节点,只要给生产节点池加上node-env=prod:NoSchedule的污点,并且只给prod命名空间的Pod加对应容忍度即可,完全实现资源隔离,非生产负载无论如何都不会占用生产节点资源。
内容的提问来源于stack exchange,提问作者JorgeeFG
相关产品推荐
相关产品推荐

