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

自建K8s集群创建OAuth2-Proxy Ingress后应用Ingress失IP的解决办法

问题:创建OAuth2-Proxy Ingress后应用Ingress丢失MetalLB分配的IP地址

我基于Ingress-Nginx的OAuth外部认证示例为Ingress搭建SSO服务,创建oauth2-proxy Ingress后,发现应用Ingress(cafe-ingress)不再拥有分配的IP地址。当前Ingress列表信息如下:

NAME           CLASS   HOSTS                                     ADDRESS                                             PORTS     AGE
cafe-ingress   nginx   becoming-pika-enormously.ngrok-free.app                                                       80, 443   6h2m
oauth2-proxy   nginx   becoming-pika-enormously.ngrok-free.app   172.16.1.145,172.16.2.0,172.16.2.108,172.16.2.109   80, 443   6h29m

我的Kubernetes集群采用MetalLB的ARP二层模式运行,请问该如何解决此问题?


原因分析

当两个Ingress资源使用完全相同的Host域名时,Ingress-Nginx Controller会将它们合并为同一个路由规则。此时只有最先创建(或优先级更高)的Ingress会关联MetalLB分配的IP地址,另一个Ingress的ADDRESS字段会为空——这是因为MetalLB是为Ingress Controller的Service分配IP,而Ingress Controller不会为同Host的多个Ingress单独分配IP。

解决方法

方法1:为两个Ingress配置不同子域名

修改其中一个Ingress的spec.rules.host字段,使用不同的子域名,例如:

  • 给oauth2-proxy Ingress配置:oauth.becoming-pika-enormously.ngrok-free.app
  • 保留becoming-pika-enormously.ngrok-free.app给cafe-ingress

两个Ingress属于不同Host后,MetalLB会正常为它们分配IP(或共享Ingress Controller Service的IP,取决于你的配置)。

方法2:合并两个Ingress的路由规则到同一资源

将oauth2-proxy和cafe-ingress的路由规则合并到单个Ingress资源中,避免同Host冲突。示例结构如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: unified-ingress
  annotations:
    # 保留原OAuth相关注解
    nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/auth"
    nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/start?rd=$escaped_request_uri"
spec:
  ingressClassName: nginx
  rules:
  - host: becoming-pika-enormously.ngrok-free.app
    http:
      paths:
      # OAuth2-Proxy路由
      - path: /oauth2
        pathType: Prefix
        backend:
          service:
            name: oauth2-proxy
            port: { number: 80 }
      # 应用服务路由
      - path: /coffee
        pathType: Prefix
        backend:
          service:
            name: coffee-svc
            port: { number: 80 }
      - path: /tea
        pathType: Prefix
        backend:
          service:
            name: tea-svc
            port: { number: 80 }

合并后,单个Ingress资源会正常获取MetalLB分配的IP,同时保留SSO认证和应用路由功能。

方法3:检查Ingress Controller与MetalLB的关联

确认Ingress Controller的Service类型为LoadBalancer,且MetalLB已为其分配IP:

kubectl get svc -n ingress-nginx

如果Service的EXTERNAL-IP字段有MetalLB分配的IP,说明问题确实是同Host Ingress合并导致的,采用上述两种方法即可解决;如果Service无IP,需要检查MetalLB配置(如地址池是否有可用IP、ARP模式是否正常运行)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 17:35:03