Unified Console を導入してみた

[別記事](https://qiita.com/hirmur/private/6ffd25ae23f7002612d8)で導入した[Db2 Warehouse 11.5.4 on OpenShift](https://www.ibm.com/support/knowledgecenter/SSCJDQ/com.ibm.swg.im.dashdb.ucontainer.doc/doc/db2w_universal_container.html)（以下Db2WH）をWebブラウザのGUIから利用するためのツールである Unified Consoleを同検証環境に導入しました。導入は[Knowledge Center](https://www.ibm.com/support/knowledgecenter/SSCJDQ/com.ibm.swg.im.dashdb.ucontainer.doc/doc/t_db2u_install_dmc.html)や[GitHub](https://github.com/IBM/charts/tree/master/stable/ibm-unified-console)の記載に基づいて実施しています。

#目次

- [前提要件](#前提要件)
- [導入環境](#導入環境)
- [Helmチャートの準備](#helmチャートの準備)
- [インストール準備](#インストール準備)
    - [設定ファイルの編集](#設定ファイルの編集)
    - [インストール・シェルの修正](#インストールシェルの修正)
- [インストールの実行](#インストールの実行)
- [haproxyの設定](#haproxyの設定)
    - [ポート番号の確認](#ポート番号の確認)
    - [haproxy.cfgの編集](#haproxycfgの編集)
- [動作確認](#動作確認)


#前提要件

###コンポーネントの要件
- Kubernetesのバージョン：1.11.3以上
- Helmのバージョン Level:X86: ">=2.14 and < 3.0"
- OpenShiftのバージョン：3.11, 4.x
<br>（[GitHub](https://github.com/IBM/charts/tree/master/stable/ibm-db2warehouse#db2-warehouse-11540)には4.3までの記載しかないが、[Knowledge Center(Db2WH)](https://www.ibm.com/support/knowledgecenter/SSCJDQ/com.ibm.swg.im.dashdb.ucontainer.doc/doc/t_db2u_install.html)では4.xとなっている）
- Db2 Warehouse もしくは AESE(Advanced Enterprise Server Edition)が同じクラスターにインストールされており、LDAPサービスが有効化されていること

###リソース要件
- CPU：2.3コア（2コアがConsole APIで使用され、残り0.3コアはConsole UIで使用される）
- メモリ：4.5GiB（4GiBがConsole APIで使用され、残り0.5GiBはConsole UIで使用される）

#導入環境
###各コンポーネントのバージョン
|項目|バージョン|
|:--|:--|
|OS(bastion)|RHEL 7.7|
|OS(master/worker)|RHEL 7.7|
|OCP(Client)|4.5.0-202007240519.p0-b66f2d3|
|OCP(Server)|4.5.7|
|Kubernetes|v1.17.1+912792b|
|Helm|2.16.9|
|NFS|4.2|
|Db2 Warehouse|11.5.4.0|

###論理構成
Db2WHが導入されているプロジェクトにUnified Consoleを導入しています。
![構成図5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691419/3dae22a2-f24e-000f-9b20-947adcdd802e.png)
**サーバー・リソース**
検証環境の各Nodeサーバーのスペックです。

|項目|vCPU|メモリ|
|:--|:--|:--|
|Master node|4 core|16GB|
|Worker node|16 core|64GB|
|Bastion|4 core|8GB|


#Helmチャートの準備
###Helmチャートのダウンロード
IBMが提供する各製品のHelm chart一式をダウンロードし、その中からUnified Consoleのchartを取り出して利用します。次のURLからチャートをダウンロードします。
https://github.com/IBM/charts/tree/master/
（GitHubの仕様上プロジェクト単位でしかダウンロードができないため、個別のchartのみのダウンロードができません。）
![helm1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691419/e2771b98-e2e3-f4f8-8f41-ceb196686356.png)
ダウンロードしたzipの中身の構造は以下の様になっており、この中から`ibm-unified-console`ディレクトリを取り出して使用します。

```sh:charts-master.zip(92.5MB)の構造
charts-master
├── LICENSE
├── ORIGIN
├── README.md
├── #途中省略
└── stable
    ├── #途中省略
    ├── ibm-transadv-rhel-dev
    ├── ibm-unified-console '←今回使用するchartはこれ'
    ├── ibm-voice-gateway-dev
    └── #以下省略
```

###Helmチャートの配置
次に`ibm-unified-console`ディレクトリをOCP環境（Bastionサーバー）に転送・配置します。

```console
-- 今回は/work/media/ibm_unified_console/に配置した
[root@k3bastion]# tree -L 1 /work/media/ibm_unified_console
/work/media/ibm_unified_console
└── ibm-unified-console
```
>Db2WHの導入に倣ってHelmチャートを配置するディレクトリには他のものは置いていませんが、追加検証したところ他のディレクトリが配置されていても問題は無さそうです。


#インストール準備
###プロジェクトへの移動
Db2WHを導入しているプロジェクトにカレント・プロジェクトを変更し、Db2WHと同じプロジェクトにUnified Consoleを導入します。

```console
-- カレント・プロジェクトを変更する（今回はdb2-warehouse1に変更）
[root@k3bastion]# oc project db2-warehouse1
```

###設定ファイルの編集
OpenShiftクラスターの外部からUnified Consoleに接続するために、Unified ConsoleのサービスをNodePortにする必要があります。デフォルト状態ではClusterIP（OpenShiftクラスター内部でのみ通信が可能）になっているため、設定ファイルを編集してNodePortにする必要があります。
編集をするのは`ibm-unified-console/ibm_cloud_pak/pak_extensions` 配下の`values-standalone-console.yaml` ファイルです。

```shell:values-standalone-console.yamlの所在
ibm-unified-console
├── #途中省略
├── ibm_cloud_pak
│   ├── manifest.yaml
│   ├── pak_extensions
│   │   ├── common
│   │   ├── deploy_console.sh
│   │   ├── pre-install
│   │   └── values-standalone-console.yaml '←このファイルを編集する'
│   └── #以下省略
└── #以下省略
```
`values-standalone-console.yaml` の編集をします。

```console
[root@k3bastion]# vi values-standalone-console.yaml
```

```yaml:values-standalone-console.yaml変更箇所
#ucui:service:type:ClusterIPをNodePortに変更する
ucui:
  #途中省略
  service:
    httpsPort: 8443
    httpsPort2: 443
    type: NodePort #←ここがClusterIPになっているためNodePortに変更する
    name: ""
#以下省略
```

###インストール・シェルの修正
`2020/10/09`時点、今回使用している検証環境ではGitHubからダウンロードしたインストール・シェルを実行するとエラーが発生してしまい、以下の様に修正して使用する必要があります。

```shell:インストール・シェルの所在
ibm-unified-console
├── #途中省略
├── ibm_cloud_pak
│   ├── manifest.yaml
│   ├── pak_extensions
│   │   ├── common
│   │   ├── deploy_console.sh '←このファイルがインストール・シェル'
│   │   ├── pre-install
│   │   └── values-standalone-console.yaml
│   └── #以下省略
└── #以下省略
```
`deploy_console.sh`を編集します。

```console
[root@k3bastion]# vi deploy_console.sh
```

```sh:deploy_console.sh修正箇所
#105行目のif文が原因でエラーとなっているため修正する
###【修正前】print $7辺りからうまく処理ができていない
105 if [[ "$(helm ls $TLS_OPTION|grep NAMESPACE |awk -F "[\t]" '{print $7}')"X == "NAMESPACEX" ]];then

###【修正後】以下の様に書き換える
105 if [[ "$(helm ls $TLS_OPTION|grep NAMESPACE |awk -F "[\t]" 'gsub(" ","")'|awk -F "[\t]" '{print $7}')"X == "NAMESPACEX" ]];then
```

#インストールの実行
###インストール・シェルの実行

```sh
#インストール・シェルの構文
./deploy-console.sh --console-release-name STRING --db-release-name STRING [OTHER ARGUMENTS...]
```

|必須オプション|説明|
|:--|:--|
|--console-release-name STRING|Helmのリリース名を指定する|
|--db-release-name STRING|既存Db2のHlemのリリース名|

※上記以外のオプションは[GitHub](https://github.com/IBM/charts/tree/master/stable/ibm-unified-console#installing-the-chart)を参照してください。

**インストール・シェル実行例**

```console
[root@k3bastion]# ./deploy_console.sh --console-release-name db2whuc --db-release-name db2-warehouse1
==> Getting the helm Server version
<== helm Server version is obtained

==> Getting the helm Client version
<== helm Client version is obtained

v2.16.9
v2.16.9
==> Comparing the Server and Client version
<== Versions match

==> Checking the Server and Client version
NAME:   db2whuc
LAST DEPLOYED: Thu Oct  8 21:28:35 2020
NAMESPACE: db2-warehosue1
STATUS: DEPLOYED

RESOURCES:
==> v1/Deployment
NAME                              READY  UP-TO-DATE  AVAILABLE  AGE
db2whuc-ibm-unified-console-api  0/1    1           0          1s
db2whuc-ibm-unified-console-ui   0/1    1           0          1s

==> v1/Pod(related)
NAME                                               READY  STATUS             RESTARTS  AGE
db2whuc-ibm-unified-console-api-66c466676b-s49l4  0/1    ContainerCreating  0         1s
db2whuc-ibm-unified-console-ui-775484687b-r2lgr   0/1    ContainerCreating  0         1s

==> v1/Service
NAME                              TYPE       CLUSTER-IP     EXTERNAL-IP  PORT(S)                       AGE
db2whuc-ibm-unified-console-api  ClusterIP  172.30.254.49  <none>       11081/TCP                     1s
db2whuc-ibm-unified-console-ui   NodePort   172.30.229.29  <none>       8443:30644/TCP,443:30867/TCP  1s


NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace db2-warehosue1 -l "app=db2whuc-ibm-unified-console" -o jsonpath="{.items[0].metadata.name}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl port-forward $POD_NAME 8080:8443

route.route.openshift.io/db2whuc created
Console url is: https://db2whuc-db2-warehosue1.apps.isvsol.jp-ise.com
```
上の様な出力が出たらインストールコマンドは正常終了していますが、全てのPod(2つ)が正常に起動するのに少し時間がかかります。（検証環境では10分程度）


Unified Consoleは2つのPod（apiとui）から構成されています。以下の様に両方のPodが正常に起動すると、Unified Consoleが使える状態になります。（まれにPodのSTATUS が Error、Evicted、Init:Error等になっている場合がありますが、同じ役割の別Podが正常に起動していれば問題ありません。）

```console
[root@k3bastion]# oc get pod
NAME                                                READY   STATUS       RESTARTS   AGE
#途中省略
db2whuc-ibm-unified-console-api-66c466676b-s49l4    1/1     Running      0          28m
db2whuc-ibm-unified-console-ui-775484687b-r2lgr     1/1     Running      0          28m
```

#haproxyの設定
今回の検証環境ではOpenShiftクラスター外部からクラスター内のPodに接続をする際にhaproxyの設定をする必要があります。以下では設定に必要なポート番号の取得と、設定を行います。
※以下の手順はDb2WHの[Knowledge Center](https://www.ibm.com/support/knowledgecenter/SSCJDQ/com.ibm.swg.im.dashdb.ucontainer.doc/doc/aese-conn-ovu.html)の記述を参考にしています。


###ポート番号の確認
Unified Consoleサービスが使用しているポート番号を確認します。
以下の手順で確認する`YYYYY`がUnified Consoleに接続するために使用するポート番号です。
1. `oc get services`を実行する
2. Pod名が `{Unified Console のRelease name}-ibm-unified-console-ui`のPodを探す
3. `PORT(S)`部分の、`8443:YYYYY/TCP,...`となっている`YYYYY`を確認する。（出力サンプルでは30644番）


```console
-- 今回は30644がYYYYYに相当している
[root@k3bastion]# oc get services
NAME                               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                           AGE
#途中省略
db2whuc-ibm-unified-console-api    ClusterIP   172.30.254.49    <none>        11081/TCP                                                                         28m
db2whuc-ibm-unified-console-ui     NodePort    172.30.229.29    <none>        8443:30644/TCP,443:30867/TCP                                                      28m
```

###haproxy.cfgの編集
Unified Consoleのサービスに紐付くポートによるOpenShiftクラスター外部との通信ができるように、`/etc/haproxy/haproxy.cfg`に設定を追加する。

```console
[root@k3bastion]# vi /etc/haproxy/haproxy.cfg
```


```sh:haproxy.cfg追加分
frontend unified-console
    bind *:30644
    default_backend unified-console-ui
    mode tcp
    option tcplog
backend unified-console-ui
    balance source
    mode tcp
    server worker1 worker1-PrivateIP:30644 check
    server worker2 worker2-PrivateIP:30644 check
    server worker3 worker3-PrivateIP:30644 check
    #worker1(2,3)-PrivateIPは各ワーカーノードのプライベートIPアドレス
```

`/etc/haproxy/haproxy.cfg`の設定を反映する。

```console
[root@k3bastion]# systemctl reload haproxy
```

#動作確認
###Unified Consoleへの接続
IPアドレス(XXX.XXX.XXX.XXX)とポート番号(YYYYY)をWebブラウザのURL欄に入力（`https://XXX.XXX.XXX.XXX:YYYYY/`）して、Local PCからUnified Consoleに接続します。
IPアドレスはクラスターに接続可能なサーバーのIPアドレスを使用する必要があり、今回の検証環境ではBastionサーバー（参照：[論理構成](#論理構成)）のPublic IPアドレスを使用します。
ポート番号は前手順で確認したYYYYYを使用します。

WebブラウザにURLを入力して接続します。
![UC1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691419/842c5759-b107-4934-f959-737e74b65895.png)

接続するとログイン画面が表示されるので、[Db2WH導入時](https://qiita.com/hirmur/private/6ffd25ae23f7002612d8#権限シークレットの構成)に設定したbluadminのパスワードを使用してログインします。
![UC2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691419/6a76e03f-0457-a530-7bf2-7b6023739a86.png)

ログインすると以下の様にDb2WHの各種モニタリングやスキーマ・表の確認ができます。
【メニュー】
![スクリーンショット 2020-10-19 12.13.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691419/3443c601-d041-1217-25d6-257bc822f8b9.png)


【Db2WHの各種モニタリング】
![UC3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691419/f3b427ef-b521-00d8-270a-3ba0e345e22d.png)
【スキーマ・表定義の確認】
![UC4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691419/00101b57-95d1-2db3-81b0-f112af25adcc.png)
【表のデータの確認】
![UC5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691419/053970f5-243a-b81e-1cc9-234ed6e720b5.png)


以上でUnified Consoleの導入および動作確認は終了です。