Open Liberty Operatorを試してみる

OpenShift初学者です。まだ画面をポチポチし始めたところで全く理解できていないのですが、とりあえず、慣れ親しんだJava EEアプリケーション・サーバーであるOpen Liberty用のOperatorを見つけたので、試してみることにしました。

https://github.com/OpenLiberty/open-liberty-operator

Open Liberty Operatorでできることは以下の３つです。

1. [Configuration](https://github.com/OpenLiberty/open-liberty-operator/blob/master/doc/user-guide.adoc#configuration) - [Open Liberty Image](https://github.com/OpenLiberty/ci.docker#open-liberty-images)として作成されたアプリケーション・イメージを、Kubernetesクラスターにデプロイする
2. Day-2 Operations:[Request server dump](https://github.com/OpenLiberty/open-liberty-operator/blob/master/doc/user-guide.adoc#request-server-dump) - 1.でデプロイして稼働中のPodでダンプを収集する
3. Day-2 Operations:[Request server traces](https://github.com/OpenLiberty/open-liberty-operator/blob/master/doc/user-guide.adoc#request-server-traces) - 1.でデプロイして稼働中のPodでトレースを収集する

Red Hat OpenShift on IBM Cloud v4.3上で試しました。
[ユーザーガイド](https://github.com/OpenLiberty/open-liberty-operator/blob/master/doc/user-guide.adoc)通りに実施しただけですが、まずは、Web コンソール上の操作で全て行いました。

Operator installation
---------------------

まずは、Open Liberty OperatorをOpenShift Cluster上にインストールします。Red Hat OpenShift on IBM CloudのOperatorHubにはOpen Liberty Operator v0.6.1が登録されていたので、Web コンソールで選んでインストールするだけです。

1. OpenSift container Platform Web コンソールの「Administratorパースペクティブ」で、「OperatorHub」を開きます。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/ee503cfd-7989-ca84-7c3e-ccbe7f5413f5.png)

2. `Libery`で検索するとOpen Liberty Operatorが見つかります。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/a57ad8b5-1525-89b1-3918-9d98f7507499.png)

3. Open Liberty Operatorをインストールします。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/41b5f919-0d54-f737-7b50-14774d0950d0.png)

4. 「Installed Operators」をみると、Open Liberty Operatorがインストールされたのがわかります。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/f5bdbf64-3de3-f7a5-86be-706456dcb07a.png)
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/601aaa57-4e01-8eb9-b9e0-7955c5af39d8.png)

Configuration
-------------

Open Libertyのアプリケーション・イメージをデプロイします。今回は、インストールするイメージとしてRedHatのコンテナーレジストリーにあるサンプルを使用します。

1. 「Open Liberty Operator」の「Provided APIs」から、「Open Liberty Application」をクリックします。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/48a3cbcc-9bd2-d9a4-ed41-eedabf926fea.png)

2. 「Create OpenLibertyApplication」をクリックしてcustom resource (CR)を作成します。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/d5643107-406f-18df-1eaa-76069c137604.png)

3. Custom Resource Definition (CRD)のサンプルが入力済みのYAMLエディターが表示されます。このまま「Create」するとRedHatのサードパーティー製品コンテナーレジストリーにある[Open Liberty Samples](https://catalog.redhat.com/software/container-stacks/detail/5e9877ea6c5dcb34dfbb1aca)アプリケーション・イメージが`demo-app`という名前でデプロイされます。今回は、後ほどOperatorを使用してDay-2 Operationsを実施するつもりなので、そのために必要な設定を4.でCRDに追加します。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/198efe21-672c-6f2a-14ae-1df2be979753.png)

4. [Storage for serviceability](https://github.com/OpenLiberty/open-liberty-operator/blob/master/doc/user-guide.adoc#storage-for-serviceability)をCRDに追加します。OpenLibertyApplicationの全てのpodで共有する永続ストレージを用意して、そこにダンプやトレースを出力するためです。

     ここで、`serviceability.size`を指定するとPersistent Volume Claim(PVC)が自動で作成されるのですが、試したところ、`More that one accessmode is not supported.`というエラーとなりPersistent Volumeが作成されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/e70b0968-1d66-246f-ee6a-d851b6b465c2.png)
     Open Liberty Operatorの[ガイド](https://github.com/OpenLiberty/open-liberty-operator/blob/master/doc/user-guide.adoc#storage-for-serviceability)には`The operator will automatically create a PersistentVolumeClaim with the specified size and access modes ReadWriteMany and ReadWriteOnce.`のようにアクセス・モードを2つ設定すると記載されていますが、Red Hat OpenShift on IBM Cloudのクラシック IBM Cloud File Storageの[ガイド](https://cloud.ibm.com/docs/openshift?topic=openshift-file_storage)では`accessMode 次のオプションのいずれかを指定してください。`のようにいずれか1つしか設定できないように記載されているので、スペックに齟齬があるようです。
   とりあえずここではPVCを自分で用意することにします。先に[Persistent Volume Claimの作成](#persistent-volume-claim%E3%81%AE%E4%BD%9C%E6%88%90)を実施し、作成したPVC(ここでは`my-pvc`)をCRDに指定します。

    ```yaml:CRD
    apiVersion: openliberty.io/v1beta1
    kind: OpenLibertyApplication
    metadata:
      name: demo-app
      namespace: iue
    spec:
      replicas: 1
      applicationImage: 'registry.connect.redhat.com/ibm/open-liberty-samples:springPetClinic'
      expose: true
      serviceability:
        volumeClaimName: my-pvc
     ```

5. 「Create」をクリックすると、アプリケーションがデプロイされ、Podが開始しました。CRDで`expose: true`と指定したのでRouteも作成されてアプリケーションが公開されています。
   - Operators / Installed Operators / Open Liberty Operator / Open Liberty Application
     ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/c6139574-2fa5-1be6-4051-afffcee3dacd.png)
   - Workloads / Pods
     ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/97ac89ef-d0df-879a-e518-81db6165ca9d.png)
   - Workloads / Deployments
     ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/bde6f6a8-b957-f175-5778-d90401e5d60a.png)
   - Workloads / Replica Sets
     ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/8bb81df5-1242-942d-4d18-ac2e8b452cb4.png)
   - Networking / Services
     ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/930bc526-1355-bca6-1dc6-34ae11757e13.png)
   - Networking / Routes
     ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/d628ab7d-1d23-e12b-70ef-1f4b3058675c.png)

