Red Hat OpenShift on IBM CloudでWebSphere Libertyイメージを使用する（初級編 Dockerイメージの利用）

# 目的

Red Hat OpenShiftは生のKubernetesに比べてアプリケーションデプロイのための豊富なオプションが用意されています。私自身の学習と備忘を兼ねてさまざまなデプロイを試してみます。IBMによる買収を記念して？アプリケーションはWebSphere Libertyをランタイムとして使用します。

アプリケーションは何でもいいので下記サイトのSampleWebAppを使わせて頂きました。

> https://www.middlewareinventory.com/blog/sample-web-application-war-file-download/

# 初級編 Dockerイメージを利用する

生Kubernetesから入った人なら一番わかりやすいやり方でしょう。コンテナレジストリにあるあらかじめビルドされたイメージを使ってデプロイします。

## 環境

OpenShiftクラスター|イメージレジストリ
---|---
IBM Cloud Red Hat OpenShift Cluster|IBM Cloud Container Registry

## イメージのビルドと登録

Dockerfileを準備します。

```dockerfile

FROM icr.io/ibm/liberty:microProfile3

RUN wget --directory-prefix=/config/dropins https://github.com/AKSarav/SampleWebApp/raw/master/dist/SampleWebApp.war
```

イメージをビルドしてレジストリに登録します。

```bash
$ ns=${名前空間}

$ ibmcloud login
$ ibmcloud cr region-set ap-north
$ ibmcloud cr namespace-add ${ns}

$ ibmcloud cr build --tag jp.icr.io/${ns}/openshift-liberty .
```

無事登録されたことを確認します。

```bash
$ ibmcloud cr images | grep openshift-liberty
jp.icr.io/${ns}/openshift-liberty   latest   31507da4964d   ${ns}   1 minute ago   206 MB   No Issues
```

## OpenShiftプロジェクトの作成

OpenShiftのプロジェクトを作成します。合わせてContainer Registryからイメージをプルするための設定も行います。

```bash
$ project=${プロジェクト}

# プロジェクト作成
$ oc new-project ${project}

# Container RegistryのPullシークレットをプロジェクトにコピー
$ oc get secret default-jp-icr-io -n default -o yaml | sed "s/default/${project}/g" | oc create -n ${project} -f -

# Pullシークレットをdefaultサービスアカウントに設定
$ oc secrets add serviceaccount/default secrets/${project}-jp-icr-io --for=pull

# LibertyイメージのUSER 1001で実行を許可（注1）
$ oc patch scc nonroot -p 'priority: 5'
$ oc adm policy add-scc-to-user nonroot -z default
```

> （注1）OpenShiftはデフォルトではイメージのUSER指定を使わないという特性があります。一方LibertyのイメージはUSER 1001で動作することを前提としているため、OpenShift上では正しく動作しないところがあります。回避する方法もあるのですが、今回はイメージのUSER指定を使うように設定を変更しています。このあたり、どうするのがベストなのか、IBMさん教えて欲しいところです。

## イメージのインポート

コンテナレジストリのイメージをそのまま使ってデプロイもできますが、OpenShiftらしさを考えて、今回はイメージストリームを使います。

```
$ oc import-image openshift-liberty-docker --from jp.icr.io/${ns}/openshift-liberty --confirm
```

## アプリケーションのデプロイ

それではアプリケーションをデプロイします。

```bash
$ oc new-app --name openshift-liberty-docker -i openshift-liberty-docker
```

そして公開します。

```bash
$ oc expose svc/openshift-liberty-docker
```

## 動作確認

```
# URLを確認
$ oc get route
NAME                       HOST/PORT                                                                                                        PATH      SERVICES                   PORT       TERMINATION   WILDCARD
openshift-liberty-docker   openshift-liberty-docker-#####.#######-################################-####.jp-tok.containers.appdomain.cloud             openshift-liberty-docker   9080-tcp                 None

# インターネット側からアクセスできることを確認
$ curl -s openshift-liberty-docker-#####.#######-################################-####.jp-tok.containers.appdomain.cloud/SampleWebApp/
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
    <head>
        <title>SampleWebApp</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <h2>Sample Web Application To Deploy and Test</h2>
        <br>
    <div> click <a href="SnoopServlet">Click to Invoke a SnoopServlet</a></div>
    <br>
    <br>


    </body>
</html>
```

とりあえず動きましたね。次回以降もさまざまな方法を試してみたいと思います。