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作業ノードに新しいコンテナーを作成することができず、can't stat lower layer というエラーが表示される。
can't stat lower layer ... because it does not exist. Going through storage to recreate the missing symlinks.-
クラスターをアップグレードした後、またはノードを再起動しようとすると、ノードが
NotReady状態になる。 -
コンテナーランタイム実装
(crio) が正しく動作していない。 -
コンテナーランタイムインスタンス
(crio) が動作していないため、oc debug node/<nodename>を使用してノード上でデバッグシェルを開始することができまない。
この手順で、CRI-O のストレージを完全に消去し、エラーを解消してください。
前提条件:
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
OpenShift CLI (
oc) がインストールされている。
手順
ノードで
cordonを使用します。これは、ノードがReady状態になった場合に、ワークロードがスケジューリングされるのを防ぐためです。Status セクションにSchedulingDisabledと表示されていれば、スケジューリングが無効になっていることがわかります。$ oc adm cordon <nodename>cluster-admin ユーザーとして、ノードをドレインします。
$ oc adm drain <nodename> --ignore-daemonsets --delete-local-data注記Pod または Pod テンプレートの
terminateGracePeriodSeconds属性は、正常な終了期間を制御します。この属性のデフォルトは 30 秒ですが、必要に応じてアプリケーションごとにカスタマイズできます。90 秒を超えて設定すると、Pod がSIGKILLedとマークされ、正常に終了しない可能性があります。ノードが戻ってきたら、SSH またはコンソールでノードに接続し直します。その後、root ユーザーで接続します。
$ ssh core@node1.example.com $ sudo -ikubelet を手動で停止します。
# systemctl stop kubeletコンテナーや Pod を停止します。
# crictl rmp -facrio のサービスを手動で停止します。
# systemctl stop crioこれらのコマンドを実行すると、一時ストレージを完全に消去することができます。
# crio wipe -fcrio および kubelet サービスを起動します。
# systemctl start crio # systemctl start kubeletcrio および kubelet サービスが起動しており、ノードが
Readyのステータスになっている場合には、クリーンアップが正常に機能したことが分かります。$ oc get nodes出力例
NAME STATUS ROLES AGE VERSION ci-ln-tkbxyft-f76d1-nvwhr-master-1 Ready, SchedulingDisabled master 133m v1.22.0-rc.0+75ee307ノードをスケジューリング可能な状態にします。スケジューリングが有効になったことは、
SchedulingDisabledのステータスがなくなったときにわかります。$ oc adm uncordon <nodename>出力例
NAME STATUS ROLES AGE VERSION ci-ln-tkbxyft-f76d1-nvwhr-master-1 Ready master 133m v1.22.0-rc.0+75ee307