OpenShift Serverless を使用して Azure Red Hat OpenShift にアプリケーションをデプロイする

この記事では、OpenShift Serverless を使用して、Azure Red Hat OpenShift クラスターにアプリケーションをデプロイします。 OpenShift Serverless を使用すると、開発者は、オンデマンドでスケールアップまたはゼロにスケーリングされるアプリケーションをデプロイして実行できます。 これにより、不使用時のリソースの消費を回避できます。

アプリケーション コードは、適切なランタイムと共にコンテナーにパッケージ化できます。 イベントによってアプリケーション コンテナーがトリガーされると、サーバーレス機能によってそのコンテナーが開始されます。 独自のアプリケーションからのイベント、複数のクラウド サービス プロバイダーからのイベント、サービスとしてのソフトウェア (SaaS) システムからのイベント、その他のサービスからのイベントなど、さまざまなイベントによってアプリケーションをトリガーできます。

組み込みの OpenShift インターフェイス機能を使用して、サーバーレス コンテナーのデプロイのすべての側面を管理できます。 開発者は、どのイベントがコンテナー化されたアプリケーションの起動を引き起こしたか視覚的に特定できます。 イベント パラメーターを変更する方法も複数あります。 OpenShift Serverless アプリケーションは、OpenShift Pipelines、Service Mesh、Monitoring など、他の OpenShift サービスと統合できます。 これにより、完全なサーバーレス アプリケーションの開発とデプロイのエクスペリエンスが提供されます。

開始する前に

クラスターの作成

チュートリアルに従って、Azure Red Hat OpenShift クラスターを作成します。 コマンド ライン インターフェイス (CLI) をローカルにインストールして使用する場合、このチュートリアルでは、Azure CLI バージョン 2.6.0 以降を使用する必要があります。 現在のバージョンを調べるには、az --version を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。

クラスターに接続する

Azure Red Hat OpenShift クラスターを管理するには、oc (OpenShift コマンドライン クライアント) を使用する必要があります。

Note

Azure Cloud ShellOpenShift コマンド ラインをインストールし、この記事のすべてのコマンド ライン操作にそれを使用することをお勧めします。 shell.azure.com からシェルを開くか、次のリンクを選択します。

Button to launch Azure Cloud Shell

チュートリアルに従って CLI をインストールし、クラスターの資格情報を取得して、Web コンソールと OpenShift CLI を使用してクラスターに接続します。

ログインすると、default プロジェクトを使用しているというメッセージが表示されます。

Login successful.

You have access to 61 projects, the list has been suppressed. You can list all projects with 'oc projects'

Using project "default".

Knative コマンド ライン インターフェイス (kn) をインストールする

お使いのコンピューターに適した "コマンド ライン インターフェイス" (CLI) の最新リリースを、https://github.com/knative/client/releases/ からダウンロードします

Azure Cloud Shell でコマンドを実行する場合は、Linux 用の最新の Knative CLI をダウンロードしてください。

cd ~
wget https://github.com/knative/client/releases/download/v0.22.0/kn-linux-amd64

mkdir knative
chmod +x kn-linux-amd64
mv kn-linux-amd64 knative/kn
echo 'export PATH=$PATH:~/knative' >> ~/.bashrc && source ~/.bashrc

OpenShift Web コンソールを開く

次のスクリプトを実行して、クラスターの Web コンソールの URL を見つけます。

 az aro show \
    --name <cluster name> \
    --resource-group <resource group> \
    --query "consoleProfile.url" -o tsv

次のような URL を取得する必要があります。

https://console-openshift-console.apps.wzy5hg7x.eastus.aroapp.io/

Web ブラウザーを開き、コンソールの URL を開きます。 kubeadmin 資格情報を使用してログインします。

A screenshot that shows the Azure Red Hat OpenShift log-in screen

OpenShift サーバーレス オペレーターをインストールする

OpenShift Web コンソールにログインしたら、[管理者] ビューが表示されていることを確認します。 [Operator Hub] (オペレーター ハブ) を開き、[OpenShift Serverless] オペレーターを選択します。

A screenshot that shows the position of the OpenShift Serverless operator.

次に、[インストール] を選択して、オペレーターのインストール ページを開きます。

A screenshot that shows how to select Install to install the operator.

Azure Red Hat OpenShift のクラスター バージョンに適した "更新チャネル" を選択し、openshift-serverless 名前空間にオペレーターをインストールします。 下にスクロールし、[インストール] を選択します。

A screenshot that shows the Operator installation page.

オペレーターがインストールされ、使用できる状態になっていることが数分で状態ページに反映されます。 [オペレーターの表示] ボタンを選択して続行します。

A screenshot that shows the status page with the operator installed and ready for use.

Knative サービスをインストールする

OpenShift Serverless でサーバーレス方式でコンテナーを実行するオプションは、アップストリーム Knative を使用することで実現します。 Knative は Kubernetes を拡張し、そのサーバーレス手法を通じて最新のアプリケーションをデプロイ、実行、管理する一連のコンポーネントを提供します。

Knative サービスのインスタンスを作成する

ウィンドウの左上隅にある [プロジェクト] の一覧で、knative-server を選択します。 次に、[Provided APIs] (提供されている API) ウィンドウの [Knative Serving] (Knative サービス) カード内で、[インスタンスの作成] を選択します。

A screenshot that shows where to select to create a Knative Service instance.

[Create Knative Serving] (Knative サービスの作成) ページで、すべての既定値をそのまま使用します。 下にスクロールし、[作成] ボタンを選択します。

A screenshot that shows the default values listed in the form.

[状態] 列に [準備完了] と表示されている場合は、OpenShift Serverless がインストールされています。 これで、OpenShift Serverless プロジェクトを作成する準備ができました。

A screenshot that shows that the Knative Serving is ready.

サーバーレス プロジェクトを作成する

demoserverless という名前の新しいプロジェクトを作成するために、次のコマンドを実行します。

oc new-project demoserverless

出力は次のようになります。

Now using project "demoserverless" on server "https://api.wzy5hg7x.eastus.aroapp.io:6443".

You can add applications to this project with the 'new-app' command. For example, build a new example application in Python with the following:

    oc new-app django-psql-example

Or use kubectl to deploy a simple Kubernetes application:

    kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node

[管理者] ビューから [開発者] ビューに切り替えます。 左側のメニューでプロジェクトの一覧に移動し、demoserverless を選択します。 これにより、プロジェクトの [トポロジ] ページが表示されます。

A screenshot that shows Azure Red Hat OpenShift project topology.

Web コンソールを使用してデプロイする

[トポロジ] ページで、[From Git] (Git から) を選択します。 [Import from Git] (Git からインポート) ページで、[Git Repo URL] (Git リポジトリの URL) として https://github.com/sclorg/django-ex.git を使用します。 サンプルの Web アプリケーションは、Python プログラミング言語を使用して実装されています。

A screenshot that shows Azure Red Hat OpenShift project from within Git.

Note

OpenShift では、これが Python プロジェクトであることが検出され、適切なビルダー イメージが選択されます。

[リソース] までスクロールし、生成するリソースの種類として [Knative Service] (Knative サービス) が選択されていることを確認します。 これにより、Knative サービスが作成されます。これは、アイドル時に OpenShift Serverless でゼロへのスケーリングを実行できるデプロイの種類です。

A screenshot that shows how to select the Knative Service.

ページの下部にある [作成] を選択します。 これにより、アプリケーションのビルドとデプロイを管理するためのリソースが作成されます。 その後、プロジェクトのトポロジの概要にリダイレクトされます。

トポロジの概要では、デプロイしたアプリケーションが視覚的表現が表示されます。 アプリケーションの全体的な構造を確認できます。

ビルドが完了するまで待ちます。 これには数分かかることがあります。 ビルドが完了すると、サービスの左下隅に緑色のチェックマークが表示されます。

A screenshot that shows a checkmark that indicates that the build is complete.

アプリケーションの規模を確認する

[トポロジ] ビューの上部にある [表示オプション] の一覧で、[ポッド数] を選択します。 ポッド数がゼロにスケールダウンされるまで待機します。 スケールダウンには数分かかることがあります。

A screenshot that shows the Pod count when it has scaled to zero.

[Knative Service] (Knative サービス) パネルの右上隅にある [URL を開く] アイコンを選択します。 アプリケーションが新しいブラウザー タブで開きます。このタブを閉じて、[トポロジ] ビューに戻ります。 ここで、要求に合わせてアプリケーションがポッド数 1 にスケールアップされたことを確認できます。 数分後、アプリケーションはポッド数ゼロに戻るようスケールダウンされます。

A screenshot that shows the application scaled up to Pod.

新しいリビジョンを強制し、トラフィックの分散を設定する

