在带有nginx入口的auth批注的kubernetes集群上,oauth2-proxy身份验证调用变慢

时间:2019-11-22 16:10:51

标签: 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_cache服务中添加了auth.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,然后将200返回到nginx入口。由于它们都在同一节点上,因此应该是快速的。但事实并非如此。有任何想法吗?

编辑1

我进一步分析了情况。使用浏览器中的https://oauth2.domain.com/auth访问我的身份验证服务器并复制请求copy for curl,我发现:

  1. 从我的本地计算机(通过curl)对我的oauth服务器运行10.000个查询非常快
  2. 在具有相同curl的nginx入口上运行100个请求很慢
  3. 用auth服务的群集IP替换curl中的主机名会使性能急剧提高
  4. 将注释设置为nginx.ingress.kubernetes.io/auth-url: http://172.20.95.17/oauth2/auth(例如,设置主机==群集IP)可使GUI加载达到预期的速度(快速)
  5. 无论是在nginx入口上还是在其他Pod(例如测试Debian)上运行curl,结果都相同

编辑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不是)

2 个答案:

答案 0 :(得分:0)

考虑到不太可能有人想到为什么发生这种情况,我将回答我的解决方法。

我发现的一个解决方法是将注释设置为以下

  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不是)

答案 1 :(得分:0)

我认为,在以下情况下,您会发现响应时间的延迟增加了:
const testData = [ ['input1', 'output1'], ['input2', 'output2'], ['input3', 'output3'], ] test.each(testData)('myFunc work correctly for %s',(input, output) =>{ expect(yourFunc(input)).toBe(output) })
设置 由于以下事实,nginx.ingress.kubernetes.io/auth-url: "https://oauth2.${var.hosted_zone}/oauth2/auth" URL解析为外部服务(在这种情况下,负载均衡器的VIP位于Ingress Controller的前面)。

实际上,这意味着您将集群外部的流量排除在外(所谓的hairpin模式),并通过路由到内部ClusterIP服务的外部入口IP返回(添加了额外的跃点),而是直接使用ClusterIP /服务DNS名称(您留在 Kubernetes集群):

auth server