如何配置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
相关产品推荐
相关产品推荐

