TIPS之 Kubernetes kube-proxy xtable lock 问题排查

Kubernetes kube-proxy xtable lock 问题排查

Posted by 董江 on Friday, November 24, 2023

Kubernetes kube-proxy xtable lock 问题排查

背景错误

Failed to execute iptables-restore: exit status 1 (iptables-restore: line xxx failed)
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.

问题原因一

  1. iptables 相关命令(如 iptables-restore)在向内核写入 iptables 规则时,为了避免多个实例并发写入,会利用 file lock 来做同步,linux 下该文件一般为:/run/xtables.lock
  2. 对于要调用 iptables 相关命令的 Pod,如 kube-proxy, kube-router 以及客户侧的 HostNetwork Pod,如果没有挂载该文件,可能发生如上并发写入的错误。

修复指引一

对于要调用 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

问题原因二

  1. iptables 相关命令(如 iptables-restore)在向内核写入 iptables 规则时,为了避免多个实例并发写入,会利用 file lock 来做同步,iptables-restore 在执行时首先尝试获取 file lock,如果当前有其它进程持有锁,则阻塞特定时间(取决于-w 参数的值,默认5s),该时间内拿到锁,则继续操作,拿不到则退出。
  2. 该报错说明其它组件持有 iptables file lock 时间超过 5s。

修复指引二

尽量减小其它组件持有 iptables file lock 的时间,如 TKE 控制台组件管理提供的 NetworkPolicy(kube-router)组件,其低版本持有 iptables 锁的时间较长,可以通过升级来解决,当前最新版为:v1.8.7

「如果这篇文章对你有用,请随意打赏」

Kubeservice博客

如果这篇文章对你有用,请随意打赏

使用微信扫描二维码完成支付