エアギャップ(インターネット接続無し)環境での OCP(Openshift Container Platform) の導入/運用手順を紹介するシリーズです。今回は「エアギャップ環境にインストールした OCP へのコンテナアプリケーションデプロイ」手順を紹介します。せっかく作った OCP クラスタもアプリケーションをデプロイできなくては宝の持ち腐れです。でもアプリケーションのデプロイってインターネット接続を前提とする処理が多いのです。一部の商用アプリケーションの中にはエアギャップ環境を前提とした導入方法が提供されているものもないわけではないのですが、多くのアプリケーションの場合はそうではありません。例えばアプリケーションイメージがある DockerHub などのイメージリポジトリを指定してデプロイ・・・はエアギャップ環境だとできませんよね。OCP の機能であるソースコードと Dockerfile からデプロイ・・・も、インターネット接続が無いとベースイメージは取得できないし、"npm install" みたいな外部ライブラリのインストールもできないのです。さてどうやってアプリケーションをデプロイするのか・・・ という紹介です。
【大まかな流れ】
エアギャップ環境の OCP クラスタにアプリケーションコンテナをデプロイする場合、大きくは以下の流れを実施することになります:
(0)エアギャップ環境の OCP クラスタを用意
(1)インターネット接続環境下でコンテナアプリケーション化したコンテナイメージをイメージファイルとして保存
(2)(1)のイメージファイルをエアギャップ環境に持ち込んで、ミラーレジストリに格納してから OCP にデプロイ
ではこの流れで実際にアプリケーションをエアギャップ環境の OCP にデプロイする手順を紹介します。
【(0)エアギャップ環境の OCP クラスタを用意】
エアギャップ環境への OCP インストール方法は既にこのブログで前回紹介済みです。インターネット接続のない環境下に OCP クラスタが構築されている、という前提で以下を紹介するので、そのような OCP 環境を用意してください。
【(1)インターネット接続環境下でコンテナアプリケーション化したコンテナイメージをイメージファイルとして保存】
(1)はインターネット接続環境下で実施する手順です。インターネット接続環境がある状態で docker 環境を用意し、その docker を使ってインストールしたいコンテナアプリケーションを(ベースイメージや依存環境含めて)イメージファイル化する、という手順です。 なお今回は私が作成して公開している dotnsf/hostname というコンテナアプリケーションを例にエアギャップ OCP にデプロイする、という手順を紹介します(他のアプリケーションでも同様に応用できると思います)。
ちなみにこのアプリケーションは docker 環境があれば、
というコマンドでデプロイして、8080 番ポートを使って動かすことができます。機能が本当にシンプルで「HTTP リクエストに対してコンテナ Pod 内の /etc/hostname を表示する」というだけのアプリケーションです。コンテナクラスタ環境では1つのアプリケーションが色々な Pod で動くので、その Pod を確認するためだけに作ったものです。実際に動かしてアクセスすると以下のような画面になる、というだけのものです(こんな感じの画面が出ればデプロイ成功だと思ってください):

ではこのコンテナアプリケーションをエアギャップ環境の OCP にデプロイするまでの手順を紹介します。まずはインターネット接続状態で docker 導入済みの環境を用意してください。RHEL であれば "yum install podman" で docker 互換の podman をインストールしていただいても構いません。 前回の記事でもエアギャップ OCP を構築する前にインターネット接続環境でも準備を行いましたが、この時のインターネット接続環境が残っている場合はその環境でも構いません(こちらの環境であれば podman もインストール済みのはずです)。
では手順をおってこの dotnsf/hostname アプリケーションをイメージファイル化していきます。まず今回のターゲットであるイメージは公開イメージなのでそのままでもダウンロード(docker pull)できますが、認証が必要なイメージの場合はログインしておきます:
そして対象のイメージ(dotnsf/hostname)を pull します:
pull したイメージをファイル(hostname.tar)として保存します:
このファイル(hostname.tar)はアプリケーションの動作に必要なイメージやライブラリが含まれたものです。このファイルをエアギャップ環境内に持ち込む必要があります。
【(2)(1)のイメージファイルをエアギャップ環境に持ち込んで、ミラーレジストリに格納してから OCP にデプロイ】
USB メディア等を使って、(1)で作成したファイルを前回のブログで作ったエアギャップ環境のバスチョンサーバーに持ち込みます。仮に /data/hostname.tar として用意できているものと仮定して以下を続けます。
バスチョンサーバーに root でログインしてターミナルを開きます。一般ユーザーでログインしてからターミナルを開いて "sudo -i" で root 権限に昇格するでも構いません。
この後 podman のイメージ操作を実行するため、podman にログインします。前回のブログで作ったエアギャップ環境の場合はユーザーもパスワードも admin で作っていたので以下のコマンドを実行します(異なるサーバー名や認証情報の場合は適宜読み替えて実行してください):
まずはコンテナイメージファイルをエアギャップ環境の podman にロードします:
"podman images" を実行します。この時点では "docker.io/dotnsf/hostname.tar" という名前で登録されていることが確認できるはずです(青字は実行結果):
このイメージに "registry.ocp.xxx.localdomain:5000/openshift/hostname" という、ミラーレジストリのサーバー名を含む名前でタグ付けを実施します:
再度 "podman images" を実行して以下のような状態になっていれば(最後の行が追加できていれば)タグ付けは成功です:
タグ付けした名前でイメージをプッシュします:
ここまでできればアプリケーションイメージコンテナがリポジトリに登録された状態になっているので、エアギャップ環境ではない通常の方法と同様にアプリケーションがデプロイできるようになります。 エアギャップ環境に構築した OCP のウェブコンソール画面をブラウザで開いてログインし、画面左上のメニューから "Administrator" ではなく "Developer" を選択してデベロッパーモードに切り替えます:

