Db2uInstance(11.5.8-cn2)デプロイYaml

## Db2 for OpenShift and Kubernetes 11.5.8.0-cn2
Db2をOpenShift/K8s環境で稼働するときは、[Db2 for OpenShift and Kubernetes](https://www.ibm.com/docs/en/db2/11.5?topic=deployments-db2-rhos-k8s)(別名Db2U)を利用します。

OpenShiftやK8sの環境に Db2(Db2U) Operatorをインストールすると、Db2のインストール、運用のためのAPIを提供するカスタムリソースが利用可能になります。

Db2のインストールには、以下2種類のカスタムリソースを利用することができます。

 * __Db2uCluster__
     * Db2 Operator登場時(V11.5.5)に提供開始
     * すべての複数論理ノード(MLN)が各Pod内で同じデータボリュームを共有
     * OpenShift Data Foundation (ODF)やPortworxのようなSoftware-Defined Storageで比較的優れたパフォーマンスを発揮
     * Db2エンジンとetcdはStatefulSetとしてDeployされる
     
 * __Db2uInstance__
     * V11.5.8で登場
         * 当初はWarehouse MPP構成のみサポート
         * V11.5.8.0-cn1以降、通常のOLTPデータベース構成(db2oltp)もサポート
     * Amazon Web Services (AWS) や Azure などのクラウドプラットフォームで、大幅なパフォーマンス向上を実現
     * StatefulSetとしてDeployされるのはetcdのみ
     
ここでは新しく登場したDb2uInstanceで、OLTP用データベースを構成します。

## Db2uCluster, Db2uInstance YAMLの違い
以下の点が異なります。(他にもあるのかもしれませんが、顕著な違いとして)

 * API(kind)
 * ストレージ定義の記述位置
     * Db2uClusterでは、ストレージ定義はまとめて一か所に記載
     * Db2uInstanceでは、データ/アクティブログ用のストレージ定義はデータベース定義の一部となる
         * Db2uClusterと同じ記述方法ではDeploy不可(詳細は後述)
 * 複数論理ノード(MLN)の定義
     * Db2uInstanceには、Volume Per Partition の設定がある
     

## 前提
 * CPU, Memory, Storage等の前提条件は、Db2 Operator の Readme画面で確認可能
     * Db2uInstanceのデプロイの前提は、Db2uClusterと変わらないようです
 * 今回はDb2uCluster稼働中のROKS環境に、Db2uInstanceを追加デプロイ
     * Db2前提要件～Db2 Operatorまでの導入手順は、[過去ログ](https://qiita.com/mi-kana/items/82ad881172b715b73ffe)に記載しているため、この記事では割愛します
     * 稼働中のDb2uClusterがあるプロジェクト内に、Db2uInstanceを導入

## Db2uInstanceデプロイ手順
[Db2マニュアル](https://www.ibm.com/docs/en/db2/11.5?topic=resource-deploying-db2-using-db2uinstance-custom) に沿って導入します。

### Step1. Db2uInstance インストール
OCP Webコンソールを開き、Db2 Operator を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/56bd1754-2ea7-f70c-6aa6-314799c3fa73.png)

Db2u Instanceの「インスタンスの作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/7eedc71d-6522-aeee-3321-383dd0d7404a.png)

Yaml編集画面が開きます。
予め入力済となっているYamlをベースに修正するか、[Db2マニュアル](https://www.ibm.com/docs/en/db2/11.5?topic=resource-deploying-db2-using-db2uinstance-custom)を参考に適宜修正を行い、「作成」を押下します。
　※今回Deployした際のYamlファイルは末尾に掲載

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/169c0976-2dee-4e50-3fb0-da20e2d03e94.png)


インストールが開始され、Db2uInstanceの一覧画面に遷移します。
「ステータス」列が「NotReady」から「Ready」に変わったらデプロイ完了です。

(デプロイ開始直後)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/37ea2542-9353-0a41-e257-3ccf9d95c504.png)

(完了後)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/1742627d-4029-fd87-851a-eabf1a499295.png)

### Step2. Db2uInstance インストール完了確認
OCP Webコンソールのステータスが「Ready」となっていれば導入は成功していますが、念のためコマンドラインでも状況を確認します。

・Db2uInstanceのSTATEが「Ready」となっていること
```
# oc get db2uinstance
NAME             STATE   MAINTENANCESTATE   AGE
db2uinstance-1   Ready   None               36m
```

・\<deploy-name>-restore-morph の Pod の STATE が Completed であること
・\<deploy-name>-db2u-0 の Pod の STATE が Running かつ READY が「1/1」であること
```
root@IBM-PF2E8K5F:~# oc get all | grep -v db2ucluster
NAME                                                   READY   STATUS      RESTARTS        AGE
pod/c-db2uinstance-1-db2u-0                            1/1     Running     0               5d1h
pod/c-db2uinstance-1-etcd-0                            1/1     Running     0               5d1h
pod/c-db2uinstance-1-restore-morph-vmk24               0/1     Completed   0               5d1h
pod/db2u-day2-ops-controller-manager-569554d5f-bshsx   1/1     Running     1 (92d ago)     121d
pod/db2u-operator-manager-6dff8b7d74-cgpwf             1/1     Running     7 (6d22h ago)   121d

NAME                                                       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)
                                                                AGE
service/c-db2uinstance-1-db2u                              ClusterIP   172.21.179.245   <none>        50000/TCP,50001/TCP,25000/TCP,25001/TCP,25002/TCP,25003/TCP,25004/TCP,25005/TCP   5d1h
service/c-db2uinstance-1-db2u-engn-svc                     NodePort    172.21.228.2     <none>        50001:32383/TCP,50000:32713/TCP                                                   5d1h
service/c-db2uinstance-1-db2u-head-engn-svc                NodePort    172.21.119.65    <none>        50001:30372/TCP,50000:30755/TCP                                                   5d1h
service/c-db2uinstance-1-db2u-internal                     ClusterIP   None             <none>        50000/TCP,9443/TCP,50052/TCP                                                      5d1h
service/c-db2uinstance-1-etcd                              ClusterIP   None             <none>        2379/TCP,2380/TCP                                                                 5d1h
service/db2u-day2-ops-controller-manager-metrics-service   ClusterIP   172.21.49.113    <none>        8443/TCP
                                                                160d

NAME                                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/db2u-day2-ops-controller-manager   1/1     1            1           160d
deployment.apps/db2u-operator-manager              1/1     1            1           234d

NAME                                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/db2u-day2-ops-controller-manager-569554d5f    1         1         1       121d
replicaset.apps/db2u-day2-ops-controller-manager-84cc85fb8d   0         0         0       160d
replicaset.apps/db2u-operator-manager-6dff8b7d74              1         1         1       121d
replicaset.apps/db2u-operator-manager-7dff69955b              0         0         0       160d

NAME                                     READY   AGE
statefulset.apps/c-db2uinstance-1-etcd   1/1     5d1h

NAME                                       COMPLETIONS   DURATION   AGE
job.batch/c-db2uinstance-1-restore-morph   1/1           5s         5d1h
```

oc get all の結果から、StatefulSet としてデプロイ・管理されるのは etcd だけであることも確認できます。

### Step3. 動作確認

バージョン確認：
```
# oc rsh c-db2uinstance-1-db2u-0 bash
Defaulted container "db2u" out of: db2u, instdb (init), init-labels (init), init-kernel (init)
[db2uadm@c-db2uinstance-1-db2u-0 /]$ su - db2inst1
Last login: Wed Sep 20 06:42:41 UTC 2023 on pts/0
[db2inst1@c-db2uinstance-1-db2u-0 - Db2U db2inst1]$ db2level
DB21085I  This instance or install (instance name, where applicable:
"db2inst1") uses "64" bits and DB2 code release "SQL11058" with level
identifier "0609010F".
Informational tokens are "DB2 v11.5.8.0", "special_28620",
"DYN2304191336AMD64_28620", and Fix Pack "0".
Product is installed at "/opt/ibm/db2/V11.5.0.0".

[db2inst1@c-db2uinstance-1-db2u-0 - Db2U db2inst1]$
```

