微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Kubernetes - 法兰绒 CNI 上 libnftnl.so.11.3.0 中的段错误

如何解决Kubernetes - 法兰绒 CNI 上 libnftnl.so.11.3.0 中的段错误

我有一个自我管理的 Kubernetes 集群,由一个主节点和 3 个工作节点组成。我在集群内使用集群网络接口 flannel

在我的所有机器上,我都可以看到以下类型的内核消息:

Apr 12 04:22:24 worker-7 kernel: [278523.379954] iptables[6260]: segfault at 88 ip 00007f9e69fefe47 sp 00007ffee4dff356 error 4 in libnftnl.so.11.3.0[7f9e69feb000+16000]
Apr 12 04:22:24 worker-7 kernel: [278523.380094] Code: bf 88 00 00 00 48 8b 2f 48 39 df 74 13 4c 89 ee 41 ff d4 85 c0 78 0b 48 89 ef 48 8b 6d 00 eb e8 31 c0 5a 5b 5d 41 5c 41 5d c3 <48> 8b 87 88 00 00 00 48 81 c7 78 00 00 00 48 39 f8 74 0b 85 f6 74
Apr 12 05:59:10 worker-7 kernel: [284329.182667] iptables[13978]: segfault at 88 ip 00007fb799fafe47 sp 00007fff22419b36 error 4 in libnftnl.so.11.3.0[7fb799fab000+16000]
Apr 12 05:59:10 worker-7 kernel: [284329.182774] Code: bf 88 00 00 00 48 8b 2f 48 39 df 74 13 4c 89 ee 41 ff d4 85 c0 78 0b 48 89 ef 48 8b 6d 00 eb e8 31 c0 5a 5b 5d 41 5c 41 5d c3 <48> 8b 87 88 00 00 00 48 81 c7 98 00 00 00 48 39 f8 74 0b 85 f6 74
Apr 12 08:29:25 worker-7 kernel: [293343.999073] iptables[16041]: segfault at 88 ip 00007fa40c7f7e47 sp 00007ffe04ba9886 error 4 in libnftnl.so.11.3.0[7fa40c7f3000+16000]
Apr 12 08:29:25 worker-7 kernel: [293343.999165] Code: bf 88 00 00 00 48 8b 2f 48 39 df 74 13 4c 89 ee 41 ff d4 85 c0 78 0b 48 89 ef 48 8b 6d 00 eb e8 31 c0 5a 5b 5d 41 5c 41 5d c3 <48> 8b 87 88 00 00 00 48 81 c7 98 00 00 00 48 39 f8 74 0b 85 f6 74

我确定消息源自 kube-flannel-ds pod。我有这样的日志消息:

Failed to ensure iptables rules: Error checking rule existence: Failed to check rule existence: running [/sbin/iptables -t filter -C FORWARD -s 10.244.0.0/16 -j ACCEPT --wait]: exit status -1:
Failed to ensure iptables rules: Error checking rule existence: Failed to check rule existence: running [/sbin/iptables -t nat -C POS TROUTING -s 10.244.0.0/16 ! -d 224.0.0.0/4 -j MASQUERADE --random-fully --wait]: exit status -1: 

有人能解释一下这种消息是什么意思吗?这可能是硬件问题吗?将 form flannel 切换到另一个 kuberentes 容器网络接口(CNI)是否有意义 - 例如Calico

解决方法

正如评论中已经提到的,debian buster 使用 nftables 支持而不是 iptables:

注意:从 Debian Buster 开始,iptables 被 nftables 取代 - 参考 here

不幸的是,此时 kubernetes 的 nftables 是 not compatible

在 Linux 中,nftables 可用作内核 iptables 子系统的现代替代品。 iptables 工具可以充当兼容层,其行为类似于 iptables,但实际上是配置 nftables。此 nftables 后端与当前的 kubeadm 软件包不兼容:它会导致防火墙规则重复并破坏 kube-proxy。您可以尝试切换到 here 所述的旧选项,但我不确定此解决方案,因为我没有办法用您的操作系统对其进行测试。我用这个 here 解决了 debian 的类似案例。

另一种方法是切换到 Calico,实际上 supports nftbackedFELIX_IPTABLESBACKEND。此参数控制 Felix 使用的 iptables 二进制文件的哪个变体。将此设置为 Auto 以自动检测后端。如果需要特定的后端,则对使用 netfilter 后端的主机使用 NFT,或对其他主机使用 Legacy。 [默认:Auto]。

在使用 containerd 安装 calico 时,还请查看一个 this 案例。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。