[Code Pattern] Red Hat Universal Base Image(UBI)を使用して、サンプル為替アプリをOpenShift on IBM Cloudにデプロイする方法

皆さん、こんにちは。戸倉彩です。

今回は、 **IBM Developer** サイトに、**コード・パターン** (Code Pattern) として公開されている **[「Red Hat Universal Base Image を使用して、サンプル為替アプリを OpenShift にデプロイする」](https://developer.ibm.com/jp/patterns/deploy-to-openshift-4-redhat-universal-base-image/)** について、日本語の参考訳として操作手順と追加コメントと合わせてご紹介していきます。
※本内容は2020年10月7日現在のものとなります。

# 概要
本記事では、Red Hat Universal Base Image (UBI) を使用して、Pythonで作成されたサンプルの為替アプリケーションを、Red Hat OpenShift on IBM Cloud上にデプロイする手順をカバーしていきます。この操作を終えると、下記のスキルを身に着けることができます。  

* RESTインターフェースと Swaggerテスト・ハーネスを備えた、各種のAPIポイントを手動で検査、発見、実行できる Pythonマイクロサービスを設計して作成する
* Red Hat Universal Base Imageを使用して、マイクロサービスのDockerイメージをビルドする
* OpenShift 4.3との互換性があるRed Hat OpenShift on IBM Cloud上にマイクロサービスをデプロイして実行する

### Red Hat Universal Base Image (UBI) とは
Red Hat Enterprise Linux (RHEL) をコアとするコンテナ用オペレーティング・システムのイメージです。すなわち、RHELをすでに活用しているユーザーにとっては、品質を兼ね備えたイメージを構築できます。任意のプラットフォームでイメージを作成し、それを自由に再配布して、好きな場所で実行できます。詳細については、Red Hat公式サイトをご覧ください。

# 注意点
クラウド環境として、IBM Cloud上のRed Hat OpenShiftクラスタを利用します。IBM Developer DojoのOpenShiftセミナーなどで、ワークショップ用のOpen Shift on IBM Cloud環境を入手された場合には、そちらをご利用いただくことも可能です。
※IBM Cloudの有料サービスとなりますので、ご利用の際には十分に気をつけて操作を行ってください。

# 事前準備
下記のツールと環境を用意しておく必要があります。
- [Docker](https://www.docker.com/products/docker-desktop): ローカルでDockerが実行できる環境
- [Docker Hubのアカウント](https://hub.docker.com/)
- [IBM Cloud アカウント - 従量課金(PayG)](https://cloud.ibm.com/registration)
- [Red Hat OpenShift on IBM Cloud](https://cloud.ibm.com/kubernetes/catalog/about?platformType=openshift) 上のRedHat OpenShift 4クラスタ
- [OpenShift Origin CLI (oc)](https://cloud.ibm.com/docs/openshift?topic=openshift-openshift-cli#cli_oc)

# 全体フローイメージ
<img src="https://raw.githubusercontent.com/IBM/python-ubi-openshift/master/doc/images/architecture.png" width="600">
1. サンプルの為替マイクロサービス内で、クライアントAPIのコンシューマーがインターネットを介してマイクロサービスを呼び出します。 (http(s)リクエスト)
2. Python Flaskプロセスが`Web サーバー`として機能し、REST リクエスト (例えば、GET /convertCurrency/ZAR/USD/600.66) を受け入れます。
3. Flask内のリクエストをルーティングするコードによってリクエストがサービス・モジュールに渡され、このモジュールによってExternal European Currency Exchange API (https://api.exchangeratesapi.io/) が呼び出されます。
4. 例えば、南アフリカ・ランド (ZAR) の為替レートが取得されて保管されます。ZARの値 600.66 が米国ドル(USD)に換算されます。
5. Flaskが応答として、ドルの金額 (この例の場合、$40.59) を呼び出し側コンシューマーに送信します。

# 操作手順
## 1. ローカルにGitHubリポジトリをクローンする
1.ターミナルから下記のコマンドを実行して、GitHubに公開されているサンプルアプリケーションをクローンする。

```
git clone https://github.com/IBM/python-ubi-openshift.git
```
2.クローンが完了したら作業場所を下記のコマンドで移動する。

```
cd python-ubi-openshift
```

## 2. Dockerイメージをローカルでビルドして実行する


1.`<your-dockerhub-username>` の部分はそれぞれご自身のDockerHubのユーザー名を指定して、Dockerイメージをローカルでビルド実行する。

### **MacOSの場合**

```bash

export DOCKERHUB_USERNAME=<your-dockerhub-username>
```

```bash

docker build -t $DOCKERHUB_USERNAME/currencyexchange-py:v0.0.1 .
```

### **Windowsの場合**

```bash

SETX DOCKERHUB_USERNAME "your-dockerhub-username"
```

```bash

docker build -t $DOCKERHUB_USERNAME/currencyexchange-py:v0.0.1 .
```

<details><summary>**コマンド実行後の出力内容の例**</summary><div>

```
Sending build context to Docker daemon  69.63MB
Step 1/10 : FROM registry.access.redhat.com/ubi8/ubi
 ---> fd73e6738a95

 ...

Collecting flask (from -r requirements.txt (line 13))
  Downloading https://files.pythonhosted.org/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl (94kB)

 ...

Successfully built 3b5631170697
Successfully tagged <DOCKERHUB_USERNAME>/currencyexchange-py:v0.0.1

```

</div></details>



2.実際に、ビルドしたイメージをローカル実行してみる。

```bash

docker run -p 7878:7878 $DOCKERHUB_USERNAME/currencyexchange-py:v0.0.1
```

別のターミナルを開いて、`docker ps` コマンドを実行すると、為替マイクロサービスのdockerコンテナが稼働していることを確認できます。
<img src="https://raw.githubusercontent.com/IBM/python-ubi-openshift/master/doc/images/UBI-docker-ps.jpeg" width="900">
3.ブラウザから [http://127.0.0.1:7878/](http://127.0.0.1:7878/)にアクセスし、API呼び出しを `try-it-out` から試してみる。
<img src="https://raw.githubusercontent.com/IBM/python-ubi-openshift/master/doc/images/expected-browser-swagger.png" width="600">
4. 操作の確認を終えたら、ターミナルで[Control]+[C]を同時に押し、終了する。

## 3. OpenShift 4クラスタにデプロイする

このマイクロサービスへ変更を許可するためには、[Docker Cloud](https://hub.docker.com/) にリポジトリを作成し、新しく変更されたコンテナをプッシュできるようにする必要があります。

1.下記のコマンドを順番に実行し、dockerイメージのビルドを行う。 `<your-dockerhub-username>` の部分には、ご自身のDocker Hubのユーザー名を指定してください。

```bash

export DOCKERHUB_USERNAME=<your-dockerhub-username>

docker build -t $DOCKERHUB_USERNAME/currencyexchange-py:v0.0.1 .

docker login
```

2.続いて、docker hubにイメージをプッシュする。

```
docker push $DOCKERHUB_USERNAME/currencyexchange-py:v0.0.1
```

ここからは、ocコマンドを利用してOpenShiftにデプロイします。※v4.1.0以降推奨

<details><summary>**インストールされているoc cliのバージョン確認方法**</summary><div>

```bash

oc version
```

</div></details>

3.ブラウザから [**IBM Cloudダッシュボード**](https://cloud.ibm.com/login) にログインを行う。
4.ご自身のOpenShiftのクラスタページを表示し、**[OpenShift webコンソール]** ボタンをクリックする。
<img src="https://tvxtdq.by.files.1drv.com/y4mZUWpcZe0tazMjJfMOj9X0pg_89K7-DxS3_VUROfvgX4bC9f7RTJVeOOe_o6lR9yLZbKwu2TrlAeypM7M6E376JMszoLFM3ridlX2k7ZffG2lOTCTj7d4pa1TMYwmfMEkbln1ncwNQDb_rstHNthInFOtjck1EEBOJlvg6r7vZcTWNHhF_Bxw9nORULijJYTaZWB9-KznrZnaDkIAj3g6qw?width=1804&height=881&cropmode=none" width="600">

5.OpenShiftコンソールの右上に表示されているユーザー名の横のドロップダウンメニューより **[Copy Login Command]** をクリックして、コマンドからOpenShfitにログインするための情報を取得する。

<img src="https://tvxsdq.by.files.1drv.com/y4mwRrhSdPrqvlf1kthTSJyDlIM0dqxy8CJwF61EKiJyzIv_f7yjNQNpSDFsAmLsYaG3Ourz5lfI69f1fCzS-CxJRkbAly9LUDB7qKNXuGHrDIOSoBt4PdLazjM_Tqtg_KhCjFTmVVVamdjvoykuKtrIatK8CUi-DnM9evaEAFexxGrOUqURaHFAPHwU4PuqgKn9dEp89yQTan7JkN23J7TyQ?width=1827&height=766&cropmode=none" width="600">
表示された情報は大切に取り扱ってください。今回は **[Log in with this token]** の下に記載されているコマンドをコピーして、ターミナルから実行します。
▼表示される資格情報ページの例
<img src="https://raw.githubusercontent.com/IBM/python-ubi-openshift/master/doc/images/OpenShift-DisplayedToken-cli-login.png" width="600">
6.ocコマンドで新しいプロジェクトを作成する。

```bash

oc new-project currencyexchange-py
```
7.下記のコマンドを実行してプロジェクトが作成されているか確認を行う。

```bash

oc project
```

8.次にアプリケーションを追加する。

```bash

oc new-app $DOCKERHUB_USERNAME/currencyexchange-py:v0.0.1
```

▼表示される出力内容の例
黄色のハイライトセクションで、**Red Hat Universal Base Image** がDockerデプロイメントのベースイメージになっていることが確認できます。
<img src="https://raw.githubusercontent.com/IBM/python-ubi-openshift/master/doc/images/OpenShift-oc-new-application-created.png" width="800">

9.下記のコマンドを実行して、マイクロサービスを外部に公開する。

```bash

oc expose svc/currencyexchange-py
```

10. oc statusコマンドで公開URLを確認する。これで、ルートは外部に公開され、パブリックインターネットを介してURLにアクセスすると表示される状態になる。

```bash

oc status
```

▼表示される出力内容の例
ハイライトされた部分がパブリックに公開されたURLの情報です。
<img src="https://raw.githubusercontent.com/IBM/python-ubi-openshift/master/doc/images/OpenShift-oc-status-url-of-svc.png" width="600">

▼URLにアクセスして表示されるサイトの例
<img src="https://raw.githubusercontent.com/IBM/python-ubi-openshift/master/doc/images/OpenShift-url-navigate-to-shows-swagger-success.png" width="600">

## 4. マイクロサービスのパフォーマンスとヘルスモニタリング
**OpenShiftWebコンソールダッシュボード** を使用して、マイクロサービスの状態をいつでも確認することができます。
<img src="https://raw.githubusercontent.com/IBM/python-ubi-openshift/master/doc/images/OpenShift-webconsole-after-CLI-image-deploy.png" width="600">

これで、UBIを使用してPython Flaskマイクロサービスコンテナーイメージが正常に作成され、オプションでIBMCloud上のRedHat OpenShift4クラスターにデプロイされました。
今回は以上です。お疲れ様でした。

# 参考情報
* [IBM Cloud 資料 - アカウント・タイプ](https://cloud.ibm.com/docs/account?topic=account-accounts&locale=ja)
* [Red Hat OpenShift on IBM Cloud](https://www.ibm.com/jp-ja/cloud/openshift)
* [GitHub - Deploy an application to OpenShift 4 using Red Hat Universal Base Image (UBI) 英語](https://github.com/IBM/python-ubi-openshift)
* [Red Hat Blog - Introducing the Red Hat Universal Base Image 英語](https://www.redhat.com/en/blog/introducing-red-hat-universal-base-image)
* [Python RESTful APIs using flask-restplus](https://pypi.org/project/flask-restplus/)

★Twitterで最新情報配信中 [@ayatokura](https://twitter.com/ayatokura)