oauth2代理身份验证在kubernetes集群上调用慢,带有针对nginx入口的身份验证注释
我们已经使用上描述的方法在K8S集群上保护了我们的一些服务。具体而言,我们有: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
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
我发现:
nginx.ingres.kubernetes.io/auth-url:http://172.20.95.17/oauth2/auth
(例如,设置主机==群集IP)使GUI按预期加载(fast) 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是问题的解决方案?这是一种解决方法,但不是解释为什么会发生这种情况。尽管我意识到这可能不会被任何人解决,除非他们碰巧遇到与我完全相同的问题,这是不可能的,考虑到这个问题所处的高度专业化的生态位