记一次酣畅淋漓的 K8s Ingress 排错过程(302,404,503,...)
- 故事开始
- 第 1 关:【流量重定向到 /】
- 第 2 关:【应用返回 302,重定向到 /,引入 503 错误】
- 第 3 关:【静态资源访问遇到 503 问题】
- 第 4 关:【静态资源访问遇到 403 问题】
- 第 5 关:【WebSocket close with status code 1006】
- 最后效果
故事开始
如果你配置过 Ingress,那你一定遇到过各种各样的坑。
如果你尝试在 Kubernetes 集群里部署 OpenVSCode Server,并且通过 Ingress 暴露服务,那…… 祝你好运。
这个应用默认监听 /
路径,并且不支持配置修改。此外这个服务还用到了 302 重定向,Set Cookie,Websocket 等。或许你已经猜到了问题的复杂性……
于是,当你尝试通过 /xxx
在 Ingress 走七层路由访问这个应用的时候,酸爽的体验就开始了……
第 1 关:【流量重定向到 /】
首先我们会在 Ingress 配置里写上类似下列配置内容,将 /vscode
流量转发到具体的 Service:
spec:
rules:
- http:
paths:
- backend:
service:
name: vscode-01
port:
number: 8888
path: /vscode
pathType: Prefix
这时候尝试访问应用,你会收获 404:
404 说明流量已经到了应用,但是路径不对。稍加思考,其实是 Pod 收到了一个路径为 /vscode
的 http 请求,但是 Pod 期待的第一个请求路径是 /
,404 合情合理。
【解决方案】
这时候你可以在 Ingress 的 Annotation 里加上这样一行:
nginx.ingress.kubernetes.io/rewrite-target: /
第 2 关:【应用返回 302,重定向到 /,引入 503 错误】
当配置了 rewrite 实现流量重写到 /
路径后,继续尝试访问应用,可以得到如下错误礼包:
浏览器上首先看到的是 503 错误,但是第一个请求不应该 503。进一步看可以发现服务端先响应了一个 302,将请求重定向到了 /
路径,进而第二个请求发到了 /
,在 Ingress 这一层被拦截了,返回 503。
【解决方案】
可以在 Ingress 里继续加两行配置,实现 302 Location 的修改:
nginx.ingress.kubernetes.io/configuration-snippet: |
more_set_headers "Location: $scheme://$http_host/vscode/";
第 3 关:【静态资源访问遇到 503 问题】
解决了 302 重定向到 /
的问题之后,继续尝试访问应用,很可惜,还有坑等着:
可以看到 302 的下一个请求是 200,问题不大。接着的 503 是什么问题呢?
看来前端需要加载一些在 /stable-xxx/
下的资源,这个请求在 Ingress 这一层过不去,再次 503 了。
因为我们的 Ingress 配置了全局的 rewrite-target: /
,所以 Pod 无论如何收不到路径为 /stable-xxx/
的请求,也就是当前 Ingress 里咋配置都是徒劳了,这个问题解决不了。
【解决方案】
新增一个 Ingress,处理 /stable-xxx/
流量:
spec:
rules:
- http:
paths:
- path: /stable-487e0b6eb726a84faf6b1a95c68a092fba078fd1/static/(.*)
pathType: ImplementationSpecific
backend:
service:
name: vscode-01
port:
number: 8888
第 4 关:【静态资源访问遇到 403 问题】
解决了 503 问题后,继续尝试访问应用,这会会继续遇到 403 错误:
这一步的定位思路稍微有点绕了,我首先尝试用 kubectl port-forward
将 Pod 流量直接暴露出来,然后尝试访问,发现一切正常。接着用 nsenter 进了对应 Pod 的网络命名空间,再通过 tcpdump 尝试抓包分析 http 请求流量,发现 Ingress 方式的请求在 403 这一步少了 Cookie。
进一步分析请求,可以看到:
也就是第一次请求应用的时候,应用的响应头里带了 Set-Cookie: vscode-tkn=eomdZNpW;
,因此第二次浏览器请求 /vscode/xxx
的时候就会带上这个 Cookie,但是静态资源在 /stable-xxx/static
下,由于路径不一致(也不是包含关系),因此第二次请求的 Cookie 就没了。
【解决方案】
因为这个应用不支持配置路径,又是 TS 写的,我也不懂 TS 代码,所以我还是考虑能从 Ingress 角度入手。
既然静态资源都在 /stable-xxx/static
下,那干脆将 /vscode
改成 /stable-xxx/
。
spec:
rules:
- http:
paths:
- backend:
service:
name: vscode-01
port:
number: 8888
path: /stable-487e0b6eb726a84faf6b1a95c68a092fba078fd1/$
pathType: ImplementationSpecific
为了让正则表达式正常工作,还得加这样一行 Annotation:
nginx.ingress.kubernetes.io/use-regex: "true"
此时应用访问地址也就从:
/vscode/?tkn=eomdZNpW
更新成了:/stable-487e0b6eb726a84faf6b1a95c68a092fba078fd1/?tkn=eomdZNpW
注意,Annotation 里的 configuration-snippet
这时候需要同步更新成:
nginx.ingress.kubernetes.io/configuration-snippet |
more_set_headers "Location: $scheme://$http_host/stable-487e0b6eb726a84faf6b1a95c68a092fba078fd1/";
这时候 Cookie Path 相关的 403 问题应该就能绕过去了。
第 5 关:【WebSocket close with status code 1006】
经过前面一顿改之后,现在请求应用,已经几乎接近真相了:
看起来是 Websocket 相关的错误。继续仔细看下 http 信息,可以找到如下一个请求:
我们一开始配置的 path 规则是匹配 /stable-487e0b6eb726a84faf6b1a95c68a092fba078fd1/
,这里却没有 /
。
【解决方案】
更新 path:
spec:
rules:
- http:
paths:
- backend:
service:
name: vscode-01
port:
number: 8888
path: /stable-487e0b6eb726a84faf6b1a95c68a092fba078fd1(/?|$)
pathType: ImplementationSpecific
此时 ws 流量应该也可以被正常匹配到,然后 rewrite 到 /
去了。
最后效果
且看:
不总结了,着急下班。
(好像还得解决多实例的访问问题,现在的 URL 是同一个,固定的。不过,不急,再说吧,着急下班。)
记一次酣畅淋漓的 K8s Ingress 排错过程(302,404,503,...)的更多相关文章
- 浅谈 k8s ingress controller 选型
大家好,先简单自我介绍下,我叫厉辉,来自腾讯云.业余时间比较喜欢开源,现在是Apache APISIX PPMC.今天我来简单给大家介绍下 K8S Ingress 控制器的选型经验,今天我讲的这些内容 ...
- K8S ingress控制器
文章转载自: K8S ingress控制器 (一)https://blog.51cto.com/u_13760351/2728917 K8S ingress控制器 (二)https://blog.51 ...
- nginx 与 k8s ingress 配置转发websocket
环境 10.1.100.10:70 是后端websocket 服务 需要通过nginx 向后端转发,nginx 配置文件如下 # cat test-ue4.conf map $http_upgrade ...
- php大力力:技术排错过程中,关键点总结和心情历程(2015-10-19)
9:40 2015/10/19技术排错过程中,关键点总结和心情历程 有一个按照标题进行内容分类的函数似乎不起作用,这叫人沮丧. 在页面显示图片地址时候,在源系统和目标系统中,包含图片地址的页面代码格式 ...
- 记一次IIS站点出错的解决过程
记一次IIS站点出错的解决过程 以前一直都是人家用着系统出问题了反馈过来这边改,没想到这回就发生在自己使用的过程中 问题经过 我正在执行一个操作,保存了没有返回提示,打开浏览器控制台查看网络,请求返回 ...
- 记一次Linux系统被入侵的过程
记一次Linux系统被入侵的过程 1. 前期现象 前期现象,宋组那边反应开发环境192.161.14.98这台机器通过公网下载文件,很慢,ping百度丢包严重.因为这台机器是通过楼下adsl拨号上网, ...
- 性能测试——记weblogic 连接池满无法链接故障诊断过程
记weblogic 连接池满无法链接故障诊断过程 前段时间公司负责建行的一个票据系统在,上线前几个分行试运行环境下,每天后台日志都会报oracle.jdbc.xa.OracleXAException, ...
- 一次shell脚本小事故,从中学习排错过程-软件测试
一次shell脚本小事故,从中学习排错过程 事出,童鞋使用shell脚本搭建测试环境的过称中..... 配置环境变量文件:/etc/profile(用于升级JDK或其他) 手动编辑方法:vi /etc ...
- 国内不fq安装K8S四: 安装过程中遇到的问题和解决方法
目录 4 安装过程中遇到的问题和解决方法 4.1 常见问题 4.2 常用的操作命令 4.3 比较好的博客 国内不fq安装K8S一: 安装docker 国内不fq安装K8S二: 安装kubernet 国 ...
- 记录一次k8s环境尝试过程(初始方案,现在已经做过很多完善,例如普罗米修斯)
记录一次Team k8s环境搭建过程(初始方案,现在已经做过很多完善,例如普罗米修斯) span::selection, .CodeMirror-line > span > span::s ...
随机推荐
- [转帖]Linux之系统参数overcommit_memory
https://www.modb.pro/db/25980 前言:作为DBA,内存的使用情况是重要的监控指标之一,了解内存使用很重要.下面有一个系统参数,对于内存的调用起到重要的作用.大家可以了解一下 ...
- JVM内存配置的再次思考
JVM内存配置的再次思考 摘要 最近研究过不少内存分配相关的处理 今天晚上突然感觉还不是非常系统. 还是想能够细致的在学习一下. 希望能够慢慢的拾遗,提高自己 操作系统内存的使用情况 本文主要想思考l ...
- [转帖]Oracle入门精读28-字符集 AL32UTF8与UTF8
字符(Character) 字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等. 字符编码(Character Encoding) 是一套法则,使用该法则能够对自然语言的字符的一个 ...
- Mysql数据库部分管理命令极简学习总结
背景 今天遇到一个得很奇怪的问题. Mysql一个运行时间很长的select阻塞了对select里面左连接表做create index 操作的SQL 当时感觉不应该, 一直以为读锁不会与独占更新锁互斥 ...
- Raid卡在Write back 与Write through 时的性能差异
还是读姜老师的 mysql技术内核innodb存储引擎这本书里面的内容. 之前知道raid卡的设置会影响性能, 预计也是十几倍的性能差距, 但是从来没有用数据库进行过验证 书中有针对不通raid卡的设 ...
- 【JS 逆向百例】网洛者反爬练习平台第五题:控制台反调试
关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后 ...
- 从零开始配置 vim(3)—— 键盘映射进阶
严格意义上来说,快捷键的绑定应该是键盘映射,将某些键映射为另一些键. 在上篇我们介绍了基本的键盘映射操作,知道了如何 :map.:imap.:vmap.:nmap这些命令来映射键盘快捷键.它们很方便, ...
- TienChin 引入 MyBatisPlus
在父工程当中添加版本号,统一管理: <mybatis-plus.version>3.5.1</mybatis-plus.version> 在父工程当中添加 MyBatisPlu ...
- python实现zip分卷压缩与解压
1. python实现zip分卷压缩 WinHex 开始16进制一个一个文件对比 WinRar 创建的分卷压缩和单个 zip 文件的差异. 如果想把单个大文件 test.zip -> 分卷文件 ...
- Worktile团队协作平台介绍
目前很多的基于SaaS模式的云平台都能满足你的需求,同类产品有很多,国内的明道.Worktile.http://Tower.im等,国外的Asana.Trello.Basecamp等,Trello是好 ...