Verrazzanoを利用したサンプルアプリケーションデプロイ

# はじめに

この記事は、[Oracle Cloud Infrastructure Advent Calendar 2021](https://qiita.com/advent-calendar/2021/oci) その2 Day 8 の記事として書かれています。

[前回の記事](https://qiita.com/takuya_0301/items/5ec6e7c16e440b8ecf81)では、Oracle Container Engine for Kubernetes(OKE)上にマルチクラスタ環境を構築してみました。
この記事では、その環境に対してサンプルアプリケーションをデプロイしてみようと思います。

# Verrazzanoで利用できるサンプルアプリケーション

Verrazzanoでは、インストール後に利用可能な様々なアプリケーションをデプロイすることができます。

サンプルアプリケーションは複数あり、[こちら](https://github.com/verrazzano/verrazzano/tree/master/examples)からインストールすることができます。

今回はマルチクラスタ環境なので、[マルチクラスタ用のサンプルアプリケーション](https://github.com/verrazzano/verrazzano/tree/master/examples/multicluster)をデプロイしてみたいと思います。

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

インストールは[ToDo List](https://verrazzano.io/docs/samples/multicluster/todo-list/)を参考に実施します。

まずは、アプリケーションを管理するためのカスタムリソースであるVerrazzanoProjectリソースを作成します。
アプリケーションのデプロイについては、原則Adminクラスタが制御するので、Adminクラスタに対してデプロイを行います。

```sh
kubectl --context $KUBECONTEXT_ADMIN apply \
    -f https://raw.githubusercontent.com/verrazzano/verrazzano/v1.0.3/examples/multicluster/todo-list/verrazzano-project.yaml
```

次に、サンプルアプリケーションが格納されている[Oracle Container Registry](https://container-registry.oracle.com/) [^1] からコンテナイメージを取得してくるためのクレデンシャルを作成します。

[^1]: Oracle Container Registry：エンタープライズで使用することができるOracleソフトウェア製品のDockerイメージが含まれたコンテナレジストリです。利用するにはOracle Profileが必要になります。

```sh
wget https://raw.githubusercontent.com/verrazzano/verrazzano/v1.0.3/examples/multicluster/todo-list/mc-docker-registry-secret.yaml
```

ダウンロードしたファイルは以下のようになっています。
ここで、`placement`というフィールドに`managed1`というクラスタが定義されていることが分かります。
これが、このマルチクラスタ用Secretを利用するクラスタであるということを指しています。
今回は、それが管理対象クラスタということになります。

```sh
apiVersion: clusters.verrazzano.io/v1alpha1
kind: MultiClusterSecret
metadata:
  name: tododomain-repo-credentials
  namespace: mc-todo-list
spec:
  template:
    type: kubernetes.io/dockerconfigjson
    data:
      .dockerconfigjson: <BASE 64 ENCODED DOCKER CONFIG JSON>
  placement:
    clusters:
      - name: managed1
```

` .dockerconfigjson: <BASE 64 ENCODED DOCKER CONFIG JSON>`の部分を差し替えます。

```sh
kubectl --context $KUBECONTEXT_ADMIN create secret docker-registry temp \
    --dry-run=client \
    --docker-server=container-registry.oracle.com \
    --docker-username=takuya.niita@oracle.com \
    --docker-password=xxxxxxxxxx \
    --docker-email=xxx.xxxxx@oracle.com \
    -o jsonpath='{.data.\.dockerconfigjson}'; echo
```

以下のような結果が表示されます。(セキュリティのためマスクします)

```sh
eyJhdXRocyI6eyJjb250YWluZXI~~~~~~
```

出力された結果を`<BASE 64 ENCODED DOCKER CONFIG JSON>`に上書きします。

その後、Manifestを反映します。

```sh
kubectl --context $KUBECONTEXT_ADMIN apply -f mc-docker-registry-secret.yaml
```

次に、以下の2つのManifestをダウンロードします。


```sh
wget https://raw.githubusercontent.com/verrazzano/verrazzano/v1.0.3/examples/multicluster/todo-list/mc-weblogic-domain-secret.yaml
wget https://raw.githubusercontent.com/verrazzano/verrazzano/v1.0.3/examples/multicluster/todo-list/mc-tododb-secret.yaml
```

これら2つのManifestに定義されている以下の変数を好きな文字列に差し替えます。

-  username: THE_USERNAME
-  password: THE_PASSWORD

今回は以下のようにします。

-  username: admin
-  password: password1234[^2]

書き換えたのちに、Manifestを適用します。

[^2]: パスワードは8文字以上かつ少なくとも数字1つもしくは特殊文字を含める必要があります

```sh
kubectl --context $KUBECONTEXT_ADMIN apply -f mc-weblogic-domain-secret.yaml
kubectl --context $KUBECONTEXT_ADMIN apply -f mc-tododb-secret.yaml
```

次にComponentとApplication Configrationを適用します。
ComponentとApplication Configrationについては、Verrazzanoが利用している[OAM](https://oam.dev/)という考え方に基づいています。
OAMについては、[概要資料](https://www.slideshare.net/oracle4engineer/verrazzano)でも少し解説しています。

これらのファイルは、結構大きいので、ここで中身の解説はしませんが、中を見てくと先ほどの`MultiClusterSecret`リソースと同じように`placement`というフィールドに`managed1`というクラスタが定義されていることが分かります。

![how-it-works.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/55975653-489c-7ba4-f52b-9f2fac446ba9.png)

```sh
kubectl --context $KUBECONTEXT_ADMIN apply \
    -f https://raw.githubusercontent.com/verrazzano/verrazzano/v1.0.3/examples/multicluster/todo-list/todo-list-components.yaml

kubectl --context $KUBECONTEXT_ADMIN apply \
    -f https://raw.githubusercontent.com/verrazzano/verrazzano/v1.0.3/examples/multicluster/todo-list/todo-list-application.yaml
```

Manifestをapplyしたら、Podが起動するまで待機します。
ManifestのapplyはAdminクラスタに対して実施しますが、実際にアプリケーションがデプロイされるのは管理対象クラスタです。

```sh
kubectl --context $KUBECONTEXT_MANAGED get pods -n mc-todo-list -w
```

以下のようになれば起動完了です。(数分かかります)

```sh
NAME                     READY   STATUS        RESTARTS   AGE
mysql-5c848cf68d-lhgbc   2/2     Terminating   0          31s
mysql-7844bdc6d9-nhhh2   2/2     Running       0          30s
mysql-5c848cf68d-lhgbc   0/2     Terminating   0          38s
mysql-5c848cf68d-lhgbc   0/2     Terminating   0          47s
mysql-5c848cf68d-lhgbc   0/2     Terminating   0          47s
tododomain-introspector-nczbl   0/1     Pending       0          0s
tododomain-introspector-nczbl   0/1     Pending       0          0s
tododomain-introspector-nczbl   0/1     ContainerCreating   0          0s
tododomain-introspector-nczbl   1/1     Running             0          1s
tododomain-introspector-nczbl   0/1     Completed           0          58s
tododomain-adminserver          0/4     Pending             0          0s
tododomain-adminserver          0/4     Pending             0          0s
tododomain-adminserver          0/4     Init:0/1            0          1s
tododomain-introspector-nczbl   0/1     Terminating         0          60s
tododomain-introspector-nczbl   0/1     Terminating         0          60s
tododomain-adminserver          0/4     PodInitializing     0          2s
tododomain-adminserver          2/4     Running             0          12s
tododomain-adminserver          3/4     Running             0          15s
tododomain-adminserver          4/4     Running             0          43s
```

# アプリケーションの確認と各コンポーネントからの動作確認

ここでは、デプロイしたサンプルアプリケーションの動作確認をしてみます。

まずは、アプリケーションにアクセスします。

ホストを取得します。

```sh
HOST=$(kubectl --context $KUBECONTEXT_MANAGED get gateway -n mc-todo-list \
-o jsonpath={.items[0].spec.servers[0].hosts[0]})

echo $HOST
```

以下のように出力されます。

```sh
todo-appconf.mc-todo-list.xxx.xxx.xxx.xxx.nip.io
```

アプリケーションは以下のURLでアクセスできます。

```sh
https://todo-appconf.mc-todo-list.xxx.xxx.xxx.xxx.nip.io/todo
```

このような画面が表示されます。

![スクリーンショット 2021-12-06 18.25.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/6b8d9f51-d348-e139-594b-89c261fc0b60.png)

次に、Verrazzano Consoleから確認します。

[前回の記事](https://qiita.com/takuya_0301/items/5ec6e7c16e440b8ecf81#%E7%AE%A1%E7%90%86%E5%AF%BE%E8%B1%A1%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%81%AE%E7%99%BB%E9%8C%B2%E7%A2%BA%E8%AA%8D)と同じようにコンソールにアクセスします。

以下のように`OAM Application`に`todo-appconf`というApplication Configurationが表示されていることが確認できます。
ちなみにデプロイ先のクラスタは、管理対象クラスタである`managed1`になっています。
![スクリーンショット 2021-12-06 18.27.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/0fadeebf-5508-4a1c-7a75-fcc52029dafd.png)

同じく`OAM Components`を見てみると、以下のように作成したComoponentsを確認できます。
ちなみにデプロイ先のクラスタは、管理対象クラスタである`managed1`になっています。
![スクリーンショット 2021-12-06 18.28.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/ca8888a6-dbc8-8398-34cc-3d9aa2e1ab6d.png)

`Projects`について見てみると、本記事で作成した`todo-list`という`VerrazzanoProjects`があることが確認できます。
![スクリーンショット 2021-12-06 18.30.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/afab7450-6427-e704-83a0-7ded577513fc.png)

# アプリケーションのメトリクス/ログの確認

最後にアプリケーションのメトリクス/ログの確認を実施します。

Verrazzanoでは、Oracleが提供する各種プロダクト(WebLogic/Coherence/Helidon)については、自動的にメトリクスとログを取得できるようになっています。

今回は、以下のコンポーネントにアクセスします。

- Grafana
- Kibana

各コンポーネントへはVerrazzano Consoleからアクセスできます。

![スクリーンショット 2021-12-06 18.36.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/40e6fe51-2147-cd05-a8f9-6b5a4a510aec.png)

まずは、Grafanaからアクセスし、メトリクスの確認をします。
Grafanaでのダッシュボードは事前に構成済みなので、以下からアクセスできます。

![スクリーンショット 2021-12-06 18.40.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/eb1b5348-4cfe-a748-36d7-de8b834b23ff.png)


今回のサンプルアプリケーションは、WebLogic Serverを使っているので、以下のようにWebLogic Serverのメトリクスが自動的に取得できていることが確認できます。

![スクリーンショット 2021-12-06 18.37.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/6487e692-f0f7-df1d-9b17-29441d584752.png)

また、このようにホスト側のメトリクスも自動的に取得しています。

![スクリーンショット 2021-12-06 18.39.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/c4f1c8c1-68dc-ec61-71a2-bc20a42dd83c.png)

次にKibanaでログの確認をします。

同じようにVerrazzano ConsoleからKibanaに遷移します。

以下の赤枠部分をクリックします。

![スクリーンショット 2021-12-06 18.43.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/f90283fe-2c85-bed0-19de-c2c469032188.png)

Index patternに`verrazzano-namespace-mc-tool-list`を入力します。

![スクリーンショット 2021-12-06 18.46.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/5148ee8b-cd83-aee8-1353-af744f190e62.png)

Filter field nameに`@timestamp`を選択します。

![スクリーンショット 2021-12-06 18.46.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/554aa365-8fc5-f44b-1316-7f9f714d373f.png)

`Create index pattern`をクリックすると以下のように今回デプロイしたサンプルアプリケーションのログが出力されます。

![スクリーンショット 2021-12-06 18.46.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/74763ac9-8503-b621-9674-b9e6f147701f.png)

このように、Verrazzanoでは、特にWebLogic/Coherence/Helidonを利用したアプリケーションについては、メトリクス/ログの設定が自動的に実施されます。

# まとめ

今回は、Verrazzanoで構築したマルチクラスタ環境にサンプルアプリケーションをデプロイしてみました。

Verrazzanoの特徴は、OAMを利用したアプリケーション本体(`Components`)、ロードバランサーやストレージなどの周辺部品(`Application Configuration`)、ハイブリッド/(将来的には)マルチクラウドのデプロイ環境(`placement`)をそれぞれ定義した上で、自由に組み合わせて環境を構築できる可搬性の高さにあります。
また、WebLogic/Coherence/Helidonについては、事前に構築済みの設定を利用して即座にメトリクスやログを各種コンソールから確認できました。

Oracleのプロダクトを利用してアプリケーションを構築していて、これからコンテナ化を進めようとしている皆様には非常に便利なプラットフォームになっているので、ぜひ試してみてください！

#参考記事

https://verrazzano.io/docs/

https://github.com/verrazzano/verrazzano