Techniical-support

Calico起動エラーCrashLoopBackOffを解消してみた

概要

こんにちは、テクニカルサポートの牛山です。

前回、K8sシングルマスターに対してワーカーノードを1つ追加しましたがCalicoと呼ばれるCNI(Container Network Interface)で 「CrashLoopBackOff」 という起動エラーがでていましたので今回は、この事象を解消してみたという内容になります。

※「CrashLoopBackOff」とは、ポッド内のコンテナーが終了し、次の起動状態まで待機状態にあり、2回以上コンテナーが終了すると出るメッセージになります。

※Calicoのバージョンは、 「v3.11.3」 を使用しております。

発生事象

マスター側およびワーカーノード側で「READY」が「0/1」となっており有効になっていない状態で「CrashLoopBackOff」を繰り返し再起動している状態なのでポッド内部を見る必要がある。

root@k8s-master:~# kubectl get po -o wide --all-namespaces | awk '{ printf "%s %s %s %s %s %s\n", $1,$2,$3,$4,$7,$8 }' | column -t

NAMESPACE   NAME              READY  STATUS           IP            NODE
kube-system calico-node-kqt2h 0/1    CrashLoopBackOff 192.168.1.108 k8s-master
kube-system calico-node-sknv2 0/1    Running          192.168.1.109 k8s-node-a

※一部見やすく加工しています。

マスター側で動作しているポッドのログを確認したところ、下記エラーがでており「Calicoではnet.ipv4.conf.all.rp_filterを0または1に設定する必要があります。」という内容でした。

ワーカーノード側でも同様にでていることを確認しましたので「sysctl.conf」を編集し値を「1」へ変更する必要がありました。

root@k8s-master:~# kubectl logs -n kube-system calico-node-kqt2h | tail

[FATAL] Kernel's RPF check is set to 'loose'.  This would allow endpoints to spoof their IP address.  Calico requires net.ipv4.conf.all.rp_filter to be set to 0 or 1. If you require loose RPF and you are not concerned about spoofing, this check can be disabled by setting the IgnoreLooseRPF configuration parameter to 'true'.

※一部見やすく加工しています。

対処

原因が分かったので実際にマスターとワーカーノードで値を変更します。

送信元アドレス検証をONにする内容となります。

変更前の値が「2」になっていることを確認。

root@k8s-master:~# cat /proc/sys/net/ipv4/conf/all/rp_filter

2

root@k8s-master:~# diff -u /etc/sysctl.conf_20210309 /etc/sysctl.conf

--- /etc/sysctl.conf_20210309   2020-05-17 11:43:27.000000000 +0900
+++ /etc/sysctl.conf    2021-03-09 10:46:17.768686942 +0900
@@ -17,7 +17,7 @@
 # Turn on Source Address Verification in all interfaces to
 # prevent some spoofing attacks
 #net.ipv4.conf.default.rp_filter=1
-#net.ipv4.conf.all.rp_filter=1
+net.ipv4.conf.all.rp_filter=1

 # Uncomment the next line to enable TCP/IP SYN cookies
 # See http://lwn.net/Articles/277146/

設定適用する為、 「sysctl -p」 コマンドを使用し、「/proc/sys/」にあるファイルへ書き込みます。

下記のように「1」になっていればOKです。

root@k8s-master:~# cat /proc/sys/net/ipv4/conf/all/rp_filter

1

マスター側およびワーカーノード側で「READY」が「1/1」になり、STATUSが両方とも「Running」になっていることが確認できます。

root@k8s-master:~# kubectl get po -o wide --all-namespaces | awk '{ printf "%s %s %s %s %s %s\n", $1,$2,$3,$4,$7,$8 }' | column -t

NAMESPACE   NAME              READY STATUS  IP            NODE
kube-system calico-node-5slxg 1/1   Running 192.168.1.109 k8s-node-a
kube-system calico-node-xqdhw 1/1   Running 192.168.1.108 k8s-master

※一部見やすく加工しています。

まとめ

K8sクラスターを組む際は、送信元アドレス検証を有効にしていないとCalicoの再起動が起こってしまうことが分かりました。

コンテナーから吐かれるエラー見ても分からない事だらけなので、クラスターの管理にコスト掛かるかもと思いました。

K8sのマネージドサービスなんかも充実しているので1回は触って見たいかなと思いました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA