ぶていのログでぶログ

思い出したが吉日

arm64な環境でcalico-node v3.27.2が起動しない

結論: バグっぽくissueが立っている。

github.com

この問題を修正したPRはすでにマージされているが、修正されたイメージは降ってきていないので、今すぐ解決したい場合はv3.27.0のイメージを使うとよい。

--- a/k8s/system/network/calico.yaml
+++ b/k8s/system/network/calico.yaml
@@ -4848,7 +4848,7 @@ spec:
         # i.e. bpf at /sys/fs/bpf and cgroup2 at /run/calico/cgroup. Calico-node initialisation is executed
         # in best effort fashion, i.e. no failure for errors, to not disrupt pod creation in iptable mode.
         - name: "mount-bpffs"
-          image: docker.io/calico/node:v3.27.2
+          image: docker.io/calico/node:v3.27.0
           imagePullPolicy: IfNotPresent
           command: ["calico-node", "-init", "-best-effort"]
           volumeMounts:
@@ -4874,7 +4874,7 @@ spec:
         # container programs network policy and routes on each
         # host.
         - name: calico-node
-          image: docker.io/calico/node:v3.27.2
+          image: docker.io/calico/node:v3.27.0
           imagePullPolicy: IfNotPresent
           envFrom:
           - configMapRef:

以下調査とか経緯。

自宅サーバ環境の再構築(N度目)をしていてk8sクラスタを組んでいた。 Workerノードとして2年前に買ったNanoPi R4Sを組み込んだのだが、なかなかcalico-nodeが起動してこなかった…。 そこでcalico-nodeのエラーログを見たところ以下のようなエラーを吐いていた。

Mar 12 18:09:24 kurimajima kubelet[10692]: E0312 18:09:24.027277   10692 pod_workers.go:1298] "Error syncing pod, skipping" err="failed to \"StartContainer\" for \"mount-bpffs\" with CrashLoopBackOff: \"back-off 5m0s restarting failed container=mount-bpffs pod=calico-node-jpftt_kube-system(d6cf290d-030f-443e-abdd-49cc6d5e476b)\"" pod="kube-system/calico-node-jpftt" podUID="d6cf290d-030f-443e-abdd-49cc6d5e476b"

最初 mount-bpffs というところに着目してCalicoのeBPFサポートの機能周りで問題が起こっていると考えた*1。 しかし、そんなこともなくまたcgroupv2も問題なく機能していた。

$ mount | grep cgroup
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime)
none on /run/calico/cgroup type cgroup2 (rw,relatime)
$ mount | grep bpf
bpf on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime,mode=700)

なんだこれは…っとなっていたところChatGPTに質問していたら、以下のコマンドで特定コンテナのログを出力することができることを知った。

$ kubectl logs calico-node-jpftt -n kube-system -c mount-bpffs --previous
calico-node: error while loading shared libraries: libpcap.so.0.8: cannot open shared object file: No such file or directory

libpcap.so.0.8 ??? eBPFにlibpcapが必要でライブラリがないから起動していない???? そもそもCalicoでeBPFを有効にしていないのに???? ちょっとよくわからんっとなり、ホストOS側にlibpcap0.8パッケージをいれるも解決せず。 しかたなく、containerdでcalico-nodeイメージを起動することにしたら理解ができた。

$ sudo ctr -n k8s.io run docker.io/calico/node:v3.27.2 test
calico-node: error while loading shared libraries: libpcap.so.0.8: cannot open shared object file: No such file or directory
Calico node failed to start

なるほど、イメージが壊れている… そして、冒頭のissueを見つけ原因を特定できたのでした。めでたしめでたし

*1:NanoPi R4Sのカーネルがちょっと特殊なのでeBPF関連の機能が有効になっていなそうだと思っていた