8.7. Source-to-Image (S2I) プロセスのトラブルシューティング
8.7.1. Source-to-Image (S2I) のトラブルシューティングのストラテジー リンクのコピーリンクがクリップボードにコピーされました!
Source-to-Image (S2I) を使用して、再現可能な Docker 形式のコンテナーイメージをビルドします。アプリケーションソースコードをコンテナーイメージに挿入し、新規イメージをアセンブルして実行可能なイメージを作成できます。新規イメージには、ベースイメージ (ビルダー) およびビルドされたソースが組み込まれています。
S2I プロセスで障害が発生する場所を特定するには、以下の各 S2I ステージに関連する Pod の状態を確認できます。
- ビルド設定の段階 で、ビルド Pod はベースイメージおよびアプリケーションのソースコードからアプリケーションコンテナーイメージを作成するために使用されます。
- デプロイメント設定の段階 で、デプロイメント Pod はビルド設定段階でビルドされたアプリケーションコンテナーイメージからアプリケーション Pod をデプロイするために使用されます。デプロイメント Pod は、サービスやルートなどの他のリソースもデプロイします。デプロイメント設定は、ビルド設定が成功すると開始されます。
-
デプロイメント Pod のアプリケーション Pod の起動後 に、アプリケーションの障害が実行中のアプリケーション Pod 内で発生する可能性があります。たとえば、アプリケーション Pod が
Running状態であっても、アプリケーションは予想通りに動作しない可能性があります。このシナリオでは、実行中のアプリケーション Pod にアクセスして、Pod 内のアプリケーションの障害を調査できます。
S2I の問題のトラブルシューティングを行う際には、以下のストラテジーに従います。
- ビルド、デプロイメント、およびアプリケーション Pod ステータスの監視
- 問題が発生した S2I プロセスのステージの判別
- 失敗したステージに対応するログの確認
8.7.2. Source-to-Image 診断データの収集 リンクのコピーリンクがクリップボードにコピーされました!
S2I ツールは、ビルド Pod とデプロイメント Pod を順番に実行します。デプロイメント Pod は、ビルドステージで作成されたアプリケーションコンテナーイメージに基づいてアプリケーション Pod をデプロイします。S2I プロセスで障害が発生する場所を判別するために、ビルド、デプロイメント、およびアプリケーション Pod のステータスを監視します。次に、これに応じて診断データを収集します。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 - API サービスが機能している。
-
OpenShift CLI (
oc) がインストールされている。
手順
S2I プロセス全体での Pod のステータスを確認し、障害が発生するステージを判別します。
oc get pods -w
$ oc get pods -w1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
-wを使用して、Ctrl+Cを使用してコマンドを終了するまで Pod で変更の有無を監視します。
障害のある Pod のログでエラーの有無を確認します。
ビルド Pod が失敗する場合、ビルド Pod のログを確認します。
oc logs -f pod/<application_name>-<build_number>-build
$ oc logs -f pod/<application_name>-<build_number>-buildCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記または、
oc logs -f bc/<application_name>を使用して、ビルド設定のログを確認できます。ビルド設定のログには、ビルド Pod からのログが含まれます。デプロイメント Pod が失敗する場合、デプロイメント Pod のログを確認します。
oc logs -f pod/<application_name>-<build_number>-deploy
$ oc logs -f pod/<application_name>-<build_number>-deployCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記または、
oc logs -f dc/<application_name>を使用して、デプロイメント設定のログを確認できます。これにより、デプロイメント Pod が正常に実行されるまで、デプロイメント Pod からログが出力されます。デプロイメント Pod の完了後に実行すると、コマンドはアプリケーション Pod からログを出力します。デプロイメント Pod の完了後も、oc logs -f pod/<application_name>-<build_number>-deployを実行してログにアクセスできます。アプリケーション Pod が失敗した場合や、アプリケーションが実行中のアプリケーション Pod 内で予想通りに動作しない場合、アプリケーション Pod のログを確認します。
oc logs -f pod/<application_name>-<build_number>-<random_string>
$ oc logs -f pod/<application_name>-<build_number>-<random_string>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.7.3. アプリケーションの障害を調査するためのアプリケーション診断データの収集 リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションの障害は実行中のアプリケーション Pod 内で発生する可能性があります。このような状態では、以下のストラテジーを使用して診断情報を取得できます。
- アプリケーション Pod に関連するイベントを確認します。
- アプリケーション Pod からログを確認します。これには、OpenShift Logging フレームワークによって収集されないアプリケーション固有のログファイルが含まれます。
- アプリケーション機能を対話的にテストし、アプリケーションコンテナーで診断ツールを実行します。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
OpenShift CLI (
oc) がインストールされている。
手順
特定のアプリケーション Pod に関連するイベントをリスト表示します。以下の例では、
my-app-1-akdlgという名前のアプリケーション Pod のイベントを取得します。oc describe pod/my-app-1-akdlg
$ oc describe pod/my-app-1-akdlgCopy to Clipboard Copied! Toggle word wrap Toggle overflow アプリケーション Pod からのログを確認します。
oc logs -f pod/my-app-1-akdlg
$ oc logs -f pod/my-app-1-akdlgCopy to Clipboard Copied! Toggle word wrap Toggle overflow 実行中のアプリケーション Pod 内で特定のログを照会します。標準出力 (stdout) に送信されるログは OpenShift Logging フレームワークによって収集され、これは前述のコマンドの出力に含まれます。以下のクエリーは、標準出力 (stdout) に送信されないログにのみ必要です。
Pod 内で root 権限なしにアプリケーションログにアクセスできる場合は、以下のようにログファイルを表示します。
oc exec my-app-1-akdlg -- cat /var/log/my-application.log
$ oc exec my-app-1-akdlg -- cat /var/log/my-application.logCopy to Clipboard Copied! Toggle word wrap Toggle overflow アプリケーションログの表示に root アクセスが必要な場合は、root 権限でデバッグコンテナーを起動し、コンテナー内でログファイルを表示できます。プロジェクトの
DeploymentConfigオブジェクトからデバッグコンテナーを起動します。通常、Pod ユーザーは root 以外の権限で実行しますが、問題を調査するために一時的な root 権限で Pod のトラブルシューティングを実行することは役に立ちます。oc debug dc/my-deployment-configuration --as-root -- cat /var/log/my-application.log
$ oc debug dc/my-deployment-configuration --as-root -- cat /var/log/my-application.logCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記oc debug dc/<deployment_configuration> --as-rootを-- <command>を追加せずに実行する場合、デバッグ Pod 内で root アクセスでインタラクティブなシェルにアクセスできます。
インタラクティブなシェルでアプリケーション機能を対話的にテストし、アプリケーションコンテナーで診断ツールを実行します。
アプリケーションコンテナーでインタラクティブなシェルを起動します。
oc exec -it my-app-1-akdlg /bin/bash
$ oc exec -it my-app-1-akdlg /bin/bashCopy to Clipboard Copied! Toggle word wrap Toggle overflow - シェルからアプリケーションの機能を対話的にテストします。たとえば、コンテナーのエントリーポイントコマンドを実行して、結果を確認することができます。次に、ソースコードを更新し、S2I プロセスでアプリケーションコンテナーを再ビルドする前に、コマンドラインから直接に変更をテストします。
コンテナー内で利用可能な診断バイナリーを実行します。
注記一部の診断バイナリーを実行するには、root 権限が必要です。このような状況では、
oc debug dc/<deployment_configuration> --as-rootを実行して、問題のある Pod のDeploymentConfigオブジェクトに基づいて、root 権限でデバッグ Pod を起動できます。次に、デバッグ Pod 内から診断バイナリーを root として実行できます。
診断バイナリーがコンテナー内で利用できない場合は、
nsenterを使用して、コンテナーの namespace 内でホストの診断バイナリーを実行できます。以下の例では、ホストのipバイナリーを使用して、コンテナーの namespace 内でip adを実行します。ターゲットノードのデバッグセッションに入ります。この手順は、
<node_name>-debugというデバッグ Pod をインスタンス化します。oc debug node/my-cluster-node
$ oc debug node/my-cluster-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) を実行する Red Hat OpenShift Service on AWS 4 クラスターノードは、イミュータブルです。クラスターの変更を適用するには、Operator を使用します。SSH を使用したクラスターノードへのアクセスは推奨されません。ただし、Red Hat OpenShift Service on AWS API が使用できない場合、または kubelet がターゲットノード上で適切に機能していない場合は、
oc操作が影響を受けます。この場合は、代わりにssh core@<node>.<cluster_name>.<base_domain>を使用してノードにアクセスできます。ターゲットコンテナー ID を判別します。
crictl ps
# crictl psCopy to Clipboard Copied! Toggle word wrap Toggle overflow コンテナーのプロセス ID を確認します。この例では、ターゲットコンテナー ID は
a7fe32346b120です。crictl inspect a7fe32346b120 --output yaml | grep 'pid:' | awk '{print $2}'# crictl inspect a7fe32346b120 --output yaml | grep 'pid:' | awk '{print $2}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow ホストの
ipバイナリーを使用して、コンテナーの namespace 内でip adを実行します。この例では、31150をコンテナーのプロセス ID として使用します。nsenterコマンドは、ターゲットプロセスの namespace を入力し、その namespace でコマンドを実行します。この例のターゲットプロセスはコンテナーのプロセス ID であるため、ip adコマンドは、ホストからコンテナーの namespace で実行されます。nsenter -n -t 31150 -- ip ad
# nsenter -n -t 31150 -- ip adCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記デバッグノードなどの特権付きコンテナーを使用している場合のみ、コンテナーの namespace 内でホストの診断バイナリーを実行できます。