2.2. odo アーキテクチャー
このセクションでは、odo
アーキテクチャーについて説明し、odo
による OpenShift Container Platform リソースのクラスターでの管理方法について説明します。
2.2.1. 開発者の設定
odo を使用すると、ターミナルを使って OpenShift Container Platform クラスターでアプリケーションを作成し、デプロイできます。コードエディタープラグインは、ユーザーがそれぞれの IDE ターミナルから OpenShift Container Platform クラスターと対話することを可能にする odo を使用します。odo を使用するプラグインの例: VS Code Openshift Connector、OpenShift Connector for Intellij、Codewind for Eclipse Che。
odo は Windows、macOS、および Linux のオペレーティングシステムで機能し、すべてのターミナルから使用できます。odo は bash および zsh コマンドラインシェルの自動補完を提供します。
odo 1.1.0 は Node.js および Java コンポーネントをサポートします。
2.2.2. OpenShift source-to-image
OpenShift Source-to-Image (S2I) はオープンソースプロジェクトであり、ソースコードからアーティファクトをビルドし、これらをコンテナーイメージに挿入するのに役立ちます。S2I は、Dockerfile なしにソースコードをビルドすることで、実行可能なイメージを生成します。odo は、コンテナー内で開発者ソースコードを実行するために S2I ビルダーイメージを使用します。
2.2.3. OpenShift クラスターオブジェクト
2.2.3.1. Init コンテナー
init コンテナーはアプリケーションコンテナーが起動する前に実行される特殊なコンテナーであり、アプリケーションコンテナーの実行に必要な環境を設定します。init コンテナーには、アプリケーションイメージにないファイル (設定スクリプトなど) を含めることができます。Init コンテナーは常に完了するまで実行され、Init コンテナーのいずれかに障害が発生した場合にはアプリケーションコンテナーは起動しません。
odo によって作成された Pod は 2 つの Init コンテナーを実行します。
-
copy-supervisord
Init コンテナー。 -
copy-files-to-volume
Init コンテナー。
2.2.3.1.1. copy-supervisord
copy-supervisord
Init コンテナーは必要なファイルを emptyDir
ボリュームにコピーします。メインのアプリケーションコンテナーはこれらのファイルを emptyDir
ボリュームから使用します。
emptyDir
ボリュームにコピーされるファイル:
バイナリー:
-
go-init
は最小限の init システムです。アプリケーションコンテナー内の最初のプロセス (PID 1) として実行されます。go-init は、開発者コードを実行するSupervisorD
デーモンを起動します。go-init は、孤立したプロセスを処理するために必要です。 -
SupervisorD
はプロセス制御システムです。これは設定されたプロセスを監視し、それらが実行中であることを確認します。また、必要に応じてサービスを再起動します。odo の場合、SupervisorD
は開発者コードを実行し、監視します。
-
設定ファイル:
-
supervisor.conf
は、SupervisorD デーモンの起動に必要な設定ファイルです。
-
スクリプト:
-
assemble-and-restart
は、ユーザーソースコードをビルドし、デプロイするための OpenShift S2I の概念です。assemble-and-restart スクリプトは、まずアプリケーションコンテナー内でユーザーソースコードをアセンブルしてから、ユーザーの変更を有効にするために SupervisorD を再起動します。 -
Run
は、アセンブルされたソースコードを実行することに関連した OpenShift S2I の概念です。run
スクリプトはassemble-and-restart
スクリプトで作成されたアセンブルされたコードを実行します。 -
s2i-setup
は、assemble-and-restart
および run スクリプトが正常に実行されるために必要なファイルおよびディレクトリーを作成するスクリプトです。このスクリプトは、アプリケーションのコンテナーが起動されるたびに実行されます。
-
ディレクトリー:
-
language-scripts
: OpenShift S2I はカスタムのassemble
およびrun
スクリプトを許可します。language-scripts
ディレクトリーにいくつかの言語固有のカスタムスクリプトがあります。カスタムスクリプトは、odo のデバッグを機能させる追加の設定を提供します。
-
emtpyDir Volume
は、Init コンテナーとアプリケーションコンテナーの両方の /opt/odo
マウントポイントにマウントされます。
2.2.3.1.2. copy-files-to-volume
copy-files-to-volume
Init コンテナーは、S2I ビルダーイメージの /opt/app-root
にあるファイルを永続ボリュームにコピーします。次に、ボリュームはアプリケーションコンテナーの同じ場所 (/opt/app-root
) にマウントされます。
PersistentVolume
が /opt/app-root
にないと、このディレクトリーのデータは、PersistentVolumeClaim
が同じ場所にマウントされる際に失われます。
PVC
は、Init コンテナー内の /mnt
マウントポイントにマウントされます。
2.2.3.2. アプリケーションコンテナー
アプリケーションコンテナーは、ユーザーソースコードが実行されるメインコンテナーです。
アプリケーションコンテナーは、以下の 2 つのボリュームでマウントされます。
-
emptyDir
ボリュームは/opt/odo
にマウントされます。 -
PersistentVolume
は/opt/app-root
にマウントされます。
go-init
はアプリケーションコンテナー内の最初のプロセスとして実行されます。次に、go-init
プロセスは SupervisorD
を起動します。
SupervisorD
は、ユーザーのアセンブルされたソースコードを実行し、監視します。ユーザープロセスがクラッシュすると、SupervisorD
がこれを再起動します。
2.2.3.3. PersistentVolume
および PersistentVolumeClaim
PersistentVolumeClaim
(PVC
) は、PersistentVolume
をプロビジョニングする Kubernetes のボリュームタイプです。PersistentVolume
のライフサイクルは Pod ライフサイクルとは異なります。PersistentVolume
のデータは Pod の再起動後も永続します。
copy-files-to-volume
Init コンテナーは、必要なファイルを PersistentVolume
にコピーします。メインアプリケーションコンテナーは、実行時にこれらのファイルを使用します。
PersistentVolume
の命名規則は <component-name>-s2idata です。
Container | PVC のマウント先 |
---|---|
|
|
アプリケーションコンテナー |
|
2.2.3.4. emptyDir
ボリューム
emptyDir
ボリュームは、Pod がノードに割り当てられている際に作成され、Pod がノードで実行されている限り存在します。コンテナーが再起動または移動すると、emptyDir
の内容が削除され、Init コンテナーはデータを emptyDir
に復元します。emptyDir
の初期状態は空です。
copy-supervisord
Init コンテナーは必要なファイルを emptyDir
ボリュームにコピーします。これらのファイルは、実行時にメインアプリケーションコンテナーによって使用されます。
Container | emptyDir Volume のマウント先 |
---|---|
|
|
アプリケーションコンテナー |
|
2.2.3.5. サービス
サービスは、一連の Pod と通信する方法を抽象化する Kubernetes の概念です。
odo はすべてのアプリケーション Pod についてサービスを作成し、これが通信用にアクセス可能にします。
2.2.4. odo push
のワークフロー
このセクションでは、odo push
ワークフローについて説明します。odo push は必要なすべての OpenShift Container Platform リソースを使って OpenShift Container Platform クラスターにユーザーコードをデプロイします。
リソースの作成
まだ作成されていない場合には、
odo push
は以下の OpenShift Container Platform リソースを作成します。デプロイメント設定 (DC):
-
2 つの init コンテナー
copy-supervisord
およびcopy-files-to-volume
が実行されます。init コンテナーはファイルをemptyDir
とPersistentVolume
タイプのボリュームのそれぞれにコピーします。 -
アプリケーションコンテナーが起動します。アプリケーションコンテナーの最初のプロセスは、PID=1 の
go-init
プロセスです。 go-init
プロセスは SupervisorD デーモンを起動します。注記ユーザーアプリケーションコードはアプリケーションコンテナーにコピーされていないため、
SupervisorD
デーモンはrun
スクリプトを実行しません。
-
2 つの init コンテナー
- サービス
- シークレット
-
PersistentVolumeClaim
ファイルのインデックス設定
- ファイルインデックサーは、ソースコードディレクトリーのファイルをインデックス化します。インデックサーはソースコードディレクトリー間を再帰的に移動し、作成、削除、または名前が変更されたファイルを検出します。
-
ファイルインデックサーは、
.odo
ディレクトリー内の odo インデックスファイルにインデックス化された情報を維持します。 - odo インデックスファイルが存在しない場合、ファイルインデックサーの初回の実行時であることを意味し、新規の odo インデックス JSON ファイルが作成されます。odo index JSON ファイルにはファイルマップが含まれます。移動したファイルの相対パスと、変更され、削除されたファイルの絶対パスが含まれます。
コードのプッシュ
ローカルコードは、通常は
/tmp/src
の下にあるアプリケーションコンテナーにコピーされます。assemble-and-restart
の実行ソースコードのコピーに成功すると、
assemble-and-restart
スクリプトは実行中のアプリケーションコンテナー内で実行されます。