簡易な動作確認として、接続確認、オブジェクト作成、データ挿入、データ読込：
```
[db2inst1@c-db2uinstance-1-db2u-0 - Db2U db2inst1]$ db2gcf -s

DB2 State : Available
[db2inst1@c-db2uinstance-1-db2u-0 - Db2U db2inst1]$ db2 list db directory

 System Database Directory

 Number of entries in the directory = 1

Database 1 entry:

 Database alias                       = SAMPLEDB
 Database name                        = SAMPLEDB
 Local database directory             = /mnt/blumeta0/db2/databases
 Database release level               = 15.00
 Comment                              =
 Directory entry type                 = Indirect
 Catalog database partition number    = 0
 Alternate server hostname            =
 Alternate server port number         =

[db2inst1@c-db2uinstance-1-db2u-0 - Db2U db2inst1]$ db2 connect to sampledb

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.8.0
 SQL authorization ID   = DB2INST1
 Local database alias   = SAMPLEDB

[db2inst1@c-db2uinstance-1-db2u-0 - Db2U db2inst1]$ db2 list tables

Table/View                      Schema          Type  Creation time
------------------------------- --------------- ----- --------------------------

  0 record(s) selected.

[db2inst1@c-db2uinstance-1-db2u-0 - Db2U db2inst1]$ db2 "create table t1 (c1 integer, c2 char(32))"
DB20000I  The SQL command completed successfully.
[db2inst1@c-db2uinstance-1-db2u-0 - Db2U db2inst1]$ db2 "insert into t1 values (1,'db2uinst')"
DB20000I  The SQL command completed successfully.
[db2inst1@c-db2uinstance-1-db2u-0 - Db2U db2inst1]$ db2 "insert into t1 values (2,'deploy-comp')"
DB20000I  The SQL command completed successfully.
[db2inst1@c-db2uinstance-1-db2u-0 - Db2U db2inst1]$ db2 "select * from t1"

C1          C2
----------- --------------------------------
          1 db2uinst
          2 deploy-comp

  2 record(s) selected.

[db2inst1@c-db2uinstance-1-db2u-0 - Db2U db2inst1]$ db2 terminate
DB20000I  The TERMINATE command completed successfully.
[db2inst1@c-db2uinstance-1-db2u-0 - Db2U db2inst1]$


```