6. Routeの「Location」に記載のURIからアプリケーションにアクセス出来ました。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/cdd6f1e9-e2f5-2c93-75af-de3132e9e7ff.png)


Persistent Volume Claimの作成
---------------------------------

Storage for serviceabilityのためのPersistent Volume Claim(PVC)を作成します。

1. 「Administratorパースペクティブ」で、「Persistent Volume Claims」を開きます。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/b2af1960-88c8-4f20-99b3-df3c622a3b75.png)

2. 「Create Persistent Volume Claim」をクリックします。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/4866df5a-bf10-388a-d9fa-8dda3786e6cc.png)

3. 「Storage Class」には、ブロックストレージは複数のPodでシェアできないのでファイルストレージ、Open Liberty OperatorのPodは非rootユーザーで稼働するのでgid storage classを選択（ここでは`ibmc-file-bronze-gid`）します。「Access Mode」は`Shared Access(RWX)`を選択し、「Create」します。
    参考）gid storage classを選択する理由：[ファイル・ストレージ: 永続ストレージに対する非 root ユーザー・アクセスの追加が失敗する](https://cloud.ibm.com/docs/openshift?topic=openshift-cs_troubleshoot_storage#cs_storage_nonroot)
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/5f22c558-c341-fee1-2df1-9dab32014fd2.png)

4. Status=Boundになりました。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/54630f87-46f5-694c-862b-2c668bae1116.png)


Day-2 Operations
----------------

Open Liberty Operatorで提供される運用・保守機能を試してみます。

### Request server dump

1. 「Open Liberty Operator」の「Provided APIs」から、「Open Liberty Dump」をクリックします。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/98149b83-c601-768e-ca11-f5d2f04a7f64.png)

2. 「Create OpenLibertyDump」をクリックしてcustom resource (CR)を作成します。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/57fc9fd8-f996-b7fb-f359-be7f47ae0146.png)

3. Custom Resource Definition (CRD)のサンプルが入力済みのYAMLエディターが表示されます。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/b76728ba-bbf3-b81d-a723-91c7d15c8243.png)

4. `spec.podName`にダンプを取得したいPodの名前を入れます。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/eba20424-d957-4252-7ba5-e587d924c1c0.png)

5. 「Create」します。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/e99aa49c-763d-a6c6-31b9-dc06226b87cf.png)

6. 作成したCRを選択し、「Overviewタブ」をみると、「Conditions」で処理状況を確認できます。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/7d39eba9-3c4f-6cca-7aac-546cc1245665.png)

7. 「YAMLタブ」をみると、status.dumpFileで収集されたダンプファイル名を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/d4ca8e34-c430-5d10-cdd2-7418c71d1c98.png)

PodにマウントされたPersistent Volume上に、ダンプファイルが収集されました。

### Request server traces

1. 「Open Liberty Operator」の「Provided APIs」から、「Open Liberty Trace」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/16be5aae-d5fb-68ea-f41c-84a3168b200e.png)

2. 「Create OpenLibertyTrace」をクリックしてcustom resource (CR)を作成します。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/2fff4abc-1963-9847-532b-ada432c79fe4.png)

3. Custom Resource Definition (CRD)のサンプルが入力済みのYAMLエディターが表示されます。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/0ef9a07e-8d31-a9a1-6f5c-34e3397f31a5.png)

4. `spec.podName`にトレースを取得したいPodの名前を入れます。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/43654dae-a0e4-5fde-1d35-1ee36b0fe5ef.png)

5. 「Create」します。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/d5255af1-4796-e39c-0c0c-b043d7a35e92.png)

6. 作成したCRを選択し、「Overviewタブ」をみると、「Conditions」で状態を確認できます。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/bc3f5d2c-6afd-8a17-5da6-6f701463a9d9.png)

7. `/serviceability/NAMESPACE/POD_NAME/`にmessages.logとtrace.logが出力されています。
   （下図はPodのTerminalでマウントされたPersistent Volumeを確認しているところ）
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/0f3fc59e-c016-35d6-47de-fde49e2952e0.png)

8. CRの「YAMLタブ」で、`spec.disable=true`としてSaveすると、トレースが停止します。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/3f43fbe7-2891-4ec0-0fd7-b4155d699e83.png)
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681956/0b685de3-caa3-2af3-e9e1-95d133b0d0c9.png)
   もしくは、CRを削除することでもトレースが停止します。

まとめ
----

以上、Open Liberty Operatorの3つの機能を試して、動作することを確認しました。
今回はWeb コンソールからGUI操作で試しましたが、同じことが`oc`コマンドで実施できるはずですので、次回はそれを試してみたいと思います。