Kubectlを用いたKubernetesノードのデバッグ
このページでは、Kubernetesクラスター上で動作しているノードをkubectl debug
コマンドを使用してデバッグする方法について説明します。
始める前に
Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。 このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。 まだクラスターがない場合、minikubeを使って作成するか、 以下のいずれかのKubernetesプレイグラウンドも使用できます:
作業するKubernetesサーバーは次のバージョン以降のものである必要があります: 1.2. バージョンを確認するには次のコマンドを実行してください:kubectl version
.Podを作成し、それらの新しいPodを任意のノードに割り当てる権限が必要です。 また、ホストのファイルシステムにアクセスするPodを作成する権限も必要です。
kubectl debug node
を用いてノードをデバッグする
kubectl debug node
コマンドを使用して、トラブルシューティングしたいノードにPodをデプロイします。
このコマンドは、SSH接続を使用してノードにアクセスできないシナリオで役に立ちます。
Podが作成されると、そのPodはノード上で対話型シェルを開きます。
mynodeという名前のノード上で対話型シェルを作成するには、次のように実行します。
kubectl debug node/mynode -it --image=ubuntu
mynodeという名前のノード上に、コンテナデバッガーを持つデバッグの用Pod、node-debugger-mynode-pdx84を作成します。
コマンドプロンプトが表示されない場合は、エンターキーを押してみてください。
root@mynode:/#
デバッグコマンドは、情報を収集し、問題をトラブルシューティングするのに役立ちます。
使用する可能性のあるコマンドには、ip
、ifconfig
、nc
、ping
、ps
などがあります。
また、mtr
、tcpdump
、curl
などの他のツールもそれぞれのパッケージマネージャーからインストールすることができます。
備考:
デバッグコマンドは、デバッグ用のPodが使用しているイメージに基づいて異なる場合があり、これらのコマンドをインストールする必要があるかもしれません。デバッグ用のPodは、Pod内の/host
にマウントされたノードのルートファイルシステムにアクセスできます。
kubeletをファイルシステムのネームスペースで実行している場合、デバッグ用のPodはそのネームスペースのルートを見ることになり、ノード全体のルートではありません。
典型的なLinuxノードの場合、関連するログを見つけるために以下のパスを確認できます。
/host/var/log/kubelet.log
- ノード上でコンテナを実行する責任がある
kubelet
からのログです。 /host/var/log/kube-proxy.log
- サービスのエンドポイントへのトラフィックを指示する責任がある
kube-proxy
からのログです。 /host/var/log/containerd.log
- ノード上で実行されている
containerd
プロセスからのログです。 /host/var/log/syslog
- システムに関する一般的なメッセージや情報です。
/host/var/log/kern.log
- カーネルログです。
ノード上でデバッグセッションを作成する際には、以下の点を考慮してください。
kubectl debug
は、新しいPodの名前をノードの名前に基づいて自動的に生成します。- ノードのルートファイルシステムは
/host
にマウントされます。 - コンテナはホストのIPC、ネットワーク、PID Namespaceで実行されますが、Podは特権を持っていません。
これは、一部のプロセス情報の読み取りが失敗する可能性があることを意味します。
その情報へのアクセスはスーパーユーザーに制限されているためです。
例えば、
chroot /host
は失敗します。 特権Podが必要な場合は、手動で作成するか、--profile=sysadmin
を使用してください。 - デバッグ用のPodにデバッグプロファイルを適用することで、securityContextなどの特定のプロパティを設定できます。
クリーンアップ
デバッグ用のPodの使用が終了したら、それを削除してください。
kubectl get pods
NAME READY STATUS RESTARTS AGE
node-debugger-mynode-pdx84 0/1 Completed 0 8m1s
# Podの名前は適宜変更してください
kubectl delete pod node-debugger-mynode-pdx84 --now
pod "node-debugger-mynode-pdx84" deleted
備考:
ノードがダウンしている場合(ネットワークから切断されている、kubeletが停止して再起動しないなど)、kubectl debug node
コマンドは機能しません。
その場合は、ダウンあるいは到達不能なノードのデバッグを確認してください。