自建K8s集群创建OAuth2-Proxy Ingress后应用Ingress失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-proxyIngress配置: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

