聚色网-【SOE-209】ギリモザ バコバコ乱交 Ami Kubernetes Service 502,IPVS 的坑
你的位置:聚色网 > 哥也色地址 > 【SOE-209】ギリモザ バコバコ乱交 Ami Kubernetes Service 502,IPVS 的坑
【SOE-209】ギリモザ バコバコ乱交 Ami Kubernetes Service 502,IPVS 的坑
发布日期:2024-08-03 16:49    点击次数:185

【SOE-209】ギリモザ バコバコ乱交 Ami Kubernetes Service 502,IPVS 的坑

咫尺部署在 Kubernetes 中的处事,通过 Calico BGP 将 Service 与集群外积聚买通【SOE-209】ギリモザ バコバコ乱交 Ami,并在外部的 nginx 中成立 Service 地址对外进行处事表露。经过一段时期的不雅察,发咫尺 Deployment 转机更新中及之后一段时期,偶现处事探员 502 的问题。

[[418415]]

问题布景和征象

现时 Kuberntes 集群使用 Calico 看成 CNI 组件,并使用 BGP 模式将 Pod IP 和 Service IP 与集群外积聚买通,通过集群外的 Nginx 作反向代理对外提供处事,行使皆是以 Deployment 体式部署。通过一段时期的不雅察,部分行使反映,在行使发布后一段时期内,处事有一定几率出现 502 报错。

问题排查

最平直的揣测,是否问题只发生在转机更新进程中,即行使莫得作念好检查检测的成立,导致处事莫得的确可用,Pod 却照旧处于 ready 景象。

浮浅的测试后很快放弃这个可能,对成立了有用健康检查探针的 Deployment 进行转机更新,并使用 ab 通过 Nginx 成立的域名进行不息恳求(此时无并发),发咫尺行使转机更新已毕后,并通过 pod IP 东说念主工证实了处事莫得问题,仍有概率出现 502 诞妄,且出现诞妄的征象会不息几分钟以致十几分钟的时期,显豁远远跳跃了转机更新所需时期。

上头的初步测试的征象,放弃了行使本人的问题。下一个怀疑的方针指向了 Nginx。既然征象是通过 Nginx 代理探员产生的,那么平直恳求 Service 有莫得问题呢,由于现时集群 Service 地址和外部积聚作念了买通,测试起来很便捷,我准备了如下的测试:

