接触k8已经有半年,从一个普通的Tomcat 应用开始。把一个产品核心组件容器化并在k8s上面部署加管理起来。也经历很多弯路,对于kubernetes的使用还在持续的优化和研究中。
这是一篇实用性 使用文章。没有太多的原理介绍,大家要了解k8s 网络原理的可以去自行百度。有很多介绍,但是正真用起来用好的文章很少。
先不废话介绍一下我们的
使用场景:
我们的产品主要的业务是使用云存储做文件上传下载和文件管理的。这里面就有两类网络通信诉求,1 普通的rest请求用的是HTTP协议。2 文件传输请求用的也是HTTP 直接传的是字节流。
我们最早的
组网设计:
所有的产品组件都docker化之后通过POD部署,服务直接调用分几种
1. 内部服务即部署在k8里面的服务用的是service。
2. 外部调用通过nginx 做的SSL 卸载然后从master节点的IP+ Service的NodePort进K8。
注意这里只对服务调用方做了划分。没有考虑请求的类型。
再说一下我们的k8
Kubernetes:
我们用的是 1.8的版本,部署时选择的是Calico 网络。master 也是单节点部署。
背景就阐述这么多了。
现在是描述一下
问题和改进方法:
方法不一定 可以照搬但是希望能给大家一个思路。毕竟是正真解决了问题。
1. 上线没多久就出现了的问题,在文件上传时其他的rest 请求会超时。现象是nginx里面大量的超时日志。业务自己的日志里面没有记录到请求。也就是说会有那么一段时间业务组件docker是脱离网络的。
这个现象很明显是和文件传输有关。我们的解决方案是吧对接云存储的组件移除K8网络。做独立部署。这样做了以后有两个明显的改善,A 文件上传的速度提升了,确切的说是回复到docker化之前的样子(这个其实就是一个回退的操作。。。。
)B 请求超时大大的减少了。
2. 但是好景不长,我们的是周末做的改造,但是到了周一却出现了一个时间段 10分钟左右的用户登陆不上,现象和之前的有类似,nginx有大量超时报错,但是业务日志没有记录。
说一个插曲。我们在周末把文件流传输的组件迁出K8之后还专门做了多用户的压力测试,很不幸没有发现问题
。
有了之前的经验我一下就怀疑到网络上了。这次处理的方案做了一个大胆的尝试。我们把登陆请求分到别的service上去。具体的做法就是新创建几个POD挂一个新的service,通过Nginx只把登陆请求转发到这个新的service上。说明一下这一系列操作都是通过配置完成的。新POD里的Docker和旧的是一样的就是service不一样 NODE PORT不一样。然后登陆接口超时问题就解决了,并且经过一周的观察问题不再出现。
最后再说说我们的定位过程,因为之前对k8比较相信没想K8的问题。首先是想到master节点就一个所有请求都从master Ip做入库。Master的VM 连接数会达到上线。所以就用Nginx做了分流。从不同的Node 上进如,问题没有解决。然后就再定位业务日志。发现日志在报超时的那段时间没有收到任何请求。所以才最终确定是K8的service网络阻塞了。