Kubernetes Deployment节点调度配置及Ingress-Nginx Helm Chart适配咨询
定制Kubernetes Deployment调度策略及Ingress-Nginx适配方案
一、Deployment YAML配置
要实现目标调度逻辑,核心依赖Pod拓扑分布约束(TopologySpreadConstraints),配合集群自动扩缩容(Cluster Autoscaler)处理节点不足的场景。以下是满足需求的Deployment配置:
apiVersion: apps/v1 kind: Deployment metadata: name: sample-app spec: replicas: 4 # 可根据实际需求调整副本数 selector: matchLabels: app: sample-app template: metadata: labels: app: sample-app spec: topologySpreadConstraints: # 约束1:优先在现有节点均衡分布Pod - maxSkew: 1 topologyKey: kubernetes.io/hostname whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: app: sample-app # 约束2:副本数>2时必须分布在至少2个节点,节点不足时触发扩容 - maxSkew: 1 topologyKey: kubernetes.io/hostname whenUnsatisfiable: ScheduleAnyway labelSelector: matchLabels: app: sample-app minDomains: 2 nodeTaintsPolicy: HonorTaints containers: - name: sample-container image: nginx:alpine ports: - containerPort: 80
配置逻辑说明
- 第一个拓扑约束:通过
maxSkew:1保证Pod在节点间尽可能均衡分布,当无法满足均衡条件时暂不调度,对应副本数3/4时优先利用现有节点的需求。 - 第二个拓扑约束:
minDomains:2强制副本数>2时Pod必须分布在至少2个节点;若当前仅1个节点可用,该约束会导致Pod处于Pending状态,此时Cluster Autoscaler会检测到Pending Pod并自动扩容节点。 - 节点自动扩容需提前部署Cluster Autoscaler,并配置好节点组的扩缩容规则。
二、Ingress-Nginx Helm Chart适配
要给Ingress-Nginx的Pod应用相同调度逻辑,只需在Helm安装/升级时通过配置传递拓扑分布约束即可,以下提供两种实现方式:
方式1:通过自定义values.yaml配置
创建custom-ingress-values.yaml文件:
controller: replicaCount: 4 podLabels: app: ingress-nginx topologySpreadConstraints: - maxSkew: 1 topologyKey: kubernetes.io/hostname whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: app: ingress-nginx - maxSkew: 1 topologyKey: kubernetes.io/hostname whenUnsatisfiable: ScheduleAnyway labelSelector: matchLabels: app: ingress-nginx minDomains: 2 nodeTaintsPolicy: HonorTaints
执行安装/升级命令:
helm upgrade --install ingress-nginx ingress-nginx \ --namespace ingress-nginx --create-namespace \ -f ./custom-ingress-values.yaml
方式2:命令行直接传递参数
无需编写values文件,直接通过--set参数配置:
helm upgrade --install ingress-nginx ingress-nginx \ --namespace ingress-nginx --create-namespace \ --set controller.replicaCount=4 \ --set controller.topologySpreadConstraints[0].maxSkew=1 \ --set controller.topologySpreadConstraints[0].topologyKey=kubernetes.io/hostname \ --set controller.topologySpreadConstraints[0].whenUnsatisfiable=DoNotSchedule \ --set controller.topologySpreadConstraints[0].labelSelector.matchLabels.app=ingress-nginx \ --set controller.topologySpreadConstraints[1].maxSkew=1 \ --set controller.topologySpreadConstraints[1].topologyKey=kubernetes.io/hostname \ --set controller.topologySpreadConstraints[1].whenUnsatisfiable=ScheduleAnyway \ --set controller.topologySpreadConstraints[1].labelSelector.matchLabels.app=ingress-nginx \ --set controller.topologySpreadConstraints[1].minDomains=2 \ --set controller.topologySpreadConstraints[1].nodeTaintsPolicy=HonorTaints
补充说明
- 节点自动扩容同样依赖Cluster Autoscaler,需确保已部署并正确配置节点组的扩缩容阈值。
- 若Ingress-Nginx使用DaemonSet模式,需改为Deployment模式(默认即为Deployment)才能配置副本数和拓扑约束。
内容的提问来源于stack exchange,提问作者tobias
相关产品推荐
相关产品推荐

