You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置ingress-nginx Helm Chart以确保Ingress Controller Pod运行在所有部署后端服务Pod的节点上

解决Ingress Controller仅在有后端服务的节点上部署的方案

刚好在DigitalOcean的K8s集群里折腾过类似的需求,核心思路是用DaemonSet替代默认的Deployment,再配合节点亲和性精准调度Ingress Controller Pod到目标节点,同时保留externalTrafficPolicy: Local的设置。具体步骤如下:

1. 给后端服务所在节点打标签

首先得给运行后端Pod的节点统一打上识别标签,方便Ingress Controller精准识别。比如我们用backend-node: true这个标签:

# 替换成你的节点名称,给每个有后端Pod的节点打标签
kubectl label node do-k8s-nyc1-01 backend-node=true
kubectl label node do-k8s-nyc1-02 backend-node=true

如果你的后端服务已经通过nodeSelector固定调度到特定节点,直接用那个节点标签即可,无需新增。

2. 配置Ingress-Nginx Helm Chart

默认Ingress-Nginx用的是Deployment,我们需要改成DaemonSet(确保每个匹配节点跑一个Pod),同时配置节点亲和性只调度到打了标签的节点,还要保留externalTrafficPolicy: Local。

方式一:用values.yaml配置

创建一个ingress-values.yaml文件,内容如下:

controller:
  # 把部署类型从Deployment改为DaemonSet
  kind: DaemonSet
  # 节点选择器,只调度到有backend-node=true标签的节点
  nodeSelector:
    backend-node: "true"
  # 可选:如果需要更灵活的亲和规则(比如多标签匹配),可以用affinity字段替代nodeSelector
  # affinity:
  #   nodeAffinity:
  #     requiredDuringSchedulingIgnoredDuringExecution:
  #       nodeSelectorTerms:
  #       - matchExpressions:
  #         - key: backend-node
  #           operator: In
  #           values:
  #           - "true"
  # 保留externalTrafficPolicy: Local设置
  service:
    externalTrafficPolicy: Local
  # 可选:配置Pod资源限制,避免占用过多节点资源
  resources:
    requests:
      cpu: 100m
      memory: 128Mi
    limits:
      cpu: 500m
      memory: 256Mi

然后用Helm安装/升级:

helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --create-namespace \
  -f ingress-values.yaml

方式二:直接用--set参数快速配置

如果不想写yaml文件,可以直接用命令行参数:

helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --create-namespace \
  --set controller.kind=DaemonSet \
  --set controller.nodeSelector.backend-node=true \
  --set controller.service.externalTrafficPolicy=Local

3. 验证配置生效

执行以下命令查看Ingress Controller Pod的调度情况:

kubectl get pods -n ingress-nginx -o wide

你会看到每个打了backend-node=true标签的节点上都运行了一个Ingress Controller Pod,且只会在这些节点上部署。

额外注意事项

  • 如果后续后端服务调度到了新的节点,只需要给新节点打上相同的标签,DaemonSet会自动在新节点上启动Ingress Controller Pod。
  • 如果需要自动化节点标签(比如后端Pod调度到节点后自动打标签),可以考虑用Kubernetes Admission Webhook或者第三方工具,不过静态节点场景下手动打标签就足够简单可靠。

内容的提问来源于stack exchange,提问作者TobyG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 19:12:33