Knative サービスでは、トラフィックをマッピングできます。つまり、サービスのリビジョンを、割り当てられたトラフィックの一部にマップできます。 サービス構成の更新のたびに新しいリビジョンが作成されます。 既定では、サービス ルートによって、すべてのトラフィックが最新の準備完了リビジョンに送られます。 この動作を変更するには、どのリビジョンでトラフィックの一部を取得するかを定義します。 トラフィック マッピングでは、個々のリビジョンに対して固有の URL を作成するオプションも利用できます。

作成されたトポロジで、サービス内に表示されているリビジョンを選択すると、その詳細が表示されます。 ポッド リングの下にあるバッジと詳細パネルの上部にあるバッジは (REV) となります。 サイド パネルの [リソース] タブ内で、下にスクロールし、サービスに関連付けられている構成を選択します。

A screenshot that shows the Pod ring.

[YAML] タブに切り替えて、下にスクロールし、timeoutSeconds の値を編集して、構成の更新を強制します。 値を 301 に変更します。 [保存] を選択します。 実際のシナリオでは、コンテナー イメージ タグを更新することでも構成の更新をトリガーできます。

A screenshot that shows how to force a new revision by updating the configuration.

[トポロジ] ビューに戻り、新しいリビジョンがデプロイされたことを確認します。 (KSVC) という表記で終わるサービスを選択し、[トラフィックの分散を設定する] ボタンを選択します。 これで、サービスのリビジョン間でトラフィックを分割できます。

A screenshot that shows how to set traffic distribution.

[トポロジ] ビューで、リビジョン間でトラフィックがどのように分散されているかが示されます。

A screenshot that shows how to review traffic distribution.

Knative コマンド ライン インターフェイス (kn) を使用する

前の手順では、OpenShift Web コンソールを使用して、アプリケーションを作成し、OpenShift Serverless にデプロイしました。 OpenShift Serverless では表面下で Knative が実行されているため、Knative コマンド ライン インターフェイス (kn) を使用して Knative サービスを作成することもできます。

Note

kn CLI をまだインストールしていない場合は、この記事の「前提条件」セクションの手順に従ってください。 また、OpenShift コマンド ライン インターフェイス oc を使用してログインしていることも確認してください。

quay.io/rhdevelopers/knative-tutorial-greeter で既にビルドされているコンテナー イメージを使用します。

サービスをデプロイする

サービスをデプロイするには、次のコマンドを実行します。

kn service create greeter \
--image quay.io/rhdevelopers/knative-tutorial-greeter:quarkus \
--namespace demoserverless \
--revision-name greeter-v1

次のような出力が表示されます。

Creating service 'greeter' in namespace 'demoserverless':

  0.044s The Route is still working to reflect the latest desired specification.
  0.083s ...
  0.114s Configuration "greeter" is waiting for a Revision to become ready.
 10.420s ...
 10.489s Ingress has not yet been reconciled.
 10.582s Waiting for load balancer to be ready
 10.763s Ready to serve.

Service 'greeter' created to latest revision 'greeter-v1' is available at URL:
http://greeter-demoserverless.apps.wzy5hg7x.eastus.aroapp.io

以下を実行することで、プロジェクトのルートの一覧を取得できます。

kn route list

名前空間内のルートの一覧が取得されます。 Web ブラウザーで URL を開いて、デプロイされたサービスを表示します。

NAME      URL                                                            READY
greeter   http://greeter-demoserverless.apps.wzy5hg7x.eastus.aroapp.io   True

サービスの新しいバージョンをデプロイする

次のコマンドを実行し、:latest イメージ タグと環境変数 MESSAGE_PREFIX を渡して、アプリケーションの新しいバージョンをデプロイします。

kn service update greeter \
 --image quay.io/rhdevelopers/knative-tutorial-greeter:latest \
 --namespace demoserverless \
 --env MESSAGE_PREFIX=GreeterV2 \
 --revision-name greeter-v2

新しいリビジョン greeter-v2 がデプロイされたことを示す確認メッセージが表示されます。

Updating Service 'greeter' in namespace 'demoserverless':

  5.029s Traffic is not yet migrated to the latest revision.
  5.086s Ingress has not yet been reconciled.
  5.190s Waiting for load balancer to be ready
  5.332s Ready to serve.

Service 'greeter' updated to latest revision 'greeter-v2' is available at URL:
http://greeter-demoserverless.apps.wzy5hg7x.eastus.aroapp.io

すべてのリビジョンとそのトラフィック分散の一覧を表示するには、次のコマンドを実行します。

kn revision list

次の出力のような一覧が表示されます。 この例では、新しいリビジョンはトラフィックの 100% を受け取っています。

