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

Kubernetes - segfault in libnftnl.so.11.3.0 on flannel CNI

我有一个自我管理的 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 pods。我有这样的日志消息:

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:

NOTE: iptables is being replaced by nftables starting with Debian Buster - reference here

不幸的是,目前 nftables not compatible 与 kubernetes 一起使用。

在 Linux 中,nftables 可用作内核 iptables 子系统的现代替代品。 iptables 工具可以充当兼容层,其行为类似于 iptables,但实际上配置的是 nftables。这个 nftables 后端与当前的 kubeadm 包不兼容:它会导致重复的防火墙规则并破坏 kube-proxy。您可以尝试切换到旧选项,如 here but I'm not sure about this solution as I don't have a way to test it with your Os. I solved similar case with debian with this .

所述

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

使用 containerd 安装 calico 时,请同时查看 案例。