一、背景:测试环境,和第三方对接,之前接口访问一直正常,有一天对方反馈,测试环境所有接口请求返回状态为 302。
对方请求 (具体数据忽略)
curl -X POST -H ‘Content-Type:application/json’ –data ‘{ “version”: “1.0”,…….}’ ‘http://xx.com/xx/xx’
二、验证过程:
在公司内网:
1、同样以以上方式,基于对方请求的某一个接口和参数进行接口调用,发现我们自己内部调用正常。
2、用postman 测试也是正常
改用外网:
1、用命令的形式执行,问题复现,出现302
2、用postman 或者网页版在线http请求的方式进行post调用,接口能通,但是内部错误是Request method ‘GET’ not supported,明显是把post请求,莫名的转为了get请求。
初步结论:
1、接口服务没问题,肯定是某些运维环境的变动引起的
2、内网访问正常,外网就不正常,应该和域名路由转发规则有关
三、排查过程:
1、猜想是否有外网白名单限制?
细想,302 表示已经访问通了,只是未重定向到最终的资源目标,事实测试环境公司未对外网ip 做白名单限制
2、猜想运维环境或者测试环境有特别的配置变动
运维同事和测试负责人皆说环境未变动 (头大)
3、公司的域名转发配置的问题?
查阅了相关nginx的资料,发现nginx 的不当配置是可能会引起重定向找不到最新的资源,以及post 请求转为get请求的,资料如下
https://www.cnblogs.com/xxoome/p/8950650.html
https://www.cnblogs.com/ybyqjzl/articles/10352571.html
再次询问运维的同事和测试组的负责人,会不会是不是nginx配置的问题,依然说自己的配置没变动,并且说,测试环境不是通过nginx 做域名转发的,说是容器服务,让追问下其他技术部门容器服务的负责人,看看
4、容器部门负责人说,现在外网统一使用https ,修改为https 服务即可
修改https 访问,问题解决
5、自问: k8s 容器服务到底怎么处理的
本质上应该和nginx 性质一样,为了一探究竟,简单查询了相关资料,略有了解,k8s 可以配置禁止http 强制转https 服务,以及k8s 域名配置及转发规则的配置,附上查阅的资料:
k8s容器服务:如何不让ingress重定向HTTP请求
https://developer.aliyun.com/ask/15659?spm=a2c6h.13159741
TKE容器服务创建ingress
https://cloud.tencent.com/developer/article/1354241
6、内网访问和外网访问接口,是怎么控制域名转发规则的,为什么内网访问http、https就正常,外网就需要https
首先肯定也是通过域名转发规则走的
四、总结
其实整个过程,还是发现一些问题的,外网的黑白名单限制未处理,部门协作分工问题(测试环境的工作,运维基本不管,容器服务的工作,测试和运维也不了解,导致走了很多弯路),当然自身对公司部门分工及k8s 容器的知识也还是欠缺了解。