NAME            SERVICE   TRAFFIC   TAGS   GENERATION   AGE     CONDITIONS   READY   REASON
greeter-v2      greeter   100%             2            90s     3 OK / 4     True
greeter-v1      greeter                    1            5m32s   3 OK / 4     True

ブルー/グリーン デプロイとカナリア デプロイ

新しいリビジョンがデプロイされると、既定ではトラフィックの 100% が割り当てられます。 アプリケーションの以前のバージョンにすばやくロールバックできるブルー/グリーン デプロイ戦略を実装するとします。 Knative を使用すると、これを簡単に実現できます。

サービスを更新して 3 つのトラフィック タグを作成し、トラフィックの 100% をそれらに割り当てます。

  • current: 現在デプロイされているバージョンを指します
  • prev: 以前のバージョンを指します
  • latest: 常に最新バージョンを指します
kn service update greeter \
   --tag greeter-v2=current \
   --tag greeter-v1=prev \
   --tag @latest=latest

次のような確認メッセージが表示されます。

Updating Service 'greeter' in namespace 'demoserverless':

  0.037s Ingress has not yet been reconciled.
  0.121s Waiting for load balancer to be ready
  0.287s Ready to serve.

Service 'greeter' with latest revision 'greeter-v2' (unchanged) is available at URL:
http://greeter-demoserverless.apps.wzy5hg7x.eastus.aroapp.io

次のコマンドを使用して、ルートの一覧を表示します。

kn route describe greeter

各タグの URL とそのトラフィック分散を示す出力が表示されます。

Name:       greeter
Namespace:  demoserverless
Age:        10m
URL:        http://greeter-demoserverless.apps.wzy5hg7x.eastus.aroapp.io
Service:    greeter

Traffic Targets:
  100%  @latest (greeter-v2) #latest
        URL:  http://latest-greeter-demoserverless.apps.wzy5hg7x.eastus.aroapp.io
    0%  greeter-v1 #prev
        URL:  http://prev-greeter-demoserverless.apps.wzy5hg7x.eastus.aroapp.io
    0%  greeter-v2 #current
        URL:  http://current-greeter-demoserverless.apps.wzy5hg7x.eastus.aroapp.io

[..]

以前のバージョンにすばやくロールバックしたい場合は、トラフィック分散を更新して、以前のタグにトラフィックの 100% を送信します。

kn service update greeter --traffic current=0 --traffic prev=100

次のコマンドを使用して、ルートを一覧表示し、もう一度確認します。

kn route describe greeter

トラフィック分散の 100% が以前のバージョンに送られていることを示す出力が表示されます。

Name:       greeter
Namespace:  demoserverless
Age:        19m
URL:        http://greeter-demoserverless.apps.wzy5hg7x.eastus.aroapp.io
Service:    greeter

Traffic Targets:
    0%  @latest (greeter-v2) #latest
        URL:  http://latest-greeter-demoserverless.apps.wzy5hg7x.eastus.aroapp.io
  100%  greeter-v1 #prev
        URL:  http://prev-greeter-demoserverless.apps.wzy5hg7x.eastus.aroapp.io
    0%  greeter-v2 #current
        URL:  http://current-greeter-demoserverless.apps.wzy5hg7x.eastus.aroapp.io

[..]

ブラウザーでメイン ルート (この例では http://greeter-demoserverless.apps.wzy5hg7x.eastus.aroapp.io) を更新し、トラフィック分散を試します。

リソースをクリーンアップする

アプリケーションの操作が完了したら、次のコマンドを実行してプロジェクトを削除できます。

oc delete project demoserverless

チュートリアル: Azure Red Hat OpenShift 4 クラスターを削除する」の手順に従って、クラスターを削除することもできます。

次のステップ

このガイドでは、以下の方法について学習しました。

  • OpenShift サーバーレス オペレーターと Knative サービスをインストールする
  • Web コンソールを使用してサーバーレス プロジェクトをデプロイする
  • Knative CLI (kn) を使用してサーバーレス プロジェクトをデプロイする
  • Knative CLI (kn) を使用してブルー/グリーン デプロイとカナリア デプロイを構成する

OpenShift サーバーレスを使用して、サーバーレスのイベント ドリブン アプリケーションを作成し、Azure Red Hat OpenShift にデプロイする方法の詳細については、OpenShift サーバーレスの概要に関するドキュメント、およびサーバーレス アプリケーションの作成と管理に関するドキュメントに従ってください。