单Ingress文件下在Ingress Controller中仅为单个应用配置OAuth规则的方法
解决方案
以下两种方案均满足所有应用声明保留在同一个Ingress文件中的约束。
方案1:同文件多Ingress资源(推荐)
该方案完全兼容官方OAuth注解,无需自定义NGINX配置,稳定性和可维护性最高。你可以在同一个YAML文件中定义多个Ingress资源,使用---分隔,每个Ingress资源负责同一个主机下的不同路径,OAuth相关注解仅写在需要认证的应用对应的Ingress资源上即可。
示例配置:
# 无需认证的公共应用Ingress配置 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: public-app-ingress annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: your-business-domain.com http: paths: - path: /public-app pathType: Prefix backend: service: name: public-app-svc port: number: 80 --- # 需要OAuth认证的私有应用Ingress配置 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: private-app-ingress annotations: kubernetes.io/ingress.class: "nginx" # 替换为你实际使用的OAuth配置注解,以下为OAuth2 Proxy的通用示例 nginx.ingress.kubernetes.io/auth-url: "https://oauth2-proxy.your-domain.com/oauth2/auth" nginx.ingress.kubernetes.io/auth-signin: "https://oauth2-proxy.your-domain.com/oauth2/start?rd=$escaped_request_uri" spec: rules: - host: your-business-domain.com http: paths: - path: /private-app pathType: Prefix backend: service: name: private-app-svc port: number: 80
NGINX Ingress Controller会自动合并同一个域名下所有Ingress资源的路径配置,每个Ingress的注解仅对自身包含的路径生效。
方案2:单Ingress资源配置(适用于必须单资源的场景)
如果你必须将所有路径写在同一个Ingress资源中,可以通过nginx.ingress.kubernetes.io/configuration-snippet注解强制覆盖特定路径的认证规则,全局开启OAuth后单独关闭公共路径的认证即可。
示例配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: all-in-one-ingress annotations: kubernetes.io/ingress.class: "nginx" # 全局配置OAuth认证 nginx.ingress.kubernetes.io/auth-url: "https://oauth2-proxy.your-domain.com/oauth2/auth" nginx.ingress.kubernetes.io/auth-signin: "https://oauth2-proxy.your-domain.com/oauth2/start?rd=$escaped_request_uri" # 针对不需要认证的公共路径单独关闭认证 nginx.ingress.kubernetes.io/configuration-snippet: | location ~ ^/public-app(/|$)(.*) { auth_basic off; auth_request off; proxy_pass http://upstream_balancer; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } spec: rules: - host: your-business-domain.com http: paths: - path: /public-app pathType: Prefix backend: service: name: public-app-svc port: number: 80 - path: /private-app pathType: Prefix backend: service: name: private-app-svc port: number: 80
注意:此方案需要熟悉NGINX配置规则,snippet优先级高于Ingress默认生成的location规则,需要保证路径匹配顺序符合预期。
内容的提问来源于stack exchange,提问作者devio
相关产品推荐
相关产品推荐

