在使用 TKE 集群服务的过程中,某些场景下,可能会出现服务访问不通的问题,如果确认后端 Pod 访问正常,则可能是由于 kube-proxy 组件版本较低,导致节点上的 iptables 或 ipvs 服务转发规则下发失败。本文档整理了低版本 kube-proxy 存在的若干问题,并给出相应的修复指引。若本文档无法解决您所遇到的问题,请 联系我们 来寻求帮助。
Failed to execute iptables-restore: exit status 2 (iptables-restore v1.8.4 (legacy): Couldn't load target 'KUBE-MARK-DROP':No such file or directory
KUBE-MARK-DROP
Chain 不存在,导致同步规则失败后退出。 KUBE-MARK-DROP
Chain 由 kubelet 负责维护。KUBE-MARK-DROP
Chain。高版本 OS 包括:升级 kube-proxy,需要按如下逻辑处理:
TKE 集群版本 | 修复策略 |
---|---|
>1.18 | 不存在此问题,无需修复 |
1.18 | 升级 kube-proxy 到 v1.18.4-tke.26 及以上 |
1.16 | 升级 kube-proxy 到 v1.16.3-tke.28 及以上 |
1.14 | 升级 kube-proxy 到 v1.14.3-tke.27 及以上 |
1.12 | 升级 kube-proxy 到 v1.12.4-tke.31 及以上 |
1.10 | 升级 kube-proxy 到 v1.10.5-tke.20 及以上 |
说明:TKE 最新版本信息,请参见 TKE Kubernetes Revision 版本历史。
Failed to execute iptables-restore: exit status 1 (iptables-restore: line xxx failed)
/run/xtables.lock
对于要调用 iptables 相关命令的 Pod 需要将主机侧 /run/xtables.lock
文件挂载到 Pod 中,配置方式如下:
volumeMounts:
- mountPath: /run/xtables.lock
name: xtables-lock
readOnly: false
volumes:
- hOStPath:
path: /run/xtables.lock
type: FileOrCreate
name: xtables-lock
Failed to execute iptables-restore: exit status 4 (Another app is currently holding the xtables lock. Perhaps you want to use the -w option?)
-w(--wait)
选项,如设置 -w=5 时,iptables-restore 会在拿锁操作阻塞 5s,这使得 5s 内一旦其它进程释放锁,iptables-restore 可以继续操作。节点 OS | 升级目标版本 |
---|---|
CentOS | 7.2 及以上 |
Ubuntu | 20.04 及以上 |
Tencent Linux | 2.4 及以上 |
TKE 集群版本 | 修复策略 |
---|---|
> 1.12 | 不存在此问题,无需修复 |
1.12 | 升级 kube-proxy 到 v1.12.4-tke.31 及以上 |
< 1.12 | 升级 TKE 集群到高版本 |
说明:TKE 最新版本信息,请参见 TKE Kubernetes Revision 版本历史。
Failed to ensure that filter chain KUBE-SERVICES exists: error creating chain "KUBE-EXTERNAL-SERVICES": exit status 4: Another app is currently holding the xtables lock. Stopped waiting after 5s.
尽量减小其它组件持有 iptables file lock 的时间,如 TKE 控制台组件管理提供的 NetworkPolicy(kube-router)组件,其低版本持有 iptables 锁的时间较长,可以通过升级来解决,当前最新版为:v1.3.2
Failed to list *core.Endpoints: Stream error http2.StreamError{StreamID:0xea1, Code:0x2, Cause:error(nil)} when reading response body, may be caused by closed connection. Please retry.
低版本 Kubernetes 调用 go http2 的包存在一个 bug,该 bug 导致客户端会使用到一个 apiserver 的已经关闭的连接,kube-proxy 踩中这个 bug 后,会导致同步规则失败。更多详情可参考 Issue87615、PR95981。
升级 kube-proxy,需要按如下逻辑处理:
TKE 集群版本 | 修复策略 |
---|---|
> 1.18 | 不存在此问题,无需修复 |
1.18 | 升级 kube-proxy 到 v1.18.4-tke.26 及以上 |
< 1.18 | 升级 TKE 集群到高版本 |
说明:TKE 最新版本信息,请参见 TKE Kubernetes Revision 版本历史。
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x50 pc=0x1514fb8]
升级 kube-proxy,需要按如下逻辑处理:
TKE 集群版本 | 修复策略 |
---|---|
> 1.18 | 不存在此问题,无需修复 |
1.18 | 升级 kube-proxy 到 v1.18.4-tke.26 及以上 |
< 1.18 | 不存在此问题,无需修复 |
说明:TKE 最新版本信息,请参见 TKE Kubernetes Revision 版本历史。
Observed a panic: "slice bounds out of range" (runtime error: slice bounds out of range)
kube-proxy 社区的代码存在 bug,在执行 iptables-save 时将标准输出和标准错误定向到同一个 buffer 中,而这两者的输出先后顺序是不确定的,这导致 buffer 中的数据格式不符合预期,在处理时发生 panic。更多详情可参考 Issue78443、PR78428。
升级 kube-proxy,需要按如下逻辑处理:
TKE 集群版本 | 修复策略 |
---|---|
> 1.14 | 不存在此问题,无需修复 |
1.14 | 升级 kube-proxy 到 v1.14.3-tke.27 及以上 |
1.12 | 升级 kube-proxy 到 v1.12.4-tke.31 及以上 |
< 1.12 | 不存在此问题,无需修复 |
说明:TKE 最新版本信息,请参见 TKE Kubernetes Revision 版本历史。
kube-proxy 频繁刷新节点 Service 转发规则导致,触发原因:
如果是 kube-proxy 周期性同步规则较为频繁导致,需要调整其相关参数,旧版本 kube-proxy 的参数默认为:
--ipvs-min-sync-period=1s(最小刷新间隔1s)
--ipvs-sync-period=5s(5s周期性刷新)
这导致 kube-proxy 每5s刷新一次节点 iptables 规则,消耗较多 CPU,推荐改为:
--ipvs-min-sync-period=0s(发生事件实时刷新)
--ipvs-sync-period=30s(30s周期性刷新)
以上配置值为参数默认值,您可以自行选择是否配置这些参数。
本页内容是否解决了您的问题?