ab 不息恳求域名通过 Nginx 探员处事,并触发转机更新(ab -r -v 2 -n 50000 http://service.domain.com/test) ab 不息恳求 serviceIP:port 探员处事,并触发转机更新(ab -r -v 2 -n 50000 http://10.255.10.101/test)

经过测试,案例 1 出现了 502 诞妄,案例 2 未出现。是以,问题是在 Nginx 嘛?

找到负责 Nginx 的共事进行分析,论断是 Nginx 似乎不会酿成访佛的问题。那为什么上头测试中唯有案例1 复现了问题呢?于是我决定再行进行测试,此次在 ab 恳求的时候加上了并发(-c 10),效果,两个案例皆出现了 502 的诞妄。这么,问题似乎又回到了 Kubernetes 集群本人,而且似乎在恳求量较大的情况下才会出现。

这时,我初始怀疑是否可能是因为某种原因,转机发布后的一段时期里,一些恳求会诞妄的被分发到照旧被杀掉的老得 podIP 上。为了考证这一揣测【SOE-209】ギリモザ バコバコ乱交 Ami,我进行了如下实验:

创建一个测试的 Deployment,副本数为 1,提供浮浅的 http 处事,并在吸收到恳求时输出日记,并创建对应 Service。 使用 ab 并发恳求该处事 Service 地址。 使用 kubectl patch 修改 Pod 的 label,使其和 Deployment 不一致,触发 Deployment 自动拉起一个新的 Pod。 跟踪新的 Pod 和老的 Pod 的日记,不雅察恳求进来的情况。

第三步 patch pod 的 label,是为了保留原本的 pod 实例,以便不雅察恳求是否会分发到老的 Pod。(patch Pod 的 label 不会使 Pod 重启或退出,白色面具但是改换了 label,会使 Pod 脱离原 Deployment 的限度,因此触发 Deployment 新建一个 Pod)。

效果和预期一致,当新的 Pod 照旧 ready,Endpoint 照旧出现了新的 Pod 的 IP,恳求仍然会进到原本的 Pod 中。

基于以上的效果,又通过屡次实验,不雅察 Kubernetes 节点上的 IPVS 规定,发咫尺转机更新及之后一段时期,老的 podIP 还会出咫尺 IPVS 规定中,不外 weight 为 0,手动删除后 weight 为 0 的 rs 后,问题就不再出现。到此,找到问题场地是 IPVS,但是为什么会这么呢,在搜索了关联的著作后,大略找到了原因。

诡异的 No route to host,讲到了 IPVS 的一个脾气:

也即是 IPVS 模块处理报文的主要进口,发现它会先在土产货流通转发表看这个包是否照旧有对应的流通了(匹配五元组),淌若有就评释它不是新流通也就不会颐养,平直发给这个流通对应的之前照旧颐养过的 rs(也不会判断权重);淌若没匹配到评释这个包是新的流通,就会走到颐养这里 (rr,wrr 等颐养计策)。

即:五元组(源IP地址、方针IP地址、公约号、源端口、方针端口)一致的情况下,IPVS 有可能不经过权重判断,平直将新的流通当成存量流通,转发到原本的 real server(即 PodIP)上。表面上这种情况在单一客户端大宗恳求的场景下,才有可能触发,这亦然诡异的 No route to host一文中模拟出的场景,即:

不同恳求的源 IP 长期是调换的,要道点在于源端口是否可能调换。由于 ServiceA 向 ServiceB 发起大宗短流通,ServiceA 场地节点就会有大宗 TIME_WAIT 景象的流通,需要等 2 分钟(2*MSL)才会计帐,而由于流通量太大,每次发起的流通皆会占用一个源端口,当源端口不够用了,就会重用 TIME_WAIT 景象流通的源端口,这个时候当报文参加 IPVS 模块,检测到它的五元组跟土产货流通转发表中的某个流通一致(TIME_WAIT 景象),就觉得它是一个存量流通,然后平直将报文转发给这个流通之前对应的 rs 上,但是这个 rs 对应的 Pod 早已燃烧,是以捏包看到的征象是将 SYN 发给了旧 Pod,何况无法收到 ACK,伴跟着复返 ICMP 陈诉这个 IP 不行达,也被行使解说为 “No route to host”。

原因分析

这里分析一下之前的测试中为何会出现两种不同的效果。我一共进行了两次对比实验。

第一次,未加并发,通过 Nginx 和 通过 Service IP 进行探员并对比。这组实验中,通过 Nginx 探员复现了问题,而通过 Service IP 莫得,这个效果也简直将排查引入邪途。而咫尺分析一下,原因是因为咫尺的 Kubernetes 处事探员进口的缱绻,是集群外 Nginx 为悉数这个词 Kubernetes 集群共用,是以 Nginx 的探员量很高,这也导致 Nginx 向后端的 upstream(即 Service IP)发起流通时,表面上源端口重用的概率较高(事实上经过捏包不雅察,如实几分钟内就会不雅察到屡次端口重用的征象),因而更容易出现五元组相通的情况。

第二次,一样的对比,此次加了并发,双方的案例皆复现了问题。这么,和上头著作中的场景访佛,由于加了并发,发布 ab 恳求的机器,也出现了源端口不及而重用的情况,因此也复现了问题。

而认真环境出现的问题反映,和我第一次实验通过 Nginx 探员得到复现,是团结个原因,诚然单个行使的恳求量远莫得达到能够触发五元组相通的量级,但是集群中的悉数行使恳求量加起来,就会触发此问题。

措置决策

几种措置决策,上头援用的著作中也皆提到,另外可参考isuue 81775,对这一问题及关联的措置阵势有许多的询查。

鉴于咫尺咱们的时期材干和集群限制,暂时无法也无需进行 linux 内核级别的功能修改和考证,何况调研了业务行使,绝大部分以短流通为主,咱们继承了一种浮浅平直的阵势,在一定程度上幸免该问题。开拓一个自界说的程度,并以 Daemonset 的阵势部署在每个 Kubernetes 的每个节点上。该程度通过 informer 机制监听集群 Endpoint 的变化,一朝监听到事件,便得到 Endpoint 过头对应 Service 的信息,并由此找到其在本节点上对应产生的 IPVS 规定,淌若发咫尺 Virtual Service 下有 weight 为 0 的 Real Service,则立即删除此 Real Service。但是这一措置阵势,不行幸免的殉国了部分优雅退出的脾气。但是在空洞了业务行使的特色衡量之后,这如实是咫尺可接纳的一种措置阵势(诚然极其不优雅)。

想考

是否应该如斯使用 Service?

追溯问题的原因,在咱们单一业务的恳求量远未达到会触发五元组相通这种小概率事件的瓶颈时,过早的碰到这一问题,和咱们对 Kubernetes 处事的进口网关的缱绻有很大关系,买通 Service 和造谣机的积聚,使用外部 Nginx 看成进口网关,这种用法,在 Kubernetes 的推行中应该算长短常稀疏(以致可称为仙葩),但是这一缱绻,亦然由于咫尺业务的实例,存在大宗造谣机和容器混布的场景。训戒是,在践诺和确立 Kubernetes 这种复杂系统时,尽量紧靠社区及大厂公开的出产最好推行,减少仅凭资格的或机械延用的阵势进行架构缱绻,不然很容易踩坑,事倍功半。

义务教育

 【SOE-209】ギリモザ バコバコ乱交 Ami



相关资讯