デベロッパーモードの画面から "+Add" を選択します。初回はプロジェクトが選択されていないと思うので("default" などを)選択します。プロジェクトが選択された画面で(アプリケーションのデプロイ方法を選択する画面で) "Container images" を選択します:

アプリケーションのイメージ格納場所を入力する画面になります。まず "Image name from external registry" を選択し、その URL として "registry.ocp.xxx.localdomain:5000/openshift/hostname" を入力します。すると以下画面のようにエラーメッセージが表示されます。これはミラーレジストリが公開レジストリではないので(認証情報が必要なので)出ているエラーです。そこで認証情報を登録するため "create an image pull secret" と書かれたリンクをクリックします:

レジストリサーバーとその認証情報を指定して作成します。名前は適当に入力し、サーバー名は "registry.ocp.xxx.localdomain:5000" 、ユーザー名とパスワードは "admin" として "Create" します:

前の画面に戻り、新しいシークレットが作成された、というメッセージが表示されていることが確認できます。 まだエラーメッセージが表示されていますが、先ほどの内容とは異なっているはずです。今度は(https でアクセスするレジストリサーバーが)自己署名証明書を使っているのでセキュアではない、というメッセージです。そこで "Allow Images from insecure registry" にチェックを入れます:

チェックを入れると赤字のエラーメッセージが消え、"Validated" というメッセージが表示されます。これでデプロイ元の情報を入力できました:

下に画面をスクロールすると、デプロイするアプリケーションの情報入力画面になります。名前などは適当に、デフォルトのままでも構いませんが、Target port は 8080 を入力し、"Create route" にチェックを入れて、すぐにアクセスできる状態にしてください。最後に "Create" ボタンをクリックします:

すると以下のような画面に切り替わります(青枠が表示されるまで少し時間がかかります)。この状態でアプリケーションはコンテナクラスタ内にデプロイされています。アイコン右上の小さなマークをクリックして、アプリケーションを開いてみます:

すると(route が作成したアプリケーション公開用 URL が)開きます。自己署名証明書なので警告メッセージが表示されますが、先に進めます:

正しくアプリケーションが開くと以下のような画面になります。味気ないですが、上記で説明した /etc/hostname ファイルの内容がそのまま表示されたような画面が開けばアプリケーションとして正しく動いています:

