我在使用 Mailu Helm 图表进行 Kubernetes 部署时遇到了一个不寻常的问题,特别是
mailu-front
组件。更新部署后,新创建的 Pod 工作正常,但旧 Pod 陷入“终止”状态。 Kubernetes 事件日志显示以下与 pod 终止相关的错误:
error killing pod: failed to "KillPodSandbox" for "237aa644-7634-4fa2-a538-f973e7f7dfab" with KillPodSandboxError: "rpc error: code = Unknown desc = failed to destroy network for sandbox \"cbbcf6eaaf47c0ef5b92b97187276d04def7bcef3e68b92889b7993ba970ce55\": plugin type=\"portmap\" failed (delete): could not teardown ipv4 dnat: running [/usr/sbin/iptables -t nat -N CNI-DN-0e851981d24bd2d807e1a --wait]: exit status 1: iptables: Chain already exists.\n"
我正在运行一个小型 kubeadm 1.28 集群,所有节点均使用 Weave CNI 和 Debian 11 主机操作系统
尝试强制删除 Pod 未成功。这个问题似乎与 iptables 配置有关,特别是由于链已经存在而无法拆除的冲突(冲突,因为事件日志中的命令旨在创建链,而不是删除它)。
我没有找到太多有关如何解决此特定错误的信息。
如果我登录受影响节点的主机操作系统并运行 `sudo iptables -t nat -N CNI-DN-0e851981d24bd2d807e1a --wait` ,我确实可以看到输出中反映的问题:
iptables: Chain already exists.
如果我尝试使用
sudo iptables -t nat -X CNI-DN-0e851981d24bd2d807e1a --wait
删除链,iptables 会说该链已在使用中:
iptables v1.8.7 (nf_tables): CHAIN_USER_DEL failed (Device or resource busy): chain CNI-DN-0e851981d24bd2d807e1a
我尝试重启节点,但问题仍然出现。
看起来之前的终止清理还没有完成。如果您尝试强制删除,可能会导致一些意外结果,例如由于清理过程不完整而导致资源泄漏。
尝试以下诊断步骤,在 Pod 仍停留在
Terminating
状态时,进一步清理 Kubernetes 节点上的相关资源。
通过 SSH 连接到目标 kubernetes 节点
执行
crictl ps
确认CONTAINER_ID
执行
crictl pods
确认POD_ID
执行
crictl stop CONTAINER\_ID
停止容器
相关资源应由
kubelet
自动删除,无需用户干预。
等待几分钟,仔细检查容器和 Pod 是否仍然存在。如果是,执行
crictl rm <CONTAINER\_ID\>
和 crictl rmp <POD\_ID\>
进行相应删除。
您可以参考官方文档了解更多信息。