如何为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,步骤如下:
- 部署第二个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),避免资源冲突
- 给每个Controller设置唯一的
- 调整Ingress配置
- prod namespace的Ingress指定
ingressClassName: nginx-prod,Host设为www.mywebsite.lan - dev namespace的Ingress指定
ingressClassName: nginx-dev,Host同样设为www.mywebsite.lan
- prod namespace的Ingress指定
- 验证效果
- 两个Controller的Service会分别拿到
192.168.171.10和192.168.171.1的IP - 客户端把
www.mywebsite.lan解析到对应IP时,就会进入对应的环境
- 两个Controller的Service会分别拿到
备注:内容来源于stack exchange,提问作者Julien
相关产品推荐
相关产品推荐

