nginx - oauth2-proxy 身份验证在 kubernetes 集群上调用缓慢,并带有 nginx 入口的身份验证注释

标签 nginx kubernetes oauth proxy

我们已经使用 this page 中描述的方法保护了 K8S 集群上的一些服务。 .具体来说,我们有:

  nginx.ingress.kubernetes.io/auth-url: "https://oauth2.${var.hosted_zone}/oauth2/auth"
  nginx.ingress.kubernetes.io/auth-signin: "https://oauth2.${var.hosted_zone}/oauth2/start?rd=/redirect/$http_host$escaped_request_uri"

设置要保护的服务,我们已关注 this tutorial每个集群只有一个 oauth2_proxy 部署。我们设置了 2 个代理,它们都具有与 nginx 入口放在同一节点上的亲缘关系。
$ kubectl get pods -o wide -A | egrep "nginx|oauth"                                                                    
infra-system   wer-exp-nginx-ingress-exp-controller-696f5fbd8c-bm5ld        1/1     Running   0          3h24m   10.76.11.65    ip-10-76-9-52.eu-central-1.compute.internal     <none>           <none>
infra-system   wer-exp-nginx-ingress-exp-controller-696f5fbd8c-ldwb8        1/1     Running   0          3h24m   10.76.14.42    ip-10-76-15-164.eu-central-1.compute.internal   <none>           <none>
infra-system   wer-exp-nginx-ingress-exp-default-backend-7d69cc6868-wttss   1/1     Running   0          3h24m   10.76.15.52    ip-10-76-15-164.eu-central-1.compute.internal   <none>           <none>
infra-system   wer-exp-nginx-ingress-exp-default-backend-7d69cc6868-z998v   1/1     Running   0          3h24m   10.76.11.213   ip-10-76-9-52.eu-central-1.compute.internal     <none>           <none>
infra-system   oauth2-proxy-68bf786866-vcdns                                 2/2     Running   0          14s     10.76.10.106   ip-10-76-9-52.eu-central-1.compute.internal     <none>           <none>
infra-system   oauth2-proxy-68bf786866-wx62c                                 2/2     Running   0          14s     10.76.12.107   ip-10-76-15-164.eu-central-1.compute.internal   <none>           <none>

但是,一个简单的网站加载通常需要大约 10 秒,而安全服务上不存在代理注释时需要 2-3 秒。

我们添加了一个 proxy_cacheauth.domain.com通过添加托管我们代理的服务
        "nginx.ingress.kubernetes.io/server-snippet": <<EOF
          proxy_cache auth_cache;
          proxy_cache_lock on;
          proxy_ignore_headers Cache-Control;
          proxy_cache_valid any 30m;
          add_header X-Cache-Status $upstream_cache_status;
        EOF

但这也没有改善延迟。我们仍然看到所有 HTTP 请求在我们的代理中触发了一个日志行。奇怪的是,只有一些请求需要 5 秒。
enter image description here

我们不确定:
- 代理将每个请求转发给 oauth 提供者 (github) 或
- 缓存认证

我们使用 cookie 身份验证,因此理论上 oauth2_proxy 应该只是解密 cookie,然后向 nginx 入口返回 200。因为它们都在同一个节点上,所以应该很快。但事实并非如此。有任何想法吗?

编辑 1

我进一步分析了情况。使用 https://oauth2.domain.com/auth 访问我的身份验证服务器在浏览器中复制请求 copy for curl我找到:
  • 从我的本地机器(通过 curl)对我的 oauth 服务器运行 10.000 次查询非常快
  • 在具有相同 curl 的 nginx 入口上运行 100 个请求很慢
  • 用auth服务的集群IP替换curl中的主机名,性能大幅提升
  • 将注释设置为 nginx.ingress.kubernetes.io/auth-url: http://172.20.95.17/oauth2/auth (例如设置主机 == 集群 IP)使 GUI 加载按预期(快速)
  • curl 是在 nginx-ingress 上还是在任何其他 pod(例如测试 debian)上运行都没有关系,结果是相同的

  • 编辑 2

    我发现一个更好的解决方法是将注释设置为以下内容
      nginx.ingress.kubernetes.io/auth-url: "http://oauth2.infra-system.svc.cluster.local/oauth2/auth"
      nginx.ingress.kubernetes.io/auth-signin: "https://oauth2.domain.com/oauth2/start?rd=/redirect/$http_host$escaped_request_uri"
    
    auth-url是入口用用户的 cookie 查询的内容。因此,oauth2 服务的本地 DNS 与外部 dns 名称相同,但没有 SSL 通信,并且由于它是 DNS,它是永久性的(而集群 IP 则不是)

    最佳答案

    鉴于不太可能有人想出为什么会发生这种情况,我会回答我的解决方法。

    我发现的一个修复是将注释设置为以下内容

      nginx.ingress.kubernetes.io/auth-url: "http://oauth2.infra-system.svc.cluster.local/oauth2/auth"
      nginx.ingress.kubernetes.io/auth-signin: "https://oauth2.domain.com/oauth2/start?rd=/redirect/$http_host$escaped_request_uri"
    
    auth-url是入口用用户的 cookie 查询的内容。因此,oauth2 服务的本地 DNS 与外部 dns 名称相同,但没有 SSL 通信,并且由于它是 DNS,它是永久性的(而集群 IP 则不是)

    关于nginx - oauth2-proxy 身份验证在 kubernetes 集群上调用缓慢,并带有 nginx 入口的身份验证注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58997958/

    相关文章:

    azure - 如何将任何 Azure Active Directory (AD) 用户登录到连接到 Office 365 Sharepoint Online API 的共享 native 应用程序

    ssl - 无法重启 nginx https 证书例程私钥不匹配

    javascript - 无法在 ember 中向后端服务器发出请求(错误 :'No Access-Control-Allow-Origin' )

    kubernetes - Knative 服务 URL

    kubernetes - Kubernetes中CPU和核心是什么意思?

    oauth - 在 linkedin 应用程序中哪里可以找到 Oauth token 和 secret

    Laravel Passport - 创建用户时自动创建 token

    nginx - 默认情况下无法使用Nginx打开index.php

    ruby-on-rails - Rails 4 和 Nginx + 乘客的缓存问题

    kubernetes - 加入集群需要永远