k3sトラブルシューティング

自宅サーバk3sのトラブルシューティング

ある程度、ルーチンワークができるようになりたい。

ノードの一覧表示

kubectl get nodes

問題が起きていたら、↓ノードの状態を確認

kubectl describe node <node-name>

ポッドの一覧表示

kubectl get pods --all-namespaces
kubectl get events --all-namespaces

問題のあるポッドのログを確認

kubectl logs --since=12h <pod-name> -n <namespace>
  • --since=<期間> で狭められる
  • –since-time オプション: 特定の日時以降のログを取得するには、–since-time オプションを使用します。
  • –tail オプション: ログの最後の数行だけを表示するには、–tail オプションを使用
  • –timestamps: ログにタイムスタンプを付けて表示するには、–timestamps オプションを使用します。これにより、ログを後でフィルタリングする際に便利です。

例えば

kubectl logs --since=10h -n kube-system local-path-provisioner-6c86858495-s6v98

もしPod内に複数のコンテナが稼働している場合、特定のコンテナのログを確認します。

kubectl logs <pod-name> -c <container-name> -n <namespace>

以前のログを確認

Podが再起動している場合、以前のログも確認する必要があります。そのためには–previousオプションを使用します。

kubectl logs <pod-name> -n <namespace> --previous

特定のコンテナの以前のログを確認する場合は次のようになります。

kubectl logs <pod-name> -c <container-name> -n <namespace> --previous

Kubernetesリソースの状態を確認する

デプロイメント、レプリカセット、サービスなど、他のKubernetesリソースの状態を確認します。

kubectl get deployments -n <namespace>
kubectl get replicasets -n <namespace>
kubectl get services -n <namespace>
kubectl describe deployment <deployment-name> -n <namespace>
kubectl describe service <service-name> -n <namespace>

k3sのデーモンの状態を確認する

systemctl status k3s.service # 状態の確認
systemctl cat k3s.service # 設定の確認
sudo journalctl -r --since today # 今日のログの確認

ingress-nginx の確認

# 1) いまの状態
kubectl -n ingress-nginx get pods,svc,events

# 2) Pod が CrashLoopBackOff / Error なら詳細
POD=$(kubectl -n ingress-nginx get pod -l app.kubernetes.io/component=controller -o jsonpath='{.items[0].metadata.name}')
kubectl -n ingress-nginx describe pod "$POD" | sed -n '1,160p'
kubectl -n ingress-nginx logs "$POD" --tail=200

# 3) DaemonSetがスケジュールできているか
kubectl -n ingress-nginx get ds,events

# 4) MetalLB がVIPを割り当てているか(EXTERNAL-IP列)
kubectl -n ingress-nginx get svc ingress-nginx-controller -o wide
kubectl -n metallb-system get ipaddresspools.l2.metallb.io,l2advertisements.metallb.io
kubectl -n metallb-system get pods,events

# 5) 競合しやすい“既定のTraefik/ServiceLB”が動いてないか
kubectl -n kube-system get pods | egrep -i 'traefik|svclb|klipper'

よくあるエラーと対処

listen tcp :80: bind: address already in use / :443: → Traefik か k3sのServiceLB(klipper-lbのsvclb-XXX) が 80/443 を占有。 traefikをオフにする必要がある(k3sはデフォルトで起動する)

EXTERNAL-IP が <pending> のまま: → MetalLBが未稼働 / L2広告が効かない / アドレスプール範囲がLAN外 等。

IPアドレスプールの確認

kubectl get ipaddresspools.metallb.io -A -o wide
kubectl get l2advertisements.metallb.io -A -o yaml
kubectl -n metallb-system get role,rolebinding
kubectl -n metallb-system get pods,events
kubectl -n metallb-system logs deploy/metallb-controller --tail=120 | tail -n +1
kubectl -n ingress-nginx describe svc ingress-nginx-controller | sed -n '1,160p'

参考