前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >别关心美国大事了,学点知识吧,兄嘚~【故障排查 之 单点登录跳转失败(Ingress 相关)】

别关心美国大事了,学点知识吧,兄嘚~【故障排查 之 单点登录跳转失败(Ingress 相关)】

作者头像
SRE运维进阶之路
发布2024-11-07 12:13:05
930
发布2024-11-07 12:13:05
举报
文章被收录于专栏:SRE运维进阶之路

故障现象

单点登录失败,但是其他接口正常

根因分析

问题要点是:单点登录失败,看代码是 request 和 response 的 RedirectUri 不一样导致的。

目前的南北流量架构为:

二分法排查问题:去掉 外层 Nginx, 或者去掉 K8s Ingress , 故障均可恢复,那么问题就出现在转发过程。

使用 arthas 排查问题

代码语言:javascript
复制
# 进入 Pod 执行如下命令:
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
watch org.springframework.security.oauth2.client.authentication.OAuth2LoginAuthenticationProvider authenticate 'params[0]' -x 4

可以证实是 redirectUri 不一致导致的。

抓包排查问题

代码语言:javascript
复制
# 登录 Pod 所在 Node 节点,抓包
podName=xxx
nsenter -t $(nerdctl ps | grep ${podName} |grep -v pause |awk '{print $1}' | xargs nerdctl inspect -f {{.State.Pid}}) -n tcpdump -i eth0 -nne -C 100 -W 30 -w /tmp/container.pcap

将包传到本地,通过 wireshark 进行分析

重点看 X-Forwarded 信息,发现 Scheme 是 http,Port 是 80 , 拿的 K8s Ingress 的值。

所以 K8s Ingress 没有使用上层的 X-Forwarded 信息。

改进:如果 Nginx 在其他7层代理或负载均衡后面,当期望Nginx将 X-Forwarded-* 的头信息传递给后端服务时,则需要将此参数设为 true

代码语言:javascript
复制
  use-forwarded-headers: "true"

改完,再抓包验证:

发现还是不行,Scheme 是 https,对了,但是 Port 还是 80, 也就意味着,外层 Nginx,没有把 Port 传下来。

搜索 Ingress Issue ,发现有类似的问题:Problem with HTTPS, CloudFlare and X-Forwarded-Port header https://github.com/kubernetes/ingress-nginx/issues/6358

他使用的是 CloudFlare 产品,不支持加 X-Forwarded-Port header , 我们用的自建的,可以直接增加一个 header,在外层 Nginx 中新增

代码语言:javascript
复制
    proxy_set_header X-Forwarded-Port $server_port;

问题解决, enjoy~

总结问题解决方法

解决方法一:如上过程

1)如果 Nginx 在其他7层代理或负载均衡后面,当期望Nginx将 X-Forwarded-* 的头信息传递给后端服务时,Ingress 新增参数,use-forwarded-headers: "true"

2)外层 Nginx 也配置好 X-Forwarded-Port等。

解决方法二:

这里的 upstream 换成 https://$ip:443 和 外层保持一致即可

解决方法三:

如果像这个 issue https://github.com/kubernetes/ingress-nginx/issues/6358 这样, 外层 Nginx, 和 K8s Ingress 都不方便改的情况下,只能修改 Ingress 的模版了,修改模版/etc/nginx/template 后,重新打镜像使用。

我是 Clay,下期见 👋

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SRE运维进阶之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 故障现象
  • 根因分析
  • 总结问题解决方法
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的四七层流量分发服务,访问流量经由 CLB 可以自动分配到多台后端服务器上,扩展系统的服务能力并消除单点故障。轻松应对大流量访问场景。 网关负载均衡(Gateway Load Balancer,GWLB)是运行在网络层的负载均衡。通过 GWLB 可以帮助客户部署、扩展和管理第三方虚拟设备,操作简单,安全性强。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档