首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Kubernetes中用Nginx进行外部OAuth认证

在Kubernetes中用Nginx进行外部OAuth认证
EN

Stack Overflow用户
提问于 2020-10-29 11:32:39
回答 1查看 1.7K关注 0票数 0

在nginx入口后面为web应用程序设置外部身份验证时有问题。当我尝试从外部访问https://site.example.com时,我没有重定向到Github登录,直接访问web应用程序也会发生。

为我的环境运行Pods:

代码语言:javascript
复制
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   

现役服务:

代码语言:javascript
复制
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                     

两项外来资源:

代码语言:javascript
复制
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-tls
代码语言:javascript
复制
apiVersion: 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

进口产出:

代码语言:javascript
复制
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事件中:

代码语言:javascript
复制
Events:
  Type     Reason    Age   From                      Message
  ----     ------    ----  ----                      -------
  Warning  Rejected  54m   nginx-ingress-controller  All hosts are taken by other resources

OAuth2-根据在我的这里帐户中创建的OAuth应用程序,使用带有客户端ID、客户端秘密和机密的部署OAuth构建代理。

在oauth2-proxy日志中没有找到任何日志,我想是因为它在进程中没有被调用。

更新

这个问题是不完整的,我忘了提到NGINX的图像显示(来自安装指南的Nginx1.9.0)。

用以下方法更改图像:

代码语言:javascript
复制
NGINX Ingress controller
Release: v0.41.2
Build: d8a93551e6e5798fc4af3eb910cef62ecddc8938
Repository: https://github.com/kubernetes/ingress-nginx
nginx version: nginx/1.19.4

错误消失。简单地说,从我的问题和从答案的另一个入侵配置是有效的。

EN

回答 1

Stack Overflow用户

发布于 2020-11-03 15:38:18

在您的配置中,您正在使用2 入口。正如您所描述的oauth2-proxy Ingress,在Event部分您可以找到以下信息:

所有主机都被其他资源占用。

您在这里遇到的问题称为主机碰撞。它发生在您使用过的两个Ingress中:

代码语言:javascript
复制
spec:
  rules:
  - host: site.example.com

在这种情况下,Ingress使用名为选择获胜者的默认算法。

如果多个资源争夺同一个主机,Ingress Controller将根据资源的creationTimestamp选择赢家:最老的资源将获胜。

您的问题的快速解决方案是创建一个具有两个路径的Ingress

代码语言:javascript
复制
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认证

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64590283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档