### Step4. ライセンス適用(Option)
ライセンスはこちらのマニュアルに従って適用可能です。
[Db2マニュアル「Db2 Community Edition ライセンス証明書キーのアップグレード」](https://www.ibm.com/docs/ja/db2/11.5?topic=updating-managing-licenses)
(※[Db2uClusterの場合](https://qiita.com/mi-kana/items/93b54378aad63e9121cb)と同一手順)



## Db2uInstanceデプロイ用Yamlファイル

```yaml:db2uinstance-1
apiVersion: db2u.databases.ibm.com/v1
kind: Db2uInstance
metadata:
  name: db2uinstance-1
  namespace: db2u-1
spec:
  license:
    accept: true
  account:
    imagePullSecrets:
      - ibm-registry
    privileged: true
  environment:
    partitionConfig:
      dataOnMln0: true
      total: 1
      volumePerPartition: true
    instance:
      password:
        value: xxxxxxxx
      registry:
        DB2_ATS_ENABLE: 'NO'
        DB2_DISPATCHER_PEEKTIMEOUT: '2'
        DB2_OBJECT_STORAGE_SETTINGS: 'OFF'
    databases:
      - settings:
          codeset: UTF-8
          territory: JP
        name: SAMPLEDB
        storage:
          - name: data
            type: template
            spec:
              accessModes:
                - ReadWriteOnce
              resources:
                requests:
                  storage: 5Gi
              storageClassName: ocs-storagecluster-ceph-rbd
          - name: activelogs
            type: template
            spec:
              accessModes:
                - ReadWriteOnce
              resources:
                requests:
                  storage: 5Gi
              storageClassName: ocs-storagecluster-ceph-rbd
    authentication:
      ldap:
        enabled: false
    dbType: db2oltp
  storage:
    - name: meta
      type: create
      spec:
        accessModes:
          - ReadWriteMany
        resources:
          requests:
            storage: 5Gi
        storageClassName: ocs-storagecluster-cephfs
    - name: backup
      type: create
      spec:
        accessModes:
          - ReadWriteMany
        resources:
          requests:
            storage: 5Gi
        storageClassName: ocs-storagecluster-cephfs
    - name: archivelogs
      type: create
      spec:
        accessModes:
          - ReadWriteMany
        resources:
          requests:
            storage: 5Gi
        storageClassName: ocs-storagecluster-cephfs
  podTemplate:
    db2u:
      resource:
        db2u:
          limits:
            cpu: 4
            memory: 16Gi
  nodes: 1
  version: s11.5.8.0-cn2

```




## 補足

### Db2uClusterは今後非推奨 ??
Db2の製品マニュアルには、Db2uClusterが非推奨とは記載されません。
OCP Webコンソールから Db2 Operator を表示すると、Db2u Instanceの説明としてDb2uInstanceの利用が推奨されること、Db2uClusterは将来非推奨となること‥と記載があります。
新しい製品なので、動向を見守るしかないのでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/3ece86d7-9ed9-bfa4-318a-371af823ef27.png)


### Storageの定義をDb2uCluster同様にYaml記述した場合
Db2uInstanceをデプロイする際には、Db2uClusterと異なり、データとアクティブログのストレージ定義をデータベース(Database)の子要素として記述する必要があります。

うっかり、Db2uCluster同様に末尾に一括してストレージ定義を書くとどうなるか？
エラーになってくれると良いのですが、Deployが永遠に終わらないという残念な状況となり、何が起きているのかわかりません。

以下のように、restore-morphのJob, Pod が起動せず、db2u-0 の Podが 「STATE:Running, READY: 0/1」 の状態となります。

```
# oc get all -o wide | grep -i db2uinstance-1
2023年  9月 16日 土曜日 00:00:42 JST
pod/c-db2uinstance-1-db2u-0                            0/1     Running     0             84s    172.17.12.158   10.244.64.6   <none>           <none>
pod/c-db2uinstance-1-etcd-0                            1/1     Running     0             98s    172.17.12.164   10.244.64.6   <none>           <none>
pod/c-db2uinstance-1-ldap-7d754d498c-2gccw             1/1     Running     0             109s   172.17.12.177   10.244.64.6   <none>           <none>
service/c-db2uinstance-1-db2u                              ClusterIP   172.21.100.222   <none>        50000/TCP,50001/TCP,25000/TCP,25001/TCP,25002/TCP,25003/TCP,25004/TCP,25005/TCP   95s    app=db2uinstance-1,component=db2oltp,formation_id=db2uinstance-1,role=db,type=engine
service/c-db2uinstance-1-db2u-engn-svc                     NodePort    172.21.222.167   <none>        50001:30726/TCP,50000:31144/TCP                                                   97s    app=db2uinstance-1,component=db2oltp,formation_id=db2uinstance-1,role=db,type=engine
service/c-db2uinstance-1-db2u-head-engn-svc                NodePort    172.21.4.38      <none>        50001:30113/TCP,50000:31286/TCP                                                   96s    app=db2uinstance-1,component=db2oltp,formation_id=db2uinstance-1,name=dashmpp-head-0,role=db,type=engine
service/c-db2uinstance-1-db2u-internal                     ClusterIP   None             <none>        50000/TCP,9443/TCP,50052/TCP                                                      96s    app=db2uinstance-1,component=db2oltp,formation_id=db2uinstance-1,role=db,type=engine
service/c-db2uinstance-1-etcd                              ClusterIP   None             <none>        2379/TCP,2380/TCP                                                                 109s   app=db2uinstance-1,component=etcd,formation_id=db2uinstance-1
service/c-db2uinstance-1-ldap                              ClusterIP   172.21.160.12    <none>        50389/TCP
                                                                110s   app=db2uinstance-1,formation_id=db2uinstance-1,role=ldap
deployment.apps/c-db2uinstance-1-ldap              1/1     1            1           110s   ldap         icr.io/db2u/db2u.auxiliary.auth@sha256:89c19da618e6f0c9f2e5218ed1d6afa39c83cd21b332f0b611afa0ee430fbceb          app=db2uinstance-1,formation_id=db2uinstance-1,role=ldap
replicaset.apps/c-db2uinstance-1-ldap-7d754d498c              1         1         1       110s   ldap
   icr.io/db2u/db2u.auxiliary.auth@sha256:89c19da618e6f0c9f2e5218ed1d6afa39c83cd21b332f0b611afa0ee430fbceb
                                 app=db2uinstance-1,formation_id=db2uinstance-1,pod-template-hash=7d754d498c,role=ldap
statefulset.apps/c-db2uinstance-1-etcd   1/1     98s    etcd         icr.io/db2u/etcd@sha256:c6c35e11f923c9d058e012d02caab720bf1e6db0c9bcb0363635a51a76f972b4
root@IBM-PF2E8K5F:~#
```

data, activelog についてストレージ定義を正しい位置に記述しないと、Db2Uセットアップの必須ステップであるrestore-morphジョブが開始されません。Db2エンジン本体である db2u-0 のPod自体は作成されるものの、肝心のデータベースの初期化が進まないため、Startup probe の成功条件が満たされず、READY出力が"0/1"のままの状態で半永久的に膠着してしまいます。