7.3. CRI-O コンテナーランタイムの問題のトラブルシューティング
7.3.1. CRI-O コンテナーランタイムエンジンについて リンクのコピーリンクがクリップボードにコピーされました!
CRI-O は Kubernetes ネイティブコンテナーエンジン実装です。これはオペレーティングシステムに密接に統合し、Kubernetes の効率的で最適化されたエクスペリエンスを提供します。CRI-O コンテナーエンジンは、各 OpenShift Container Platform クラスターノードで systemd サービスとして実行されます。
コンテナーランタイムの問題が発生する場合は、各ノードの crio systemd サービスのステータスを確認します。コンテナーのランタイムに問題があるノードから CRI-O journald ユニットログを収集します。
7.3.2. CRI-O ランタイムエンジンのステータスの確認 リンクのコピーリンクがクリップボードにコピーされました!
各クラスターノードで CRI-O コンテナーランタイムエンジンのステータスを確認できます。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
OpenShift CLI (
oc) がインストールされている。
手順
デバッグ Pod 内で、ノードの
criosystemd サービスをクエリーして CRI-O ステータスを確認します。ノードのデバッグ Pod を起動します。
oc debug node/my-node
$ oc debug node/my-nodeCopy to Clipboard Copied! Toggle word wrap Toggle overflow /hostをデバッグシェル内の root ディレクトリーとして設定します。デバッグ Pod は、Pod 内の/hostにホストの root ファイルシステムをマウントします。root ディレクトリーを/hostに変更すると、ホストの実行パスに含まれるバイナリーを実行できます。chroot /host
# chroot /hostCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記Red Hat Enterprise Linux CoreOS (RHCOS) を実行する OpenShift Container Platform 4.16 クラスターノードは、イミュータブルです。クラスターの変更を適用するには、Operator を使用します。SSH を使用したクラスターノードへのアクセスは推奨されません。ただし、OpenShift Container Platform API が利用できない場合や、kubelet がターゲットノードで適切に機能しない場合、
oc操作がその影響を受けます。この場合は、代わりにssh core@<node>.<cluster_name>.<base_domain>を使用してノードにアクセスできます。criosystemd サービスがノードでアクティブかどうかを確認します。systemctl is-active crio
# systemctl is-active crioCopy to Clipboard Copied! Toggle word wrap Toggle overflow より詳細な
crio.serviceステータスの要約を出力します。systemctl status crio.service
# systemctl status crio.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.3.3. CRI-O の journald ユニットログの収集 リンクのコピーリンクがクリップボードにコピーされました!
CRI-O の問題が発生した場合には、ノードから CRI-O journald ユニットログを取得できます。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 - API サービスが機能している。
-
OpenShift CLI (
oc) がインストールされている。 - コントロールプレーンまたはコントロールプレーンマシンの完全修飾ドメイン名がある。
手順
CRI-O journald ユニットログを収集します。以下の例は、クラスター内のすべてのコントロールプレーンノードからログを収集します。
oc adm node-logs --role=master -u crio
$ oc adm node-logs --role=master -u crioCopy to Clipboard Copied! Toggle word wrap Toggle overflow 特定のノードから CRI-O journald ユニットログを収集します。
oc adm node-logs <node_name> -u crio
$ oc adm node-logs <node_name> -u crioCopy to Clipboard Copied! Toggle word wrap Toggle overflow API が機能しない場合は、代わりに SSH を使用してログを確認します。
<node>.<cluster_name>.<base_domain>を適切な値に置き換えます。ssh core@<node>.<cluster_name>.<base_domain> journalctl -b -f -u crio.service
$ ssh core@<node>.<cluster_name>.<base_domain> journalctl -b -f -u crio.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記Red Hat Enterprise Linux CoreOS (RHCOS) を実行する OpenShift Container Platform 4.16 クラスターノードは、イミュータブルです。クラスターの変更を適用するには、Operator を使用します。SSH を使用したクラスターノードへのアクセスは推奨されません。SSH 経由で診断データの収集を試行する前に、
oc adm must gatherおよびその他のocコマンドを実行して収集されるデータが十分であるかどうかを確認してください。ただし、OpenShift Container Platform API が利用できない場合や、kubelet がターゲットノードで適切に機能しない場合、oc操作がその影響を受けます。この場合は、代わりにssh core@<node>.<cluster_name>.<base_domain>を使用してノードにアクセスできます。
7.3.4. CRI-O ストレージの消去 リンクのコピーリンクがクリップボードにコピーされました!
以下の問題が発生した場合、CRI-O の一時ストレージを手動でクリアすることができます。
ノードは Pod を実行できず、次のエラーが表示されます。
Failed to create pod sandbox: rpc error: code = Unknown desc = failed to mount container XXX: error recreating the missing symlinks: error reading name of symlink for XXX: open /var/lib/containers/storage/overlay/XXX/link: no such file or directory
Failed to create pod sandbox: rpc error: code = Unknown desc = failed to mount container XXX: error recreating the missing symlinks: error reading name of symlink for XXX: open /var/lib/containers/storage/overlay/XXX/link: no such file or directoryCopy to Clipboard Copied! Toggle word wrap Toggle overflow 作業ノードに新しいコンテナーを作成することができず、“can’t stat lower layer” というエラーが表示される。
can't stat lower layer ... because it does not exist. Going through storage to recreate the missing symlinks.
can't stat lower layer ... because it does not exist. Going through storage to recreate the missing symlinks.Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
クラスターをアップグレードした後、またはノードを再起動しようとすると、ノードが
NotReady状態になる。 -
コンテナーランタイム実装 (
crio) が正しく動作していない。 -
コンテナーランタイムインスタンス (
crio) が動作していないため、oc debug node/<node_name>を使用してノード上でデバッグシェルを開始できない。
この手順で、CRI-O のストレージを完全に消去し、エラーを解消してください。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
OpenShift CLI (
oc) がインストールされている。
手順
ノードで
cordonを使用します。これは、ノードがReady状態になった場合に、ワークロードがスケジューリングされるのを防ぐためです。Status セクションにSchedulingDisabledと表示されていれば、スケジューリングが無効になっていることがわかります。oc adm cordon <node_name>
$ oc adm cordon <node_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow cluster-admin ユーザーとして、ノードをドレインします。
oc adm drain <node_name> --ignore-daemonsets --delete-emptydir-data
$ oc adm drain <node_name> --ignore-daemonsets --delete-emptydir-dataCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記Pod または Pod テンプレートの
terminationGracePeriodSeconds属性は、正常な終了期間を制御します。この属性のデフォルトは 30 秒ですが、必要に応じてアプリケーションごとにカスタマイズできます。90 秒を超えて設定すると、Pod がSIGKILLedとマークされ、正常に終了しない可能性があります。ノードが戻ってきたら、SSH またはコンソールでノードに接続し直します。その後、root ユーザーで接続します。
ssh core@node1.example.com sudo -i
$ ssh core@node1.example.com $ sudo -iCopy to Clipboard Copied! Toggle word wrap Toggle overflow kubelet を手動で停止します。
systemctl stop kubelet
# systemctl stop kubeletCopy to Clipboard Copied! Toggle word wrap Toggle overflow コンテナーや Pod を停止します。
以下のコマンドを使用して、
HostNetworkにない Pod を停止します。これらが削除されるかどうかは、HostNetworkにあるネットワークプラグイン Pod に左右されるので、先に削除する必要があります。.. for pod in $(crictl pods -q); do if [[ "$(crictl inspectp $pod | jq -r .status.linux.namespaces.options.network)" != "NODE" ]]; then crictl rmp -f $pod; fi; done
.. for pod in $(crictl pods -q); do if [[ "$(crictl inspectp $pod | jq -r .status.linux.namespaces.options.network)" != "NODE" ]]; then crictl rmp -f $pod; fi; doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 他のすべての Pod を停止します。
crictl rmp -fa
# crictl rmp -faCopy to Clipboard Copied! Toggle word wrap Toggle overflow
crio のサービスを手動で停止します。
systemctl stop crio
# systemctl stop crioCopy to Clipboard Copied! Toggle word wrap Toggle overflow これらのコマンドを実行すると、一時ストレージを完全に消去することができます。
crio wipe -f
# crio wipe -fCopy to Clipboard Copied! Toggle word wrap Toggle overflow crio および kubelet サービスを起動します。
systemctl start crio systemctl start kubelet
# systemctl start crio # systemctl start kubeletCopy to Clipboard Copied! Toggle word wrap Toggle overflow crio および kubelet サービスが起動しており、ノードが
Readyのステータスになっている場合には、クリーンアップが正常に機能したことが分かります。oc get nodes
$ oc get nodesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NAME STATUS ROLES AGE VERSION ci-ln-tkbxyft-f76d1-nvwhr-master-1 Ready, SchedulingDisabled master 133m v1.29.4
NAME STATUS ROLES AGE VERSION ci-ln-tkbxyft-f76d1-nvwhr-master-1 Ready, SchedulingDisabled master 133m v1.29.4Copy to Clipboard Copied! Toggle word wrap Toggle overflow ノードをスケジューリング可能な状態にします。スケジューリングが有効になったことは、
SchedulingDisabledのステータスがなくなったときにわかります。oc adm uncordon <node_name>
$ oc adm uncordon <node_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NAME STATUS ROLES AGE VERSION ci-ln-tkbxyft-f76d1-nvwhr-master-1 Ready master 133m v1.29.4
NAME STATUS ROLES AGE VERSION ci-ln-tkbxyft-f76d1-nvwhr-master-1 Ready master 133m v1.29.4Copy to Clipboard Copied! Toggle word wrap Toggle overflow