これでエアギャップ環境に構築した OCP クラスタ内に、コンテナアプリケーションをデプロイして動かす(ブラウザから動作確認する)ことができました。エアギャップ環境用のインストール手順が用意されていない一般アプリケーションの場合でも、インターネット接続環境で事前に準備しておくことで導入が可能になります。
次回は本シリーズの最終回として、最も情報量の少なかった「エアギャップ環境での OCP アップグレード」手順を紹介します。
・エアギャップ環境(インターネット接続のない環境)で OCP を導入/運用する上で必要な前提理解
・エアギャップ環境(インターネット接続のない環境)で OCP を導入する手順
・エアギャップ環境(インターネット接続のない環境)で OCP にアプリケーションを導入する手順
・エアギャップ環境(インターネット接続のない環境)に導入した OCP をエアギャップ環境内でアップグレードする手順
【大まかな流れ】
エアギャップ環境の OCP クラスタにアプリケーションコンテナをデプロイする場合、大きくは以下の流れを実施することになります:
(0)エアギャップ環境の OCP クラスタを用意
(1)インターネット接続環境下でコンテナアプリケーション化したコンテナイメージをイメージファイルとして保存
(2)(1)のイメージファイルをエアギャップ環境に持ち込んで、ミラーレジストリに格納してから OCP にデプロイ
ではこの流れで実際にアプリケーションをエアギャップ環境の OCP にデプロイする手順を紹介します。
【(0)エアギャップ環境の OCP クラスタを用意】
エアギャップ環境への OCP インストール方法は既にこのブログで前回紹介済みです。インターネット接続のない環境下に OCP クラスタが構築されている、という前提で以下を紹介するので、そのような OCP 環境を用意してください。
【(1)インターネット接続環境下でコンテナアプリケーション化したコンテナイメージをイメージファイルとして保存】
(1)はインターネット接続環境下で実施する手順です。インターネット接続環境がある状態で docker 環境を用意し、その docker を使ってインストールしたいコンテナアプリケーションを(ベースイメージや依存環境含めて)イメージファイル化する、という手順です。 なお今回は私が作成して公開している dotnsf/hostname というコンテナアプリケーションを例にエアギャップ OCP にデプロイする、という手順を紹介します(他のアプリケーションでも同様に応用できると思います)。
ちなみにこのアプリケーションは docker 環境があれば、
# docker run -d -p 8080:8080 dotnsf/hostname
というコマンドでデプロイして、8080 番ポートを使って動かすことができます。機能が本当にシンプルで「HTTP リクエストに対してコンテナ Pod 内の /etc/hostname を表示する」というだけのアプリケーションです。コンテナクラスタ環境では1つのアプリケーションが色々な Pod で動くので、その Pod を確認するためだけに作ったものです。実際に動かしてアクセスすると以下のような画面になる、というだけのものです(こんな感じの画面が出ればデプロイ成功だと思ってください):

ではこのコンテナアプリケーションをエアギャップ環境の OCP にデプロイするまでの手順を紹介します。まずはインターネット接続状態で docker 導入済みの環境を用意してください。RHEL であれば "yum install podman" で docker 互換の podman をインストールしていただいても構いません。 前回の記事でもエアギャップ OCP を構築する前にインターネット接続環境でも準備を行いましたが、この時のインターネット接続環境が残っている場合はその環境でも構いません(こちらの環境であれば podman もインストール済みのはずです)。
では手順をおってこの dotnsf/hostname アプリケーションをイメージファイル化していきます。まず今回のターゲットであるイメージは公開イメージなのでそのままでもダウンロード(docker pull)できますが、認証が必要なイメージの場合はログインしておきます:
# podman login -u <username>
そして対象のイメージ(dotnsf/hostname)を pull します:
# podman pull dotnsf/hostname
pull したイメージをファイル(hostname.tar)として保存します:
# podman save dotnsf/hostname -o hostname.tar
このファイル(hostname.tar)はアプリケーションの動作に必要なイメージやライブラリが含まれたものです。このファイルをエアギャップ環境内に持ち込む必要があります。
【(2)(1)のイメージファイルをエアギャップ環境に持ち込んで、ミラーレジストリに格納してから OCP にデプロイ】
USB メディア等を使って、(1)で作成したファイルを前回のブログで作ったエアギャップ環境のバスチョンサーバーに持ち込みます。仮に /data/hostname.tar として用意できているものと仮定して以下を続けます。
バスチョンサーバーに root でログインしてターミナルを開きます。一般ユーザーでログインしてからターミナルを開いて "sudo -i" で root 権限に昇格するでも構いません。
この後 podman のイメージ操作を実行するため、podman にログインします。前回のブログで作ったエアギャップ環境の場合はユーザーもパスワードも admin で作っていたので以下のコマンドを実行します(異なるサーバー名や認証情報の場合は適宜読み替えて実行してください):
# podman login -u admin -p admin registry.ocp.xxx.localdomain:5000
まずはコンテナイメージファイルをエアギャップ環境の podman にロードします:
# podman load -i /data/hostname.tar
"podman images" を実行します。この時点では "docker.io/dotnsf/hostname.tar" という名前で登録されていることが確認できるはずです(青字は実行結果):
# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/registry latest a8781fe3b7a2 6 months ago 26 MB
docker.io/dotnsf/hostname latest d7e7918516db 3 years ago 97.5 MB
このイメージに "registry.ocp.xxx.localdomain:5000/openshift/hostname" という、ミラーレジストリのサーバー名を含む名前でタグ付けを実施します:
# podman tag docker.io/dotnsf/hostname registry.ocp.xxx.localdomain:5000/openshift/hostname
再度 "podman images" を実行して以下のような状態になっていれば(最後の行が追加できていれば)タグ付けは成功です:
# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/registry latest a8781fe3b7a2 6 months ago 26 MB
docker.io/dotnsf/hostname latest d7e7918516db 3 years ago 97.5 MB
registry.ocp.xxx.localdomain:5000/openshift/hostname latest d7e7918516db 3 years ago 97.5 MB
タグ付けした名前でイメージをプッシュします:
# podman push registry.ocp.xxx.localdomain:5000/openshift/hostname
ここまでできればアプリケーションイメージコンテナがリポジトリに登録された状態になっているので、エアギャップ環境ではない通常の方法と同様にアプリケーションがデプロイできるようになります。 エアギャップ環境に構築した OCP のウェブコンソール画面をブラウザで開いてログインし、画面左上のメニューから "Administrator" ではなく "Developer" を選択してデベロッパーモードに切り替えます:

