Db2 for OpenShift and K8s 11.5.9.0 デプロイ用Yaml - Db2uInstance -

Kubernetes版Db2（製品名 [Db2 for Red Hat OpenShift and Kubernetes](https://www.ibm.com/docs/en/db2/11.5?topic=deployments-db2-rhos-k8s) ）の最新版、V11.5.9をDeployしました。


### 2024年1月概観
OpenShiftのWebコンソールでGUIベースでもYaml生成/デプロイできますが、今のところは仕様に沿った正しいYamlが生成されないため、コンソール生成Yamlを部分的に手動で修正します(→[詳細は後述](Db2uInstanceデプロイ初期画面(YAMLビュー)))。

デプロイ手順・考慮点はDb2uInstance 11.5.8-cn2,3 と変わりません。かつてLDAP無し構成としないとDeployが進まない問題もありましたが、11.5.9はLDAPありでも特に問題なく立てられました。


### 参考資料
Db2 for Red Hat OpenShift and Kubernetesの情報源は以下3つあります。
2023年12月末時点、Db2uInstanceのデプロイ手順が言及されるのは今のところ製品マニュアルのみですので、マニュアルをベースにYamlを作成・Deployします。

 * [Db2製品マニュアル「Db2uInstance カスタム・リソースを使用した Db2 のデプロイ」](https://www.ibm.com/docs/ja/db2/11.5?topic=resource-deploying-db2-using-db2uinstance-custom)
     * [サポート対象OCP](https://www.ibm.com/docs/en/db2/11.5?topic=deployments-db2-rhos-k8s)
     * [サポート対象Storage](https://www.ibm.com/docs/en/db2/11.5?topic=db2-configuring-database-storage)
 * [IBM Db2U Operator Adoption Guide](https://pages.github.ibm.com/IBMPrivateCloud/BedrockServices/AdopterGuides/Db2Service.html)
     * 2023.12時点Db2uCluster(旧CR)についてのみ解説
 * Db2 Operator Readme
     * OpenShift(OCP)のWebコンソールから参照可
     * 2023.12時点Db2uCluster(旧CR)についてのみ解説

### 構成

**<<環境>>**
 * Red Hat OpenShift on IBM Cloud (ROKS)
     * Red Hat OpenShift のフルマネージドサービス
     * OCP version: 4.10.67_1591
 * Db2 for OpenShift and Kubernetes（Db2U）
     * Db2 Operator 110509.0.0
     * Db2 Engine version s11.5.9.0

※ OCPバージョンが古くDb2サポート範囲外ですが、まあひとまず試すだけということで‥

**<<ストレージ構成>>**
性能(I/O分散)のため、PVCを分ける構成をとることができます
今回は以下の構成としました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/f918b0e0-9d60-a388-7d93-5a7577345f8b.png)


### Db2uInstanceデプロイの前提
Db2 for Red Hat OpenShift and Kubernetesをデプロイするには、OCPやストレージクラスが構成済であること、Db2コンテナイメージ取得のために必要となるSecretを事前定義しておくこと、Db2 Operatorを導入しておくこと、Db2 Operatorバージョンが古い場合は最新化しておくこと‥などの事前準備が必要となります。

Db2担当者が行う手順の全体的な流れについては、以下別記事に記録しています。
 * [ROKSへのDb2 11.5.8導入手順/ログ <<分散ストレージ構成>>](https://qiita.com/mi-kana/items/82ad881172b715b73ffe)
 * [Db2 for OpenShift : Db2U Operatorの更新方法](https://qiita.com/mi-kana/items/5da19e0b1ec7ce0ea388)

ここでは Db2 Operatorまで導入済であることを前提として、Db2uInstanceをデプロイする手順(≒Yaml)を記載します。


### Db2uInstanceデプロイ手順
上記のようなyamlを作成したら、以下いずれかを用いてDeployします。
 1. OCP Webコンソール
 2. oc apply(create)コマンド

今回は1.で実施します。
OCP WebコンソールからDeployすると、Yamlのひな型が大方出来上がった状態で提供され、フォーム画面やYaml編集画面で直接編集可能です。

##### Db2 Operator先頭画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/55b6a5ca-d5c1-ce98-d046-72ef06906f1a.png)

##### Db2uInstanceデプロイ画面(フォームビュー)

テキストボックス、ドロップダウンリストなどを利用して手軽にプロパティ編集できます
ただしYamlの全項目網羅されるわけではないため、YAMLビューも併用します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/47ebf47f-e8c0-78a7-d3e1-b0f8bbd35b29.png)

##### Db2uInstanceデプロイ初期画面(YAMLビュー)

自動生成されるYAMLを直接編集できる画面です
フォームビューで編集できない項目があればこの画面で追記/編集します。

__補足：__ 自動生成されるYAMLはアクセスモード ReadWriteOnce のストレージ(PVC)の定義位置が間違っているため、手動で修正する必要があります。そのままDeployするとフリーズしDeployが永遠に終わりません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/cafdeced-5dd7-206b-6427-bea0fa47aa9a.png)


##### Db2uInstauceデプロイ開始

フォームビュー/YAMLビューどちらかで「作成」ボタンを押すと、デプロイが開始されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/dc43c3d8-8ea6-d1d9-cdf9-2c002f17d909.png)

##### デプロイ状況の確認
デプロイには数分程度時間がかかります。
oc get pod(または oc get allなど)にて確認し、以下の状態になっていればDeploy完了です。

| Pod名 | STATUS | READY| 備考 |
|:-|:-|:-|:- |
|c-db2uinstance-3-db2u-0   |Running | 1/1  |Db2エンジンのPod<br> * db2syscが稼働   |
|c-db2uinstance-3-restore-morph-xxxxx   |Completed | 0/1  |Db2セットアップの最終処理を行うJobに属するPod |


__Deploy完了時の oc get all コマンド出力例__
```
# oc get all | grep -i db2uinstance-3
pod/c-db2uinstance-3-db2u-0                                 1/1     Running     0          10m
pod/c-db2uinstance-3-etcd-0                                 1/1     Running     0          10m
pod/c-db2uinstance-3-ldap-df8b64c59-7vf6v                   1/1     Running     0          11m
pod/c-db2uinstance-3-restore-morph-98sh7                    0/1     Completed   0          99s
service/c-db2uinstance-3-db2u                              ClusterIP   172.21.102.17    <none>        50000/TCP,50001/TCP,25000/TCP,25001/TCP,25002/TCP,25003/TCP,25004/TCP,25005/TCP   10m
service/c-db2uinstance-3-db2u-engn-svc                     NodePort    172.21.141.74    <none>        50001:31853/TCP,50000:30582/TCP                                                   10m
service/c-db2uinstance-3-db2u-head-engn-svc                NodePort    172.21.212.246   <none>        50001:32708/TCP,50000:30335/TCP                                                   10m
service/c-db2uinstance-3-db2u-internal                     ClusterIP   None             <none>        50000/TCP,9443/TCP,50052/TCP                                                      10m
service/c-db2uinstance-3-etcd                              ClusterIP   None             <none>        2379/TCP,2380/TCP                                                                 11m
service/c-db2uinstance-3-ldap                              ClusterIP   172.21.142.167   <none>        50389/TCP   11m
deployment.apps/c-db2uinstance-3-ldap              1/1     1            1           11m
replicaset.apps/c-db2uinstance-3-ldap-df8b64c59               1         1         1       11m
statefulset.apps/c-db2uinstance-3-etcd   1/1     10m
job.batch/c-db2uinstance-3-restore-morph   1/1           7s         99s
```

##### 動作確認
本格的なUTまではいきませんが、ひととおりの簡単な動作確認をします。
 * Podにログインできるか
 * db2inst1ユーザにスイッチ可能か
 * DBディレクトリが正しく表示されるか
 * データベースに接続できるか
 * 表の作成/INSERT/SELECTなど、読み書き操作ともに支障なく行えるか

```
# oc rsh c-db2uinstance-3-db2u-0 bash
Defaulted container "db2u" out of: db2u, instdb (init), init-labels (init), init-kernel (init)
[db2uadm@c-db2uinstance-3-db2u-0 /]$ db2 list db directory
bash: db2: command not found
[db2uadm@c-db2uinstance-3-db2u-0 /]$ su - db2inst1
Last login: Mon Dec 25 03:06:35 UTC 2023
[db2inst1@c-db2uinstance-3-db2u-0 - Db2U db2inst1]$ date ; db2 list db directory
Mon Dec 25 03:16:48 UTC 2023

 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-3-db2u-0 - Db2U db2inst1]$ db2 "connect to sampledb"

   Database Connection Information

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

[db2inst1@c-db2uinstance-3-db2u-0 - Db2U db2inst1]$ db2 "create table t1 (c1 integer, c2 char(32), c3 timestamp)"
DB20000I  The SQL command completed successfully.
[db2inst1@c-db2uinstance-3-db2u-0 - Db2U db2inst1]$ db2 "insert into t1 values (1,'db created', current timestamp)"
DB20000I  The SQL command completed successfully.
[db2inst1@c-db2uinstance-3-db2u-0 - Db2U db2inst1]$ db2 "select * from t1"

C1          C2                               C3
----------- -------------------------------- --------------------------
          1 db created                       2023-12-25-03.17.20.923992

  1 record(s) selected.

[db2inst1@c-db2uinstance-3-db2u-0 - Db2U db2inst1]$

```

##### ライセンス適用
Db2 for Red Hat OpenShift and Kubernetes でも、従来のオンプレ版Db2同様に、有償版利用時にはライセンスを適用します。
適用するライセンスファイルはオンプレ版と同じものを使用しますが、適用手順が異なります。手順は[Db2マニュアル](https://www.ibm.com/docs/ja/db2/11.5?topic=updating-managing-licenses)に記載される通りです。ここでは割愛。



### Db2uInstance 11.5.9 デプロイ用Yaml

以下内容で構成します
 * CRの種類: Db2uInstance
 * バージョン：s11.5.9.0
 * DB種別：db2oltp
     * warehouseの場合、db2wh を選択
 * DB名：SAMPLEDB
     * デフォルトではBLUDB
 * コードセット：UTF-8
 * テリトリー：JP
 * レジストリ変数の一部を事前構成
 * ライセンス：Accept
 * Image Pull Secret：ibm-registry([事前定義済](https://qiita.com/mi-kana/items/82ad881172b715b73ffe))
 * リソース制限: CPU 4 / Memory 16 Gi
 * ストレージ：[上図](#構成)の通りの分散構成

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