首页 > 解决方案 > Nginx 入口控制器身份验证不起作用

问题描述

我正在运行一个 gke 集群(v1.16.15gke.4300)并且 nginx 入口身份验证失败。下面的代码片段用于外部 oauth2 身份验证,但即使是基本身份验证也不起作用。似乎 nginx 完全忽略了这些注释。

带有 google api 的 oauth2 代理实际上工作正常,但 nginx 没有在他自己的配置中包含 auth 配置。我可以很容易地在 nginx 运行的 pod 上检查它。那里没有身份验证。

nginx入口控制器:

  repoURL: 'https://helm.nginx.com/stable'
  targetRevision: 0.6.1
  version: nginx/1.19.2

受 oauth2 保护的入口服务的实时清单:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    ingress.kubernetes.io/auth-signin: https://oauth2.####.net/oauth2/start?rd=$escaped_request_uri
    ingress.kubernetes.io/auth-url: https://oauth2.####.net/oauth2/auth
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":##########}
  creationTimestamp: "####"
  finalizers:
  - networking.gke.io/ingress-finalizer-V2
  generation: 1
  labels:
    argocd.argoproj.io/instance: k8s-default
  name: dashboard-ingress
  namespace: kubernetes-dashboard
  resourceVersion: "22174124"
  selfLink: /apis/extensions/v1beta1/namespaces/kubernetes-dashboard/ingresses/dashboard-ingress
  uid: 34263f6b-6818-403f-####-4c6acb196c49
spec:
  rules:
  - host: dashboard.###.net
    http:
      paths:
      - backend:
          serviceName: kdashboard-kubernetes-dashboard
          servicePort: 8080
        path: /
  tls:
  - hosts:
    - dashboard.###.net
    secretName: reflect-certificate-secret-internal
status:
  loadBalancer:
    ingress:
    - ip: ##.##.##.##

运行该服务时,我永远不会得到 403/401:

curl -I 'https://dashboard.###.net/'
HTTP/1.1 200 OK
Server: nginx/1.19.2
Date: Mon, 14 Dec 2020 19:50:05 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 1272
Connection: keep-alive
Accept-Ranges: bytes
Cache-Control: no-store
Last-Modified: Mon, 22 Jun 2020 14:25:00 GMT

标签: nginxkubernetesbasic-authenticationnginx-ingress

解决方案


编辑:

根据您提供的信息,您似乎使用的是Nginxinc 入口控制器,而不是NGINX 入口控制器,它们不一样。Nginxinc Ingress Controller 与kubernetes/ingress-nginx repo中的 NGINX Ingress 控制器不同,也与默认的GKE Ingress Controller不同。影响您的用例的主要区别是它们都使用不同的注释,并且这些注释只能由适当的控制器来满足。您可以在此处此处找到上述内容之间的主要区别。

以下是一些有用的文档/指南:

总结一下:

  • 选择合适的控制器来满足您要使用的注释。

  • 请记住,不同的控制器可能使用不同的注释(nginxincnginx)。

  • 使用kubernetes.io/ingress.class:注释选择安装在 GKE 集群上的控制器。


推荐阅读