oauth2代理身份验证在kubernetes集群上调用慢,带有针对nginx入口的身份验证注释

oauth2代理身份验证在kubernetes集群上调用慢,带有针对nginx入口的身份验证注释,nginx,kubernetes,oauth,proxy,Nginx,Kubernetes,Oauth,Proxy,我们已经使用上描述的方法在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

我们已经使用上描述的方法在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"
在要保护的服务上设置,我们遵循的是每个集群只部署一个oauth2_代理。我们已经设置了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>
但这也没有改善延迟。我们仍然可以看到所有HTTP请求在代理中触发日志行。奇怪的是,只有一些请求需要5秒钟。

我们不确定是否: -代理将每个请求转发给oauth提供程序(github)或 -缓存身份验证

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

编辑1 我进一步分析了情况。使用
https://oauth2.domain.com/auth
在浏览器中复制请求
copy for curl
我发现:

  • 从本地机器(通过curl)对oauth服务器运行10.000个查询非常快
  • 使用相同的curl在nginx入口上运行100个请求很慢
  • 将curl中的主机名替换为auth服务的集群IP可以显著提高性能
  • 将注释设置为
    nginx.ingres.kubernetes.io/auth-url:http://172.20.95.17/oauth2/auth
    (例如,设置主机==群集IP)使GUI按预期加载(fast)
  • 无论curl是在nginx入口上运行还是在任何其他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"
    
      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"
    
      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.ingres.kubernetes.io/auth-url:https://oauth2.${var.hosted_zone}/oauth2/auth“

    设置 由于这一事实,
    auth server
    URL解析为外部服务(在这种情况下,是位于入口控制器前面的负载平衡器VIP)

    实际上,这意味着,您可以使用集群之外的流量(所谓的模式),然后通过路由到内部ClusterIP服务(增加额外跳数)的外部入口IP返回,而不是直接使用ClusterIP/服务DNS名称(您留在集群内) 库伯内特斯星系团):


    您使用的是哪个版本的Kubernetes?@DawidKruk是AWS EKSIs上的1.14您提供的编辑2是问题的解决方案?这是一种解决方法,但不是解释为什么会发生这种情况。尽管我意识到这可能不会被任何人解决,除非他们碰巧遇到与我完全相同的问题,这是不可能的,考虑到这个问题所处的高度专业化的生态位