よくある問題とその解決策
CoreDNSがCrashLoopBackOff状態になり、ワーカーノードの追加に失敗する
Kubernetesクラスタのインストール後、ワーカーノードの追加時に何時間待っても状態が進まない場合があります。その際は次のコマンドでシステム内のPodの状態を確認してください:
kubectl get pods -n kube-system -o wide
CoreDNSのコンテナがクラッシュしている場合は、ログを確認することで原因を特定できます:
kubectl logs -f coredns-5c98db65d4-8wt9z -n kube-system
ログに以下のようなエラーが出ている場合:
github.com/coredns/coredns/plugin/kubernetes/controller.go:322: Failed to list *v1.Namespace: Get https://10.96.0.1:443/api/v1/namespaces?limit=500&resourceVersion=0: dial tcp 10.96.0.1:443: connect: no route to host
これは、iptablesの設定やキャッシュの不整合が原因の可能性があります。以下の手順でリセットしてください:
systemctl stop kubelet
systemctl stop docker
iptables --flush
iptables -tnat --flush
systemctl start kubelet
systemctl start docker
ワーカーノード追加時にトークンが期限切れと表示される
kubeadmで生成される参加用トークンはデフォルトで24時間の有効期限があります。それを過ぎると使用できなくなります。新しいトークンを生成するには次のコマンドを使用してください:
kubeadm token generate
kubeadm token create <token> --print-join-command --ttl=0
表示されたコマンドをワーカーノード上で実行することでノードを正しく追加できます。
kubectlコマンドで"The connection to the server localhost:8080 was refused"エラーが発生する
kubectlを使用するにはkubeconfigファイルが必要です。通常、マスターノードの
/etc/kubernetes/admin.confがそれです。このファイルをワーカーノードにコピーして設定します:
scp /etc/kubernetes/admin.conf 172.16.2.202:/etc/kubernetes/admin.conf
ワーカーノード側で環境変数を設定:
export KUBECONFIG=/etc/kubernetes/admin.conf
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
これによりkubectlが正しく動作するようになります。
ネットワークプラグインflannelが初期化できない
FlannelのPodがPending状態で止まっている場合、Podログを確認します:
kubectl get pods -n kube-system -o wide
kubectl logs -f kube-flannel-ds-amd64-hl89n -n kube-system
次のようなエラーが見られる場合:
Error from server: Get https://172.16.2.203:10250/containerLogs/kube-system/kube-flannel-ds-amd64-hl89n/kube-flannel?follow=true: dial tcp 172.16.2.203:10250: connect: no route to host
ノードにログインし、kubeletのログを確認:
journalctl -u kubelet -f
ログからイメージのプルに失敗していることが判明した場合は、プロキシ設定やローカルにイメージを手動でインポートする方法を検討してください。
一部のノードでPodが起動できない(ContainerCreatingのまま)
PodがContainerCreatingのまま進まない場合、ログを確認してください:
NetworkPlugin cni failed to set up pod "demo-deployment-675b5f9477-hdcwg_default" network: failed to set bridge addr: "cni0" already has an IP address different from 10.0.2.1/24
これは以前にノードが登録されていたためにCNI設定が残っている可能性があります。ノードをリセットしてネットワーク設定を削除してください:
kubeadm reset
systemctl stop kubelet && systemctl stop docker && rm -rf /var/lib/cni/ && rm -rf /var/lib/kubelet/* && rm -rf /var/lib/etcd && rm -rf /etc/cni/ && ifconfig cni0 down && ifconfig flannel.1 down && ifconfig docker0 down && ip link delete cni0 && ip link delete flannel.1
systemctl start docker
その後、トークンを再生成し、ノードを再登録します。