kubernetes環境での作業にも慣れてきたところでぶつかった問題とその解決方法を紹介します。
トラブル発生
Kubernetes環境で、3つのPodから構成されるアプリケーションを使用していた際に、
特定のノードでPodの状態が「ContainerCreating」のまま止まってしまいました。
問題のPodのdescribeを確認してみるとエラーを吐いていました。
以下は、Eventログの抜粋です。
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedCreatePodSandBox 4m31s kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "ba883b271864c900c8a75025d117a57649c427f80ea2bc60fc94bde3435186df" network for pod "feature-extraction-0": networkPlugin cni failed to set up pod "feature-extraction-0_edgeai-msa" network: failed to delegate add: failed to set bridge addr: "cni0" already has an IP address different from 10.244.13.1/24
Warning FailedCreatePodSandBox 4m30s kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "5fedc4770e80bbf09c11809d9b81cebb0db10165b2e429ff6a5d67203cc47811" network for pod "feature-extraction-0": networkPlugin cni failed to set up pod "feature-extraction-0_edgeai-msa" network: failed to delegate add: failed to set bridge addr: "cni0" already has an IP address different from 10.244.13.1/24
色々と言っていますが、どうやら
「"cni0" already has an IP address すでにIPアドレスを持っている」
というエラーが原因のようです。
解決方法
結論から言うと、クラスターを抜けるときの手順が不十分だったようです。
試行錯誤していた中で、クラスターから抜けることがあり、
抜けるノードでは「kubeadm reset」をすれば良いと思っていましたが、
インターフェースも削除する必要があるようです。
インターフェースの削除(インターフェース名は環境によります)
$ sudo rm /etc/cni/net.d -r
$ sudo ip link delete flannel.1
$ sudo ip link delete cni0
削除後に、改めてクラスタにjoinしてみると、無事動きました!
$ kubectl get po -n hoge
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/test-1 0/1 Completed 0 30s XX node-1 <none> <none>
pod/test-2 1/1 Running 0 30s XX node-2 <none> <none>
pod/test-3 1/1 Running 0 30s XX node-3 <none> <none>
まとめ
kubeadmでresetをすれば大丈夫でしょ、と過信してしまっていました。
以下にクラスターを抜けるときの手順をまとめたので参考にしてください。
クラスターを抜けるときの手順
- 特定ノード(node-1)へのスケジュールの停止(マスターノードで実行)
kubectl cordon node-1
- Podの追い出し(マスターノードで実行)
kubectl drain node-1 --ignore-daemonsets
- nodeの削除(マスターノードで実行)
kubectl delete node node-1
- 設定のリセット(抜けるノードで実行)
sudo kubeadm reset
- インターフェースの削除(抜けるノードで実行)
sudo rm /etc/cni/net.d -r sudo ip link delete flannel.1 sudo ip link delete cni0