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

如何为Kubernetes的Nginx Ingress Controller配置两个外部IP以区分开发与生产环境?

如何为Kubernetes的Nginx Ingress Controller配置两个外部IP以区分开发与生产环境?

嘿,先帮你理清当前的核心误区,再给你两种可行的方案,都是符合K8s规范的~

你当前配置的问题所在

你现在的核心误解是:单个Nginx Ingress Controller的LoadBalancer Service只会绑定一个外部IP,不管你创建多少个Ingress资源,它们都会复用这个IP,靠HTTP请求里的Host头来区分不同的后端服务。

你看到两个Ingress都显示192.168.171.1,是因为你的单个Ingress Controller Service从MetalLB的ac3-dev-ippool拿到了这个IP,所有Ingress资源都会关联到这个IP上。另外你在Ingress里加的metallb.universe.tf/address-pool注解其实是无效的——这个注解是给LoadBalancer类型的Service用的,不是给Ingress资源用的哦!

方案一:用单个Ingress Controller(更简洁,推荐)

如果可以调整域名策略,这个方案是最符合K8s最佳实践的:

  • 保留现有的单个Ingress Controller,把两个Ingress的Host改成对应的子域名,比如dev.mywebsite.lan(dev namespace)和prod.mywebsite.lan(prod namespace)
  • 把这两个子域名都解析到Ingress Controller的外部IP(不管是192.168.171.1还是192.168.171.10,统一即可)
  • 这样客户端访问不同子域名时,Ingress会自动转发到对应namespace的服务,不需要区分IP

方案二:部署两个独立的Ingress Controller(满足你“同域名+不同IP”的需求)

如果必须实现“同一个域名解析到不同IP进入不同环境”,那就要部署两个独立的Ingress Controller,步骤如下:

  1. 部署第二个Ingress Controller
    • 给每个Controller设置唯一的ingressClassName,比如nginx-dev和nginx-prod
    • 每个Controller对应的LoadBalancer Service添加MetalLB IP池注解(示例):
      # prod环境的Ingress Controller Service注解
      metadata:
        annotations:
          metallb.universe.tf/address-pool: ac3-prod-ippool
      
      # dev环境的Ingress Controller Service注解
      metadata:
        annotations:
          metallb.universe.tf/address-pool: ac3-dev-ippool
      
    • 建议把两个Controller部署在独立的namespace(比如ingress-nginx-dev和ingress-nginx-prod),避免资源冲突
  2. 调整Ingress配置
    • prod namespace的Ingress指定ingressClassName: nginx-prod,Host设为www.mywebsite.lan
    • dev namespace的Ingress指定ingressClassName: nginx-dev,Host同样设为www.mywebsite.lan
  3. 验证效果
    • 两个Controller的Service会分别拿到192.168.171.10和192.168.171.1的IP
    • 客户端把www.mywebsite.lan解析到对应IP时,就会进入对应的环境

备注:内容来源于stack exchange,提问作者Julien

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 13:23:13