デベロッパーモードの画面から "+Add" を選択します。初回はプロジェクトが選択されていないと思うので("default" などを)選択します。プロジェクトが選択された画面で(アプリケーションのデプロイ方法を選択する画面で) "Container images" を選択します:

アプリケーションのイメージ格納場所を入力する画面になります。まず "Image name from external registry" を選択し、その URL として "registry.ocp.xxx.localdomain:5000/openshift/hostname" を入力します。すると以下画面のようにエラーメッセージが表示されます。これはミラーレジストリが公開レジストリではないので(認証情報が必要なので)出ているエラーです。そこで認証情報を登録するため "create an image pull secret" と書かれたリンクをクリックします:

レジストリサーバーとその認証情報を指定して作成します。名前は適当に入力し、サーバー名は "registry.ocp.xxx.localdomain:5000" 、ユーザー名とパスワードは "admin" として "Create" します:

前の画面に戻り、新しいシークレットが作成された、というメッセージが表示されていることが確認できます。 まだエラーメッセージが表示されていますが、先ほどの内容とは異なっているはずです。今度は(https でアクセスするレジストリサーバーが)自己署名証明書を使っているのでセキュアではない、というメッセージです。そこで "Allow Images from insecure registry" にチェックを入れます:

チェックを入れると赤字のエラーメッセージが消え、"Validated" というメッセージが表示されます。これでデプロイ元の情報を入力できました:

下に画面をスクロールすると、デプロイするアプリケーションの情報入力画面になります。名前などは適当に、デフォルトのままでも構いませんが、Target port は 8080 を入力し、"Create route" にチェックを入れて、すぐにアクセスできる状態にしてください。最後に "Create" ボタンをクリックします:

すると以下のような画面に切り替わります(青枠が表示されるまで少し時間がかかります)。この状態でアプリケーションはコンテナクラスタ内にデプロイされています。アイコン右上の小さなマークをクリックして、アプリケーションを開いてみます:

すると(route が作成したアプリケーション公開用 URL が)開きます。自己署名証明書なので警告メッセージが表示されますが、先に進めます:

正しくアプリケーションが開くと以下のような画面になります。味気ないですが、上記で説明した /etc/hostname ファイルの内容がそのまま表示されたような画面が開けばアプリケーションとして正しく動いています:

これでエアギャップ環境に構築した OCP クラスタ内に、コンテナアプリケーションをデプロイして動かす(ブラウザから動作確認する)ことができました。エアギャップ環境用のインストール手順が用意されていない一般アプリケーションの場合でも、インターネット接続環境で事前に準備しておくことで導入が可能になります。
次回は本シリーズの最終回として、最も情報量の少なかった「エアギャップ環境での OCP アップグレード」手順を紹介します。
・エアギャップ環境(インターネット接続のない環境)で OCP を導入/運用する上で必要な前提理解
・エアギャップ環境(インターネット接続のない環境)で OCP を導入する手順
・エアギャップ環境(インターネット接続のない環境)で OCP にアプリケーションを導入する手順
・エアギャップ環境(インターネット接続のない環境)に導入した OCP をエアギャップ環境内でアップグレードする手順