在nginx入口后面为web应用程序设置外部身份验证时有问题。当我尝试从外部访问https://site.example.com时,我没有重定向到Github登录,直接访问web应用程序也会发生。
为我的环境运行Pods:
NAME READY STATUS
nginx-ingress-68df4dfc4f-wpj5t 1/1 Running
oauth2-proxy-6675d4b57c-cspw8 1/1 Running
web-deployment-7d4bd85b46-blxb8 1/1 Running
web-deployment-7d4bd85b46-nqjgl 1/1 Running 现役服务:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
nginx-ingress LoadBalancer 10.96.156.157 192.168.1.82 80:31613/TCP,443:32437/TCP
oauth2-proxy ClusterIP 10.100.101.251 <none> 4180/TCP
web-service ClusterIP 10.108.237.188 <none> 8080/TCP 两项外来资源:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress
namespace: nginx-ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/auth"
nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/start?rd=$request_uri"
labels:
app: webapp
spec:
rules:
- host: site.example.com
http:
paths:
- path: /
backend:
serviceName: web-service
servicePort: 8080
tls:
- hosts:
- site.example.com
secretName: example-tlsapiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: oauth2-proxy
namespace: nginx-ingress
annotations:
kubernetes.io/ingress.class: nginx
labels:
app: oauth2-proxy
spec:
rules:
- host: site.example.com
http:
paths:
- backend:
serviceName: oauth2-proxy
servicePort: 4180
path: /oauth2
tls:
- hosts:
- site.example.com
secretName: example-tls进口产出:
NAME CLASS HOSTS ADDRESS PORTS
ingress <none> site.example.com 192.168.1.82 80, 443
oauth2-proxy <none> site.example.com 80, 443 我看到这些错误发生在IntruOAuth2-Proxy事件中:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning Rejected 54m nginx-ingress-controller All hosts are taken by other resourcesOAuth2-根据在我的这里帐户中创建的OAuth应用程序,使用带有客户端ID、客户端秘密和机密的部署OAuth构建代理。
在oauth2-proxy日志中没有找到任何日志,我想是因为它在进程中没有被调用。
更新
这个问题是不完整的,我忘了提到NGINX的图像显示(来自安装指南的Nginx1.9.0)。
用以下方法更改图像:
NGINX Ingress controller
Release: v0.41.2
Build: d8a93551e6e5798fc4af3eb910cef62ecddc8938
Repository: https://github.com/kubernetes/ingress-nginx
nginx version: nginx/1.19.4错误消失。简单地说,从我的问题和从答案的另一个入侵配置是有效的。
发布于 2020-11-03 15:38:18
在您的配置中,您正在使用2 入口。正如您所描述的oauth2-proxy Ingress,在Event部分您可以找到以下信息:
所有主机都被其他资源占用。
您在这里遇到的问题称为主机碰撞。它发生在您使用过的两个Ingress中:
spec:
rules:
- host: site.example.com在这种情况下,Ingress使用名为选择获胜者的默认算法。
如果多个资源争夺同一个主机,
Ingress Controller将根据资源的creationTimestamp选择赢家:最老的资源将获胜。
您的问题的快速解决方案是创建一个具有两个路径的Ingress。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress
namespace: nginx-ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/auth"
nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/start?rd=$request_uri"
spec:
rules:
- host: site.example.com
http:
paths:
- path: /
backend:
serviceName: web-service
servicePort: 8080
- path: /oauth2
backend:
serviceName: oauth2-proxy
servicePort: 4180
tls:
- hosts:
- site.example.com
secretName: example-tls解决这个问题的另一种方法是使用合并同一主机的配置,但是在这个场景中不应该应用它。
作为最后一件事,您可以遵循正式的Nginx教程- 外部OAUTH认证。
https://stackoverflow.com/questions/64590283
复制相似问题