このチュートリアルでは、Python アプリケーションをクラウド上の OpenShift クラスター内にデプロイする方法を説明します。ここで説明する方法は、他のランタイム環境で開発されたアプリケーションやマイクロサービスをデプロイする場合にも適用できます。このチュートリアルに記載するサンプル・コードで使用しているのは、Red Hat® OpenShift® on IBM Cloud™ です。
このチュートリアルでは、IBM Cloud 上の OpenShift クラスターに対してアプリケーションをビルドしてデプロイする 3 つのシナリオを取り上げます。各シナリオは次のとおりです。
既存の Docker イメージを IBM Cloud 上の OpenShift クラスターにプッシュしてからデプロイする必要がある: このシナリオでは、プライベート・リポジトリー内に既存の Docker イメージが格納されています。このイメージを IBM Cloud 上の OpenShift クラスターにデプロイする必要があります。このデプロイ・シナリオは例えば、アプリケーションを最新化する際の「リフト・アンド・シフト」手法で適用することが考えられます。ソースにはアクセスできないため、継続的インテグレーション/デリバリー・メカニズムは実装されません。
ソースが格納された GitHub リポジトリーと、イメージのアセンブル方法を指示する Dockerfile がある: イメージのアセンブルを完全に制御し、必要な依存関係とバージョンだけを使用して柔軟にイメージをアセンブルしたい場合は、このシナリオを適用できます。依存関係は自分で指定するので、コードは常に依存関係と互換性を持つことになります。このシナリオでは Dockerfile の保守が必要になりますが、それは時には複雑なタスクになることもあります。このシナリオを適用する場合、OpenShift クラスターに対する継続的インテグレーションおよびデリバリーが可能になるため、デプロイ済みバージョンのコードを常に最新の状態に維持できます。
ソースが格納された GitHub リポジトリーがある: このシナリオでは、OpenShift の Source to Image (S2I) ツールキットを頼りに Docker イメージを作成します。OpenShift の S2I は、リポジトリー内に格納されたソースと、ビルダー・イメージを使用して、新しい Docker イメージを作成します。
oc new-app ...
コマンドの実行時にリポジトリー内にDockerfile
が存在していなければ、ソース・コード言語が自動的に検出されます。言語の検出ルールはここに指定されています。OpenShift ブログによると、S2I を使用するメリットは、速度、パッチ適用容易性、ユーザー効率、エコシステムにあります。このシナリオを適用する場合も、OpenShift クラスターに対する継続的インテグレーションおよびデリバリーが可能になるため、デプロイ済みバージョンのコードを常に最新の状態に維持できます。
前提条件
IBM Cloud アカウント、OpenShift CLI、Docker が必要です。
所要時間
このチュートリアルの所要時間は約 30 分です。
ステップ 1. OpenShift クラスター・インスタンスを作成する
OpenShift クラスターの新しいインスタンスを作成します。適切なプランを選択してから「Create (作成)」をクリックします。
ステップ 2. ローカル・レジストリー内の Docker イメージを使用してアプリケーションをデプロイする
サンプル・コードが用意されている GitHub リポジトリー (github.com/IBM/deploy-python-openshift-tutorial) 内に、ソースと Dockerfile があります。このチュートリアルでは、これらのサンプル・コードを使用して Docker イメージをアセンブルした後、そのイメージを OpenShift クラスターにデプロイします。
以下のコマンドを実行して GitHub リポジトリーを複製します。
$ git clone https://github.com/IBM/deploy-python-openshift-tutorial.git
OpenShift クラスターにデプロイするアプリケーションの Docker イメージをビルドします。
$ cd deploy-python-openshift-tutorial $ docker build -t helloworldpython:latest .
OpenShift Web コンソールを開きます。
CLI を使用して OpenShift にログインし、新しいプロジェクトを作成します。
$ oc login https://c100-e.us-east.containers.cloud.ibm.com:30682 --token=xxxxxxxxxxxxxxx $ oc new-project exampleproject
Docker レジストリーのルートを作成します。
$ oc project default $ oc get svc
次のような内容の出力が返されます。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE docker-registry ClusterIP 172.21.xxx.xx <none> 5000/TCP 18h kubernetes ClusterIP 172.21.x.x <none> 443/TCP,53/UDP,53/TCP 18h myfirstosdeploy ClusterIP 172.21.xx.xxx <none> 5000/TCP 17h registry-console ClusterIP 172.21.xxx.xxx <none> 9000/TCP 18h router LoadBalancer 172.21.xx.x 169.47.xxx.xxx 80:31297/TCP,443:30385/TCP 18h
以下のコマンドを実行して Docker レジストリーのルートを作成します。
$ oc create route reencrypt --service=docker-registry
作成されたルートの詳細を確認します。
$ oc get route docker-registry
以下のような出力が返されます。
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD docker-registry docker-registry-default.clustersiteam-5290cxxxxxxxxxxd1b85xxx-0001.us-east.containers.appdomain.cloud docker-registry 5000-tcp reencrypt None
レジストリー URL のパターンは、
docker-registry-default.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud
となっています。この Docker レジストリー URL をメモします。以降のステップで、この URL が必要になります。
Docker CLI を使用して Docker レジストリーにログインします。
注: 前にメモした Docker レジストリー URL を使用してください。
docker login -u $(oc whoami) -p $(oc whoami -t) docker-registry-default.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud
以下の例に示すように、Docker イメージにタグを付けます。
docker tag helloworldpython:latest docker-registry-default.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud/exampleproject/helloworldpython:latest
Docker イメージを OpenShift Docker レジストリーにプッシュします。
docker push docker-registry-default.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud/exampleproject/helloworldpython
イメージを OpenShift にデプロイして、ルートを公開します。
$ oc project exampleproject $ oc new-app --image-stream=helloworldpython --name=helloworldpython $ oc expose svc/helloworldpython
helloworldpython
アプリケーションの OpenShift コンソール上に表示されている「Open Url (URL を開く)」アイコンをクリックします。ブラウザー・ウィンドウ内に
Hello, world!
メッセージが表示されます。
ステップ 3. ソースが格納された GitHub リポジトリーと Dockerfile を使用してアプリケーションをデプロイする
このステップでのデプロイには、同じ GitHub リポジトリー (github.com/IBM/deploy-python-openshift-tutorial) を使用します。Dockerfile には、イメージをアセンブルするための指示が含まれています。
このステップのサンプル・コードでは、前に作成した exampleproject
を使用しています。
$ oc project exampleproject
以下のコマンドを実行してアプリケーションをデプロイします。
$ oc new-app https://github.com/IBM/deploy-python-openshift-tutorial
$ oc expose svc/deploy-python-openshift-tutorial
deploy-python-openshift-tutorial
アプリケーションの OpenShift コンソール上に表示されている「Open Url (URL を開く)」アイコンをクリックします。
ブラウザー・ウィンドウ内に Hello, world!
メッセージが表示されます。
ステップ 4. ソースが格納された GitHub リポジトリーを使用してアプリケーションをデプロイする
このステップでのデプロイには、同じ GitHub リポジトリー (github.com/IBM/deploy-python-openshift-tutorial) を使用します。ここでは、OpenShift S2I がビルダー・イメージとそのソースを使用して、OpenShift クラスターにデプロイする新しい Docker イメ―ジを作成します。
$ oc new-app https://github.com/IBM/deploy-python-openshift-s2i-tutorial
$ oc expose svc/deploy-python-openshift-s2i-tutorial
deploy-python-openshift-s2i-tutorial
アプリケーションの OpenShift コンソール上に表示されている「Open Url (URL を開く)」アイコンをクリックします。
ブラウザー・ウィンドウ内に Hello, world!
メッセージが表示されます。
まとめ
アプリケーションをビルドして OpenShift クラスターにデプロイする 3 つの方法は以上のとおりです。Red Hat OpenShift on IBM Cloud で、実際に独自のデプロイを試すことができます。
Source-to-Image について詳しく学ぶには、この動画をご覧ください。