首页 > 其他分享 >记一次酣畅淋漓的 K8s Ingress 排错过程(302,404,503,...)

记一次酣畅淋漓的 K8s Ingress 排错过程(302,404,503,...)

时间:2024-02-28 20:55:47浏览次数:23  
标签:... Ingress 请求 vscode 302 排错 stable 503

故事开始

如果你配置过 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 是同一个,固定的。不过,不急,再说吧,着急下班。)

标签:...,Ingress,请求,vscode,302,排错,stable,503
From: https://www.cnblogs.com/daniel-hutao/p/18041793/k8s_ingress_debug

相关文章

  • 扩展运算符...+map+filter 在嵌套对象数组中的使用
    参考文档:使用基于嵌套值的数组过滤对象数组:https://segmentfault.com/q/1010000042989861js扩展运算符(...)的用法 :https://www.cnblogs.com/caihongmin/p/16395573.html对象的扩展运算符:https://blog.csdn.net/weixin_42265852/article/details/88739525Vue判断对象中......
  • 2..3...4.... Wonderful! Wonderful! 题解
    2..3...4....Wonderful!Wonderful!题目描述​ 有一个元素等于其下标的数组,长度为n,对于属于区间\([1,(n-1)/2]\)的每一个数,我们称其为k,我们可以对数组进行任意次数的操作。​ 操作:选择长度为\(2*k+1\)的子序列,然后只留下最中间的那个数,删掉其他的元素。​ 我们想知道对于每个......
  • MySQL备份恢复数据--binary-mode is enabled and mysql is run in non-interactive...
    使用mysqldump;MySQL自带的逻辑备份工具。mysqldump[选项]数据库名[表名]>脚本名mysqldump[选项]--数据库名[选项表名]>脚本名mysqldump[选项]--all-databases[选项]>脚本名备份mysqldump-hlocalhost-uwordpress-pwordpress_20200104>c......
  • mysql access denied for root ... mysqld –skip-grant-tables 命令失效 ... Failed
    <!--密码突然登录不上MySQL了,久了也不晓得是不是密码不正确...只能改密码...一年难得碰一次,感觉每次总有莫名其妙的问题--><!--修改方案只找到一个,就是无密码验证开启mysql服务,然后登录,设置新密码--><!--mysql版本不同有些命令无效,大概分高低两版本--><!--低版命令我......
  • CF1930E 2..3...4.... Wonderful! Wonderful! 题解
    DescriptionStackhasanarray$a$oflength$n$suchthat$a_i=i$forall$i$($1\leqi\leqn$).Hewillselectapositiveinteger$k$($1\leqk\leq\lfloor\frac{n-1}{2}\rfloor$)anddothefollowingoperationon$a$an......
  • 元宵节快乐......在此写下纪念
    一晃时间过了许久,不知不觉自己学习网安行业已经快一年了,在此遇见很多的人,给我许多帮助,指点迷津,非常感谢!!奈何自己愚笨,靠着没日没夜的学习才能有一丝丝前进的可能,有时候会埋怨自己真的是太笨了,但还是得起身,奋起原来少年已经是一个青年啦,意气风发的时候,一去不复返咯~只能埋下头去好......
  • ES6扩展运算符(...)
    在ES6中,扩展运算符(...)是一种用来展开数组和对象的语法。它可以将一个数组或对象展开,以便在函数调用、数组字面量或对象字面量中使用。1//1.在数组中的应用:2letarr=[1,2,245,6]3letarr1=[...arr,3,5,7]4console.log(arr1)//[1,2,245,6,3,5,7]56......
  • windows11系统下ppt突然打不开,报错“PowerPoint启动时提示上次启动失败是否启用安全模
    问题描述:windows11系统下ppt突然打不开,报错:PowerPoint启动时提示上次启动失败是否启用安全模式...ppt文件是正常的,我发到其他设备上是可以正常打开的。我把office卸载了用腾讯文档也无法打开ppt文件。点击用安全模式打开后无反应,即无错误提示也没有打开ppt。以上情况说明:......
  • kubernetes创建的ingress规则不生效
    kubernetes创建的ingress规则不生效解决方法一:给创建ingress的yaml文件添加ingressClassName参数:​ 查看ingressclass[root@k8s-master012-4]#kubectlgetingressclassNAMECONTROLLERPARAMETERSAGEnginxk8s.io/ingress-nginx<none>22h......
  • JS展开运算符...
    ...)展开运算符又叫剩余运算符。例子:constitem={age:123}constnewItem={...item,['age']:456}console.log("newItem="+newItem.age) ......