Azure Red Hat OpenShiftクラスターを作成してWebコンソールからアプリをデプロイ

##はじめに
本記事では、AzureでフルマネージドなRed Hat OpenShiftのKubernetesクラスターを利用できるサービスである[**Azure Red Hat OpenShift(ARO)**](https://azure.microsoft.com/ja-jp/services/openshift/)のクラスター作成と、アプリのデプロイ方法についてご紹介したいと思います。

現在、AROではOpenShiftのバージョン４を利用できます。もちろんOpenShiftが提供している様々な機能もそもまま活用できます。特にWebコンソールでクラスター上の様々なリソースやオブジェクトの管理・運用がGUIベースで操作できるので、一度利用するとその便利さを実感できるのではと思います。OpenShiftを利用したことがある方にも、AROではクラウド上にすぐにOpenShiftのクラスターを作成でき、必要な時にすぐにリソースの拡張ができる点、さらにもしもの時にもAzureで一元的なサポートを受けられるなど、Azureと統合されたOpenShiftの利点を感じる方も多いのではと思います。

AROは日本では東日本と西日本の両方のリージョンで利用可能となっており、マルチAZにも対応しています。
この記事を読んでいただき、ぜひ実際にAROに触れてみてください！

##AROクラスターの作成
###前提条件
AROクラスターを作成するための前提条件は下記になります。

**(1)Azureのアカウントを保有している**
**(2)Azure CLIバージョン2.6.0 以降を利用できる**
　[ここ](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli?view=azure-cli-latest)から入手できます。AzureのCloud Shellを利用する場合はすぐに使えます。
**(3)Azureリソースクォータの制限を引き上げる**
　AROクラスターの作成には最低でも合計36のVMコア数が必要ですが、個人アカウントの場合は既定のリソースクォータに引っかかってしまいます。VMのリソースクォータの引き上げを、[こちら](https://docs.microsoft.com/ja-jp/azure/azure-portal/supportability/per-vm-quota-requests)に記載の手順で実施してください。途中でVMシリーズを選択する必要があります。少なくともDSv3シリーズ（マスターノードで利用）のクォータ変更が必要です。（少しハードルが高そうに感じるかもしれませんが、申請をポータルから入力するだけです。私の場合はDSv3とワーカーノード用にDasv4シリーズのvCPU数を40に設定して申請し、約２分後にApproveの連絡が届きました。時間がかかる場合もありますのでご注意ください）

###Azure CLIでAROクラスターを作成するための準備
ここからはAzure CLIでの操作となります。まず、Azure CLIでリソースを操作する場合、操作対象のリソースによっては、[リソースプロバイダー](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/management/resource-providers-and-types)の登録が必要となるものがあります。一度登録すればそれ以降は不要です。AROではRedHatOpenShift, Compute, Storageの３つのリソースプロバイダーを登録する必要があります。Azure CLIで、下記の３つのコマンドを実行することで登録できます。

```
az provider register -n Microsoft.RedHatOpenShift --wait
az provider register -n Microsoft.Compute --wait
az provider register -n Microsoft.Storage --wait
```

###ARO用のリソースグループの作成
次に、AROの所属先となるリソースグループを作成します。まず、何度も利用するパラメータを次のようにシェルの変数に設定します。ARO用に仮想ネットワークも作成するので、そのための値も設定しておきます。下記の値の内容は適宜変更しても問題ありません。

```
LOCATION=japaneast              #リソースを配置するリージョン
RESOURCEGROUP=aro-rg            #AROクラスターを配置するリソースグループ名
CLUSTER=cluster                 #AROクラスター名
VNET=aro-vnet                   #AROクラスターを接続する仮想ネットワーク名
```

次に、リソースグループを作成します。このリソースグループにAROと仮想ネットワークを作成していきます。

```
az group create \
  --name $RESOURCEGROUP \
  --location $LOCATION
```

###ARO用の仮想ネットワークの作成
AROクラスターを接続する仮想ネットワークを作成します。AROクラスターでは、マスターノード用とワーカーノード用の２つのサブネットを持つ仮想ネットワークが必要です。
まず、仮想ネットワークを作成します。

```
az network vnet create \
   --resource-group $RESOURCEGROUP \
   --name $VNET \
   --address-prefixes 10.0.0.0/22
```
次にマスターノード用、ワーカーノード用のサブネットをそれぞれ作成します。

```:マスターノード用
az network vnet subnet create \
  --resource-group $RESOURCEGROUP \
  --vnet-name $VNET \
  --name master-subnet \
  --address-prefixes 10.0.0.0/23 \
  --service-endpoints Microsoft.ContainerRegistry
```

```:ワーカーノード用
az network vnet subnet create \
  --resource-group $RESOURCEGROUP \
  --vnet-name $VNET \
  --name worker-subnet \
  --address-prefixes 10.0.2.0/23 \
  --service-endpoints Microsoft.ContainerRegistry
```

マスターノードのサブネットにはサービス用のプライベートリンクサービスが接続されるので、下記のコマンドでそのためのポリシー設定変更が必要となります。

```
az network vnet subnet update \
  --name master-subnet \
  --resource-group $RESOURCEGROUP \
  --vnet-name $VNET \
  --disable-private-link-service-network-policies true
```

*アドレス空間は変更しても問題ありませんが、ワーカーノードとマスターノード用には最小```/27```の空間が必要ですのでご注意ください*

###Red Hatプルシークレットを取得する

Red Hatコンテナーレジストリにアクセスするためのプルシークレット設定用のファイルを取得します。後ほどAROクラスターの作成時にコマンドの引数として受け渡します。[作成後に更新](https://docs.microsoft.com/ja-jp/azure/openshift/howto-add-update-pull-secret)することもできます。

[こちらのRed Hat社のポータル](https://cloud.redhat.com/openshift/install/azure/aro-provisioned)にログインします。ログインにはRed Hatアカウントが必要となりますので、アカウントが無い場合は新規登録が必要です。ログイン後に画面中央に表示される[Download pull secret]をクリックして、プルシークレット用ファイル`pull-secret.txt`をダウンロードします。

>2020/2/8追記
>Red HatプルシークレットはAROクラスター作成には必須ではありませんが、S2Iを用いたアプリのデプロイで利用します

###AROクラスターを作成する
　いよいよAROクラスターを作成します。といっても、次のコマンドを実行するだけです。前の手順でダウンロードしたプルシークレット用ファイル`pull-secret.txt`を格納したディレクトリで下記コマンドを実行してください。

```
az aro create \
  --resource-group $RESOURCEGROUP \
  --name $CLUSTER \
  --vnet $VNET \
  --master-subnet master-subnet \
  --worker-subnet worker-subnet \
  --pull-secret @pull-secret.txt
```
他の引数を指定して、ワーカーノードのVM数やサイズ変更、クラスターのプライベート化など様々なカスタマイズできるのですが、今回は必要最低限のものだけを指定しています。他の引数については[こちら](https://docs.microsoft.com/en-us/cli/azure/aro?view=azure-cli-latest#az_aro_create)を参照ください。

##AROクラスターへの接続
###Webコンソールへの接続
AROクラスターが作成できたら、早速作成したAROクラスターのWebコンソールに接続してみましょう。まずは、Webコンソールにログインに必要なユーザ名とパスワードを下記のコマンドで出力します。

```
az aro list-credentials \
  --name $CLUSTER \
  --resource-group $RESOURCEGROUP
```

上記の結果、出力されたユーザ名とパスワードを安全な場所にメモしておいてください。

次に、WebコンソールのURLを下記のコマンドで確認します。

```
az aro show \
    --name $CLUSTER \
    --resource-group $RESOURCEGROUP \
    --query "consoleProfile.url" -o tsv
```

上記のコマンドの結果、```https://console-openshift-console.apps.<random>.<region>.aroapp.io/```のような形式で出力されます。（AROクラスター作成時にカスタムドメインを指定した場合は指定したドメインに対応するURLになります）

ブラウザーで上記URLに接続し、メモしておいたユーザ名とパスワードでログインしてください。
![ARO login console](https://docs.microsoft.com/ja-jp/azure/openshift/media/aro4-login.png)

###OpenShift CLIを利用して接続[オプション]
OpenShiftではkubectlでの操作ももちろん可能ですが、OpenShift用に様々な拡張が実施された[OpenShift CLI](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.6/html/cli_tools/openshift-cli-oc)が利用できます。Webコンソールにログイン後、右上あたりの[?]をクリックすると表示される[Command Line Tools]をクリックし、表示される画面からダウンロードできます。
![OC CLI download](https://docs.microsoft.com/ja-jp/azure/openshift/media/aro4-download-cli.png)

OpenShift CLIをインストールできたら、クラスターに接続してみましょう。Webコンソールの右上のユーザ名(既定ではkube:admin)をクリックすると表示される[Copy Login Command]をクリックし、その後画面に表示される[Display Token]をクリックすると表示されるLog in with this tokenの下に表示されるOpenShift CLIのログインコマンドをコピーして、コンソールで実行してください。
![occlitoken.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255074/0e60a510-6b03-838c-f9c2-3a5aa83e3ec5.png)
ログインに成功すると、AROクラスターをOpenShift CLIで操作可能です。

##AROクラスターへのアプリのデプロイ
###GitHub上のソースコードからアプリを直接デプロイできるS2I(Source to Image)機能

AROクラスターに接続できたところで、AROクラスターにアプリをデプロイしてみましょう。OpenShiftではS2I(Source to Image)という機能で、GitHubなどのリポジトリのソースコードから直接コンテナイメージをビルドして、クラスターにデプロイできます。ソースコードから自動的に言語を検出して、適切なビルド処理を自動的に実行してくれます。開発者はコードを書くだけで、すぐにコンテナイメージを作成してデプロイできます。今回はこの機能を利用してアプリをデプロイしてみます。

[参考]
[S2I(Source to Image)](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.6/html/builds/builds-strategy-s2i-build_build-strategies)

###Webコンソールからのアプリのデプロイ
では、先ほど接続したWebコンソールからアプリをデプロイしていきます。Webコンソールの左上の[Administrator]と書かれている部分をクリックし、メニューに表示されたDeveloperをクリックして、Webコンソールを開発者モードに切り替えましょう。すると次のような画面が表示されます。
![スクリーンショット 2020-12-08 16.44.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255074/67390f69-1831-b8fc-fe4a-e3e35772e93d.png)

中央のメニューに様々なアプリのデプロイ方法が並んでいますが、今回はFrom Git(Gitリポジトリからのアプリデプロイ）をクリックします。すると画面に切り替わりますので、[Git Repo URL]の下のボックスにGitリポジトリのURLを入力します。
今回は下記のGitHubにあるサンプルコード（Djangoフレームワークでテストページを表示するWebアプリ）を用いてデプロイしてみます。
https://github.com/sclorg/django-ex.git

入力すると、画面が次のように更新され、自動的にソースコードの言語としてPythonが検出されているのが分かります。

![スクリーンショット 2020-12-08 16.58.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255074/1f53df83-cf1c-bcbe-6c42-e6541625075f.png)

他の入力項目は自動的に既定値が入力されるので、そのままスクロールダウンして[Create]ボタンをクリックして、アプリをデプロイしてみましょう。すると次の図ようなPythonアプリのアイコンが画面中央に現れます。クリックすると、右側に詳細が表示され、自動的にアプリに対してpod（Deployment)、Serviceやイングレス(Route)などのオブジェクトが作成されているのが分かります。ここで真ん中あたりに[Builds]と書かれた部分に注目してください。自動的にBuild Configというオブジェクトが作成され、"Build #1 Running"と記載されているように、先ほど指定したGitHubのソースコードからコンテナイメージを自動的にビルドしています。

![スクリーンショット 2020-12-08 17.01.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255074/022c991c-28cd-5b45-6dc3-fe286b114756.png)

このBuild Configオブジェクトをクリックして詳細を表示すると、次の画面のようにコンテナをビルドしている様子が確認できます。
![スクリーンショット 2020-12-08 17.01.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255074/c16cd849-bff6-bf6a-d45d-4042116940c6.png)

ビルドが完了すると、自動的にpodが立ち上がります。では、実際に接続してみましょう。先ほど表示したアプリの詳細画面で表示されていた[Routes]の下に記載されているURLからアプリに接続できます。ブラウザで接続すると、次の画面が表示され、無事にアプリがデプロイできていることが確認できました！

![appimage](https://docs.microsoft.com/en-us/azure/openshift/media/s2i/demo-app-browse-updated.png)

なお、今回はアプリのデプロイをWebコンソールから実施しましたが、OpenShift CLIからもoc new-appコマンドの引数にGitHubのURLを指定することで、同じようにアプリをソースコードからデプロイすることが可能です。

##終わりに
今回の記事では、Azure Red Hat OpenShift(ARO)のクラスター作成から、GitHubソースコードをからアプリをデプロイする流れをご紹介しました。すぐにOpenShiftをAzure上で使い始めることができ、簡単にアプリを動かすことができるのを感じていただけたかと思います。他にもAzureのサービスとの連携による便利な機能もまだまだありますので、また記事にできればと思います。

[ご参考]
[AROの概要説明ドキュメント](https://docs.microsoft.com/ja-jp/azure/openshift/intro-openshift)