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 です。

ContainerPVC のマウント先

copy-files-to-volume

/mnt

アプリケーションコンテナー

/opt/app-root

2.2.3.4. emptyDir ボリューム

emptyDir ボリュームは、Pod がノードに割り当てられている際に作成され、Pod がノードで実行されている限り存在します。コンテナーが再起動または移動すると、emptyDir の内容が削除され、Init コンテナーはデータを emptyDir に復元します。emptyDir の初期状態は空です。

copy-supervisord Init コンテナーは必要なファイルを emptyDir ボリュームにコピーします。これらのファイルは、実行時にメインアプリケーションコンテナーによって使用されます。

ContaineremptyDir Volume のマウント先

copy-supervisord

/opt/odo

アプリケーションコンテナー

/opt/odo

2.2.3.5. サービス

サービスは、一連の Pod と通信する方法を抽象化する Kubernetes の概念です。

odo はすべてのアプリケーション Pod についてサービスを作成し、これが通信用にアクセス可能にします。

2.2.4. odo push のワークフロー

このセクションでは、odo push ワークフローについて説明します。odo push は必要なすべての OpenShift Container Platform リソースを使って OpenShift Container Platform クラスターにユーザーコードをデプロイします。

  1. リソースの作成

    まだ作成されていない場合には、odo push は以下の OpenShift Container Platform リソースを作成します。

    • デプロイメント設定 (DC):

      • 2 つの init コンテナー copy-supervisord および copy-files-to-volume が実行されます。init コンテナーはファイルを emptyDirPersistentVolume タイプのボリュームのそれぞれにコピーします。
      • アプリケーションコンテナーが起動します。アプリケーションコンテナーの最初のプロセスは、PID=1 の go-init プロセスです。
      • go-init プロセスは SupervisorD デーモンを起動します。

        注記

        ユーザーアプリケーションコードはアプリケーションコンテナーにコピーされていないため、SupervisorD デーモンは run スクリプトを実行しません。

    • サービス
    • シークレット
    • PersistentVolumeClaim
  2. ファイルのインデックス設定

    • ファイルインデックサーは、ソースコードディレクトリーのファイルをインデックス化します。インデックサーはソースコードディレクトリー間を再帰的に移動し、作成、削除、または名前が変更されたファイルを検出します。
    • ファイルインデックサーは、.odo ディレクトリー内の odo インデックスファイルにインデックス化された情報を維持します。
    • odo インデックスファイルが存在しない場合、ファイルインデックサーの初回の実行時であることを意味し、新規の odo インデックス JSON ファイルが作成されます。odo index JSON ファイルにはファイルマップが含まれます。移動したファイルの相対パスと、変更され、削除されたファイルの絶対パスが含まれます。
  3. コードのプッシュ

    ローカルコードは、通常は /tmp/src の下にあるアプリケーションコンテナーにコピーされます。

  4. assemble-and-restart の実行

    ソースコードのコピーに成功すると、assemble-and-restart スクリプトは実行中のアプリケーションコンテナー内で実行されます。