ROKSへのDb2 11.5.8導入手順/ログ <<分散ストレージ構成>>

## はじめに
 * IBM Cloud上のマネージドOpenShift環境である ROKS に、Db2を導入した時の導入手順を備忘録として記録します
 * OpenShift/Kubernetes環境でDb2を動かすには、マイクロサービスとして開発された専用のDb2を導入する必要があります
     * [Db2 for Red Hat OpenShift and Kubernetes](https://www.ibm.com/docs/en/db2/11.5?topic=deployments-db2-rhos-k8s)、別名Db2Uとも呼ばれます
     * Db2として公式の Kubernetes Operator が提供されます
 * デフォルト構成に少し手を加えて、トランザクションログや一時表スペース用の領域を別個のPVCに分散配置する構成とします
     * Db2 11.5.8-cn1以降はデフォルトで分散storage構成となります
 * できる限りOCP Webコンソールのみを使ってDeployしますが、過去のリリースレベルと異なりエラーで先に進めなくなることもあったため、エラーメッセージや対処方法も残します


## 環境 / 構成

 * OpenShift Container Platform 4.10.47
 * Db2 Operator 110508.0.0
 * Db2 for OpenShift and Kubernetes (Db2U) s11.5.8.0
 * Persistent Volume Claim(PVC)構成 : 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/fe1dd0d7-c38f-557e-62ef-a835906e20d6.png)

ストレージクラスは、今回の環境にて利用可能なもので[Db2がサポートするクラス](https://www.ibm.com/docs/en/db2/11.5?topic=storage-certified-options)を指定します。

|PVC  | PVC作成の必要性 | アクセスモード |ストレージクラス  |
|:-|:-|:-|:-|
|SHARED META   |必須   |RWX   |ocs-storagecluster-cephfs |
|DATA   | 必須  |RWO   |ocs-storagecluster-ceph-rbd|
|アクティブログ   |オプション(*1)   |RWO   |ocs-storagecluster-ceph-rbd|
|アーカイブログ   |オプション(*1)   |RWO    |ocs-storagecluster-ceph-rbd|
|一時表スペース  | オプション(*2)  |RWO   |ocs-storagecluster-ceph-rbd|
|バックアップ   |オプション(*2)   | RWX   |ocs-storagecluster-cephfs |

　(*1) 専用PVCを作らない場合、DATAのPVCに保持される
　(*2) 専用PVCを作らない場合、SHARED METAのPVCに保持される

前提条件についてはDb2マニュアルやDb2 Operator Readmeに記載がありますが、記載されるバージョンは古く、それほど高頻度に更新されているわけではないようです。

参考：
[Deploying Db2 on your OpenShift cluster](https://www.ibm.com/docs/en/db2/11.5?topic=db2-deploying)
[Configuring database storage for Db2](https://www.ibm.com/docs/en/db2/11.5?topic=db2-configuring-database-storage)


## 導入手順(概要)

オンプレミスで使われるDb2インストールイメージ(db2setupやdb2_install)の利用は、OpenShift / Kubernetes 環境ではサポートされず、マイクロサービスとして実装される、[Db2 for Red Hat OpenShift and Kubernetes(Db2U)(※)](https://www.ibm.com/docs/en/db2/11.5?topic=deployments-db2-rhos-k8s) を利用する必要があります。
　※ つい最近まで、Db2 on Red Hat OpenShift という名前でした。

以下の流れでデプロイを進めます。

1. OpenShift プロジェクト作成
2. Db2 Operator導入
3. Security Context Constraint 設定
4. Db2 エンジン導入



## 導入手順 (ログ)
IBM ROKS環境へ Db2U を導入した際の手順、スクリーンショットを記録として残します。

### Step1. プロジェクト作成
Db2デプロイ用のネームスペースを作成します。

```
root@myhost:~# oc new-project db2u-1
Now using project "db2u-1" on server "https://c115-e.jp-tok.containers.cloud.ibm.com:30769".

You can add applications to this project with the 'new-app' command. For example, try:

    oc new-app rails-postgresql-example

to build a new example application in Ruby. Or use kubectl to deploy a simple Kubernetes application:

    kubectl create deployment hello-node --image=k8s.gcr.io/serve_hostname

root@myhost:~#
```

### Step2. Db2 Operator導入

#### Step2-1. IBM Operator Catalog 導入

IBM Operator CatalogをOCP環境に導入します。
[Db2マニュアル](https://www.ibm.com/docs/en/db2/11.5?topic=operator-installing-from-catalog)に提供されるYaml定義を利用して、IBM Operator Catalog の CatalogSourceリソースを作成します。

```yaml: (IBM Operator Catalog)
apiVersion: operators.coreos.com/v1alpha1
kind: CatalogSource
metadata:
  name: ibm-operator-catalog
  namespace: openshift-marketplace
spec:
  displayName: "IBM Operator Catalog" 
  publisher: IBM
  sourceType: grpc
  image: icr.io/cpopen/ibm-operator-catalog
  updateStrategy:
    registryPoll:
      interval: 45m
```

OpenShift Webコンソール上で「＋」を押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/1af3946a-9c2a-3685-5cde-ddf11a957baf.png)

YAMLのインポート画面が開くので、エディタ部分に上記Yaml定義を貼付して「作成」を押下します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/aadbbd2f-7df9-94c1-be5e-d438177b1a2f.png)

即時に作成完了し、カタログソースの詳細画面に遷移します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/e28ec15a-6e98-c441-0035-a3be58cde29d.png)

コマンドラインからも、CatalogSource およびパッケージマニフェストが正常に作成されていることを確認します

```
root@myhost:~# oc get CatalogSource -n openshift-marketplace
NAME                   DISPLAY                TYPE   PUBLISHER   AGE
certified-operators    Certified Operators    grpc   Red Hat     10d
community-operators    Community Operators    grpc   Red Hat     10d
ibm-operator-catalog   IBM Operator Catalog   grpc   IBM         73s
redhat-marketplace     Red Hat Marketplace    grpc   Red Hat     10d
redhat-operators       Red Hat Operators      grpc   Red Hat     10d
root@myhost:~#
```

"ibm-operator-catalog" が作成されていることが確認されます



#### Step2-2. Db2 Operator 導入

OpenShift Webコンソールを開き、メニューバーの [Operator] -> [OperatorHub] を選択します。
画面上部のテキストボックスに「Db2」と入力すると、Db2関連のオペレータに表示が絞られます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/10ad3756-58d9-6ad8-0dab-5917948dd01a.png)

「IBM Db2」を選択すると、Db2U Operator Readmeが表示されます。
Db2U Opearator 導入後～Db2エンジンのDeployまでに実行する必要のある作業や前提条件が記載されていますので必ず目を通します。
※ Operatorインストール後も同じReadmeを参照可能です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/93f5f900-7b14-9833-e21e-e79d7b5711f3.png)

Operator Readme 画面左上の「インストール」を押下し、Db2U Operator を導入します。
インストールモード、インストール対象となるNamespaceなど必要な項目を選択し、「インストール」を押下するとDb2U Operatorの導入が始まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/ac76882d-f840-d7cf-d333-445232954435.png)


「更新の承認」を「手動」にしている場合は、承認が要求されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/defe4c22-ad9b-7889-1c2e-6c3a1dfc364d.png)

数分もかからず完了します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/2e4402cf-1ff4-cfda-8596-f7b581883045.png)

「Operatorの表示」を押下すると、Db2U Operator の詳細画面に遷移します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/b09951dc-9c1e-4fdc-2e43-32984ad5f734.png)

これでDb2U Operatorのセットアップが完了しました。

### Step3. セキュリティ構成

#### Step3-1. Secret 構成
後のDb2U Cluster(Db2インスタンス本体)の導入時に必要となる Entitlement key を取得し、この key を含む Secret を作成しておきます。 
Db2U Cluster導入時には、この Entitlement key を保持する Secret の名前を指定します。

##### ①Entitlement key の取得
MyIBM のサイトにアクセスし、ライセンスが付与されているソフトウェアに関連付けられた IBMid とパスワードを入力しログインします。
https://myibm.ibm.com/products-services/containerlibrary

「Container software library」ページに表示されるライセンスを確認します。
この例では「IBM SOFTWARE ACCESS 1 YEAR : all」と表示されています。(※この画面の表示は一例です)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/a3985c6f-b3e2-e984-b817-384cb1db9637.png)


続いて「Entitlement keys」に移動してキーを取得します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/e31e5c83-3e6e-bbeb-2996-cd81a4e17b2c.png)

[Copy key]ボタンを押下し、Entitlement key をコピーします(→後ほど利用するため、テキストファイル等に一時保管しておく)



##### ②Image Pull Secret の作成
①で取得したENTITLEDKEY、 EMAILアドレス、プロジェクト(ネームスペース)名を環境に応じて設定し、oc create secret コマンドを実行します。


OS環境変数の設定：
```
root@myhost:~# ENTITLEDKEY="①で取得したEntitlement key"
root@myhost:~# EMAIL="xxx@yyy.com"
root@myhost:~# NAMESPACE="db2u-1"
```


Secret作成：
```
root@myhost:~# oc create secret docker-registry ibm-registry   \
      --docker-server=cp.icr.io                   \
      --docker-username=cp                        \
      --docker-password=${ENTITLEDKEY}            \
      --docker-email=${EMAIL}                     \
      --namespace=${NAMESPACE}
secret/ibm-registry created
```

Secretが作成されました
```
root@myhost:~# oc get secret | grep ibm-registry
ibm-registry               kubernetes.io/dockerconfigjson        1      97s
root@myhost:~#
```

#### Step3-2. Security Context Constraints 構成

[Db2マニュアル](https://www.ibm.com/docs/en/db2/11.5?topic=db2-deploying) または Db2 Operator Readme に記載されるyaml定義をコピー＆ペーストし、SecurityContextConstraints定義を作成します。

※マニュアルとDb2U Operator Readmeに記載されるSecurity Context Constraintsのyaml文は同一です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/c8bfc1f5-b9d4-9015-10c2-f3e0c43f59e9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/f98506bc-0c3c-1c8d-90e6-c1dc9dcd38c8.png)

しかし、ここでエラー。
エラーメッセージ：

:::note alert
エラーが発生しました
サーバーにはリソースタイプ「kind: SecurityContextConstraints, apiVersion: v1」がありません。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/197cb05c-e096-749f-a8cd-e07787fc055e.png)

こういった場合、コマンドラインで実行するほうが詳細なエラーメッセージが得られるため、クライアント端末から同じYamlファイルを指定してSCCを作成してみます。

```
root@myhost:~/db2u# oc create -f ./db2u-scc.yaml
W0209 18:47:15.366217     585 shim_kubectl.go:55] Using non-groupfied API resources is deprecated and will be removed in a future release, update apiVersion to "security.openshift.io/v1" for your resource
securitycontextconstraints.security.openshift.io/db2u-scc created
root@myhost:~/db2u#
```

コマンドラインであれば、作成できるようです。
しかし非推奨(将来削除される可能性)であると警告されています。
現在、`apiVersion: v1` となっている箇所を `apiVersion: security.openshift.io/v1`　へ変更する必要があると。
こういった対応については、Db2の開発部門に拾っていただきたいです。
　※2024.02のマニュアル更新にて修正されました。

db2u-sccが作成されていることを、確認します
```
root@myhost:~/db2u# oc get scc | grep db2u
db2u-scc                     true    ["SYS_RESOURCE","IPC_OWNER","SYS_NICE","CHOWN","DAC_OVERRIDE","FSETID","FOWNER","SETGID","SETUID","SETFCAP","SETPCAP","SYS_CHROOT","KILL","AUDIT_WRITE"]   MustRunAs   RunAsAny           RunAsAny    RunAsAny    10           false            ["awsElasticBlockStore","azureDisk","azureFile","cephFS","cinder","configMap","csi","downwardAPI","emptyDir","ephemeral","fc","flexVolume","flocker","gcePersistentDisk","gitRepo","glusterfs","iscsi","nfs","persistentVolumeClaim","photonPersistentDisk","portworxVolume","projected","quobyte","rbd","scaleIO","secret","storageOS","vsphere"]

```

今回はひとまず作成できたので、先に進みます。


### Step4. Db2エンジンのDeploy
Db2エンジンのデプロイは、OCP Webコンソールでもコマンドラインでも実行可能です。

 * OCP Webコンソール
     * フォームビューとYamlビューが提供され、GUI/YamlベースどちらでもDeploy可
     * 入力必須項目はほとんどフォームビュー(Dropdownメニュー、Textbox)で設定可能
 * コマンドライン
     * Yamlファイルを作成
     * oc apply(create)コマンドでDeploy

今回はWebコンソールからデプロイします。
構成図の通り、パフォーマンス向上を目指して用途別にPersistent Volume Claimを分けた構成とします。
こういったユースケースごとのYamlサンプルは[Db2マニュアル](https://www.ibm.com/docs/en/db2/11.5?topic=db2-deploying-using-db2ucluster-cr)に豊富に提供されているので、フォームビューで基本構成を行った後、最後に変更したい部分のYamlサンプルをマニュアルから引用し、組み合わせて活用します。


##### Step4-1. フォームビューでの編集 (基本構成)

変更箇所：

 * 名前：db2ucluster-1
 * Account > Image Pull Secrets
     * Step2-2で作成したsecret「ibm-registry」をドロップダウンリストから選択
 * License > License
     * Acceptにチェック
 * Environment
     * Database
         * Name : sampledb 
             * 任意に指定可、デフォルトは「BLUDB」
         * Setting
             * Codeset : UTF-8
             * Collation：IDENTITY
             * Teritorry : JP
 * Instance
     * Password : (db2inst1ユーザのパスワードを任意に指定)
 
※ ストレージ関連は一括でYamlを書き換えるため、ここでは編集しません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/623cc606-5382-4759-ecb3-2e2a17291b02.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/23717fbb-2ddf-79a9-6ea3-1fd299661cc2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/058aab9a-0f24-b625-92a0-f9ae622fd8c5.png)



##### Step4-2. Yamlビューでの編集 (PV構成のカスタマイズ)

Yamlビューに切り替えます。
フォームビューでの入力内容が反映されていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/1d0386d7-f3ab-2b47-6e35-b81df05f6c0d.png)


ストレージ定義については、初期状態ではshareという名前の単一のストレージ定義が記述された状態です。(全て1つのPVにて保管)
この部分を削除し、Db2マニュアル(①、②)から、Storage定義部分をCopy＆Pasteします。

①[Deploying Db2 using the Db2uCluster custom resource](https://www.ibm.com/docs/en/db2/11.5?topic=db2-deploying-using-db2ucluster-cr)
②[Creating archive log storage for a new deployment of Db2 on OpenShift](https://www.ibm.com/docs/en/db2/11.5?topic=logs-new-deployments)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/9c0bd035-7102-2aba-15d8-d0be2a8bf5c2.png)



```yaml: (Db2マニュアル①抜粋)
  storage:
  - name: meta
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      storageClassName: ocs-storagecluster-cephfs
    type: create
  - name: data
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      storageClassName: ocs-storagecluster-ceph-rbd
    type: template
  - name: backup
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 1Gi
      storageClassName: ocs-storagecluster-cephfs
    type: create
  - name: activelogs
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      storageClassName: ocs-storagecluster-ceph-rbd
    type: template
  - name: tempts
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      storageClassName: ocs-storagecluster-ceph-rbd
    type: template
```
```yaml: (Db2マニュアル②抜粋）

    - name: archivelogs
      type: "template"
      spec:
        storageClassName: "ocs-storagecluster-ceph-rbd"
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 10Gi
```

(ストレージ定義部分の編集後)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/951a1cf0-6939-bb92-b82a-75b21191a017.png)


Yamlの編集が終わったら、このままデプロイに進みます。

【補足】
再度同じ構成でデプロイを行う場合は、デプロイ前にYamlビューにて、Yaml全文をテキストファイルに保管しておくと便利です。


##### Step4-3. デプロイ(作成)
「作成」ボタンを押して、デプロイを開始します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/49e98d46-976d-25bf-76c0-5db4c06c8fa9.png)

##### Step4-4. デプロイの進行状況確認

デプロイ中、Webコンソール上、ステータスは「NotReady」、最終更新は「進行中」と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/ca724d07-fbea-dcee-db5b-608f7881a5d2.png)

デプロイ完了後は、ステータス「Ready」に変わり、最終更新は、デプロイ開始時刻のタイムスタンプが入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/4c22c4a7-22b2-8466-8669-857e2a276742.png)

コマンドラインでは、より詳細な状況が把握できます。
oc get pod(または oc get allなど)にて確認し、以下の状態になっていればDeploy完了です。

| Pod名 | ステータス | 備考 |
|:-|:-|:-|
|c-db2ucluster-1-db2u-0   |Running   |Db2エンジンのPod<br> * db2syscが稼働   |
|c-db2ucluster-1-restore-morph-49ldd   |Completed   |Db2セットアップの最後の処理(Restore)を行うJobに属するPod |


```
root@myhost:~/db2u# date ; oc get all -o wide
2023年  2月 10日 金曜日 00:13:18 JST
NAME                                         READY   STATUS      RESTARTS   AGE     IP              NODE          NOMINATED NODE   READINESS GATES
pod/c-db2ucluster-1-db2u-0                   1/1     Running     0          3h38m   172.17.9.104    10.244.64.4   <none>           <none>
pod/c-db2ucluster-1-etcd-0                   1/1     Running     0          3h40m   172.17.9.93     10.244.64.4   <none>           <none>
pod/c-db2ucluster-1-instdb-7p5gt             0/1     Completed   0          3h40m   172.17.9.127    10.244.64.4   <none>           <none>
pod/c-db2ucluster-1-ldap-6f4bf4c865-btdnm    1/1     Running     0          3h40m   172.17.12.83    10.244.64.6   <none>           <none>
pod/c-db2ucluster-1-restore-morph-49ldd      0/1     Completed   0          3h36m   172.17.9.101    10.244.64.4   <none>           <none>
pod/db2u-operator-manager-74c8746449-ncplx   1/1     Running     0          6d12h   172.17.43.154   10.244.64.5   <none>           <none>

NAME                                         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)
                                                  AGE     SELECTOR
service/c-db2ucluster-1-db2u                 ClusterIP   172.21.117.217   <none>        50000/TCP,50001/TCP,25000/TCP,25001/TCP,25002/TCP,25003/TCP,25004/TCP,25005/TCP   3h38m   app=db2ucluster-1,component=db2oltp,formation_id=db2ucluster-1,role=db,type=engine
service/c-db2ucluster-1-db2u-engn-svc        NodePort    172.21.69.35     <none>        50000:30408/TCP,50001:32635/TCP                                                   3h40m   app=db2ucluster-1,component=db2oltp,formation_id=db2ucluster-1,role=db,type=engine
service/c-db2ucluster-1-db2u-head-engn-svc   NodePort    172.21.167.203   <none>        50000:30899/TCP,50001:32537/TCP                                                   3h40m   app=db2ucluster-1,component=db2oltp,formation_id=db2ucluster-1,name=dashmpp-head-0,role=db,type=engine
service/c-db2ucluster-1-db2u-internal        ClusterIP   None             <none>        50000/TCP,9443/TCP,50052/TCP                                                      3h38m   app=db2ucluster-1,component=db2oltp,formation_id=db2ucluster-1,role=db,type=engine
service/c-db2ucluster-1-etcd                 ClusterIP   None             <none>        2379/TCP,2380/TCP
                                                  3h40m   app=db2ucluster-1,component=etcd,formation_id=db2ucluster-1
service/c-db2ucluster-1-ldap                 ClusterIP   172.21.33.121    <none>        50389/TCP
                                                  3h40m   app=db2ucluster-1,formation_id=db2ucluster-1,role=ldap

NAME                                    READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES
                                                                                       SELECTOR
deployment.apps/c-db2ucluster-1-ldap    1/1     1            1           3h40m   ldap         icr.io/cpopen/db2u/db2u.auxiliary.auth@sha256:1da3c40ae5e5328215b86f425fd263ea11638d7e56956e293bcfa35c5384cfc5   app=db2ucluster-1,formation_id=db2ucluster-1,role=ldap
deployment.apps/db2u-operator-manager   1/1     1            1           6d12h   manager      icr.io/cpopen/db2u-operator@sha256:6305999c13c6fb507e7068b0c950d12c2ff0eed8a90a30c1ae2612158cb994a5              control-plane=db2u-operator-manager

NAME                                               DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES
                                                                                             SELECTOR
repicaset.apps/c-db2ucluster-1-ldap-6f4bf4c865    1         1         1       3h40m   ldap         icr.io/cpopen/db2u/db2u.auxiliary.auth@sha256:1da3c40ae5e5328215b86f425fd263ea11638d7e56956e293bcfa35c5384cfc5   app=db2ucluster-1,formation_id=db2ucluster-1,pod-template-hash=6f4bf4c865,role=ldap
replicaset.apps/db2u-operator-manager-74c8746449   1         1         1       6d12h   manager      icr.io/cpopen/db2u-operator@sha256:6305999c13c6fb507e7068b0c950d12c2ff0eed8a90a30c1ae2612158cb994a5              control-plane=db2u-operator-manager,pod-template-hash=74c8746449

NAME                                    READY   AGE     CONTAINERS   IMAGES
statefulset.apps/c-db2ucluster-1-db2u   1/1     3h38m   db2u         icr.io/cpopen/db2u/db2u@sha256:2e6129927b61bc55998ba831b32ab54cc7306e915d3c752e1bedafee43082607
statefulset.apps/c-db2ucluster-1-etcd   1/1     3h40m   etcd         icr.io/cpopen/db2u/etcd@sha256:0a7a192ca4353203f26cf85ec55466b08c9fd0290370322e179769b596bdf55a

NAME                                      COMPLETIONS   DURATION   AGE     CONTAINERS      IMAGES
                                                                            SELECTOR
job.batch/c-db2ucluster-1-instdb          1/1           77s        3h40m   instdb          icr.io/cpopen/db2u/db2u.instdb@sha256:5a184681eef834f7b57a3aa951598e834b868347ae1df314435caf6205204755   controller-uid=e95ef428-708f-4b6b-b1bd-290002e8c7d1
job.batch/c-db2ucluster-1-restore-morph   1/1           11m        3h36m   restore-morph   icr.io/cpopen/db2u/db2u.tools@sha256:a824d2ed5e8e5afc4230e3e6e7070cc767b4b971524b16870cf3cf4226eea3ff    controller-uid=8e602de3-6ee5-41ee-a54d-9f1a01bc6cf5
root@myhost:~/db2u#
```



## おわりに
Db2 for Red Hat OpenShift and Kubernetes(Db2U)は、大きな視点でも小さな点でも進化を重ねていると感じます。

 1. OpenShiftだけでなく、EKSやAKSなど、Kubernetesもサポート対象に追加される
     * [What's changed in Db2 11.5.8](https://www.ibm.com/docs/en/db2/11.5?topic=changed-1158)
 2. ストレージの分散配置ができる（今回試したこと）
     * Yamlに数行記述するだけで、性能を考慮した分散ストレージ構成が簡単に組める
 3. ストレージレイヤーと連携したバックアップ取得のサポート
     * [Velero Backup and Restore](https://www.ibm.com/docs/en/db2/11.5?topic=db2-velero-backup-restore)
 4. Webコンソール操作画面の改良
     * これまで数分間隔で画面リセットが行われ入力内容が消えてしまっていたが、コンソールからのログアウトまで編集内容が維持されるようになった
     * フォームビューにおける編集箇所は色が変わり、編集漏れがあっても気づきやすい(※Yamlビューに一度消えるとリセットされます)

など。

個人として一番うれしいのは、非機能要件きわまりないですが、4番です！
地味すぎる、でもこういった地味な改善も地味に大事で、小さな不便が見落とされず改善されているのはいいですね。



## 補足

### (1) Db2エンジンDeploy用Yaml  --- サンプルとして
今回、ストレージ分散構成でDb2Uデプロイした時のYamlはこちら。

```yaml: Db2uCluster Deploy に利用したYaml
apiVersion: db2u.databases.ibm.com/v1
kind: Db2uCluster
metadata:
  name: db2ucluster-1
  labels:
    app.kubernetes.io/instance: db2u-operator
    app.kubernetes.io/managed-by: Db2U-Team
    app.kubernetes.io/name: db2u-operator
  namespace: db2u-1
spec:
  license:
    accept: true
  account:
    imagePullSecrets:
      - ibm-registry
    privileged: true
  environment:
    database:
      settings:
        territory: JP
        codeset: UTF-8
        collation: IDENTITY
      name: sampledb
    instance:
      password: cicdtest
    dbType: db2oltp
  version: s11.5.8.0
  storage:
    - name: meta
      type: create
      spec:
        accessModes:
          - ReadWriteMany
        resources:
          requests:
            storage: 10Gi
        storageClassName: ocs-storagecluster-cephfs
    - name: data
      type: template
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 10Gi
        storageClassName: ocs-storagecluster-ceph-rbd
    - name: backup
      type: create
      spec:
        accessModes:
          - ReadWriteMany
        resources:
          requests:
            storage: 1Gi
        storageClassName: ocs-storagecluster-cephfs
    - name: activelogs
      type: template
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 10Gi
        storageClassName: ocs-storagecluster-ceph-rbd
    - name: tempts
      type: template
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 10Gi
        storageClassName: ocs-storagecluster-ceph-rbd
  size: 1

```

### (2) Deploy完了時のpsコマンド出力

```
[db2inst1@c-db2ucluster-1-db2u-0 - Db2U logs]$ ps auxwww
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
db2uadm       1  0.0  0.0  14856  3216 ?        Ss   Feb09   0:00 /bin/sh -x /etc/runit/entrypoint.sh
db2uadm       7  0.0  0.0   4412   944 ?        S    Feb09   0:01 runsvdir -P /etc/service log: ........................................................................................................................................................................................................................................................................................................+ exec ............................................................................................
db2uadm       8  0.0  0.0   4260   948 ?        Ss   Feb09   0:00 runsv sshd
db2uadm       9  0.0  0.0   4260   852 ?        Ss   Feb09   0:00 runsv db2u
db2uadm      10  0.0  0.0   4260   848 ?        Ss   Feb09   0:00 runsv db2uapi
db2uadm      11  0.0  0.0   4260   956 ?        Ss   Feb09   0:00 runsv wolverine
db2uadm      12  2.2  0.0 2232544 55180 ?       Sl   Feb09  31:34 db2u-apiserver --type control
db2uadm      13  0.0  0.0  25996  1440 ?        S    Feb09   0:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep infinity
db2uadm      14  0.0  0.0   4404   860 ?        S    Feb09   0:00 svlogd -tt ./main
db2uadm      15  0.0  0.0   4404   936 ?        S    Feb09   0:03 svlogd -tt ./main
db2uadm      16  0.0  0.0  14856  3356 ?        S    Feb09   0:00 /bin/sh -e ./run
root        219  0.0  0.0 112976  7364 ?        S    Feb09   0:00 sudo -E /usr/sbin/sshd -D -p 50022 -e
root        225  0.0  0.0  76624  7660 ?        S    Feb09   0:03 /usr/sbin/sshd -D -p 50022 -e
db2uadm     460  0.0  0.0   4260   936 ?        Ss   Feb09   0:00 runsv sssd
db2uadm     462  0.0  0.0  14856  3180 ?        S    Feb09   0:00 /bin/sh -e ./run
root        463  0.0  0.0 123316  7348 ?        S    Feb09   0:00 sudo -E /usr/sbin/sssd -i --logger=files
root        464  0.0  0.0 174020 11468 ?        S    Feb09   0:00 /usr/sbin/sssd -i --logger=files
root       2291  0.0  0.0 181844 12944 ?        S    Feb09   0:00 /usr/libexec/sssd/sssd_be --domain implicit_files --uid 0 --gid 0 --logger=files
root       2292  0.0  0.0 206828 16168 ?        S    Feb09   0:01 /usr/libexec/sssd/sssd_be --domain local --uid 0 --gid 0 --logger=files
root       2293  0.0  0.0 200824 45100 ?        S    Feb09   0:08 /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 --logger=files
root       2294  0.0  0.0 173268 10624 ?        S    Feb09   0:10 /usr/libexec/sssd/sssd_pam --uid 0 --gid 0 --logger=files
db2uadm    5399  0.0  0.0  15120  3864 pts/0    Ss   05:16   0:00 /bin/bash
root       5745  0.0  0.0 135372  6012 pts/0    S    05:17   0:00 su - db2inst1
db2inst1   5746  0.0  0.0  17132  4112 pts/0    S    05:17   0:00 -ksh
db2inst1   6657  0.0  0.0 193300 32788 pts/0    S    05:17   0:00 /mnt/blumeta0/home/db2inst1/sqllib/bin/db2bp 5746A500 5 A
root      21850  0.0  0.3 1304584 207400 ?      Sl   Feb09   0:00 db2wdog 0 [db2inst1]
db2inst1  21852  0.4  4.3 7511048 2856608 ?     Sl   Feb09   5:49 db2sysc 0
root      21866  0.0  0.2 1309176 163024 ?      S    Feb09   0:21 db2ckpwd 0
root      21867  0.0  0.2 1309176 163024 ?      S    Feb09   0:21 db2ckpwd 0
root      21868  0.0  0.2 1309176 163024 ?      S    Feb09   0:21 db2ckpwd 0
db2inst1  21870  0.0  0.1 682036 70780 ?        S    Feb09   0:00 db2vend (PD Vendor Process - 1) 0
db2inst1  21880  0.0  0.1 1647696 76652 ?       Sl   Feb09   0:25 db2acd 0 ,0,0,0,1,0,0,00000000,0,0,0000000000000000,0000000000000000,00000000,00000000,00000000,00000000,00000000,00000000,0000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000ccccc000,0000000000000000,0000000000000000,1,0,0,,,,,a89f30,14,1e014,2,0,1,0000000000041fc0,0x240000000,0x240000000,1600000,8023,2,40006
root      21959  0.0  0.0 135368  6096 ?        S    Feb09   0:00 su - db2uhausr -l --session-command=/db2uhausr/service/wolverine/run
db2uhau+  22316  0.0  0.0  13388  3736 ?        S    Feb09   0:00 /bin/bash -x /db2uhausr/service/wolverine/run
db2uhau+  22415  0.6  0.1 351224 118092 ?       S    Feb09   9:15 /usr/bin/python3 -m wolverine.ha.service --bootstrap --nodesfile /mnt/blumeta0/nodeslist --pid-file /db2u/tmp/ha.pid
db2fenc1  27129  0.0  0.0 1246668 58272 ?       Sl   Feb09   0:00 db2fmp ( ,1,0,0,0,0,0,00000000,0,0,0000000000000000,0000000000000000,00000000,00000000,00000000,00000000,00000000,00000000,0000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000ccccc000,0000000000000000,0000000000000000,1,0,0,,,,,a89f30,14,1e014,2,0,1,0000000000061fc0,0x240000000,0x240000000,1600000,8023,2,48034
db2inst1 337186  0.0  0.0  47620  3816 pts/0    R+   10:58   0:00 ps auxwww
[db2inst1@c-db2ucluster-1-db2u-0 - Db2U logs]$
```

### (3) 分散storage構成における、Db2 Pod内部のディレクトリ構成


| PVC | ディレクトリ名 | 用途 |
|:-|:-|:-|
|SHARED META   | /mnt/blumeta0  | ・ Db2インスタンスホーム<br> ・ DBディレクトリ<br> ・ 自動ストレージパス<br> ・ db2diag.log<br> ・ ssh関連ファイル  |
|DATA   | /mnt/bludata0  | ・ 外部表ファイル配置用ディレクトリ   |
|アクティブログ   | /mnt/logs/active  |   |
|アーカイブログ   | /mnt/logs/archive  |   |
|一時表スペース   | /mnt/tempts  | ・ TEMPSPACE1<br> ・ USERTEMPSPACE1  |
|バックアップ   | /mnt/backup  |   |



| PVC | ディレクトリ | ファイルシステム | 
|:-|:-|:-|
|SHARED META   |/mnt/blumeta0   |172.21.46.103:6789,172.21.215.255:6789,172.21.101.114:6789:/volumes/csi/csi-vol-e0726770-a86d-11ed-9726-da8f822b615d/702ffc43-c9ff-4fea-9dd7-aec5400698c5   |
|DATA   |/mnt/bludata0   | /dev/rbd0 |
|アクティブログ   |/mnt/logs/active   | tmpfs|
|アーカイブログ   |/mnt/logs/archive   | tmpfs  |
|一時表スペース   |/mnt/tempts   | /dev/rbd1  |
|バックアップ  |/mnt/backup   | 172.21.46.103:6789,172.21.215.255:6789,172.21.101.114:6789:/volumes/csi/csi-vol-e0726336-a86d-11ed-9726-da8f822b615d/e91d21bf-42f2-438a-9e1a-58f48fae7e5e  |

```
[db2inst1@c-db2ucluster-1-db2u-0 - Db2U logs]$ df -m
Filesystem
                                  1M-blocks  Used Available Use% Mounted on
overlay
                                      99747 36805     57858  39% /
tmpfs
                                         64     0        64   0% /dev
tmpfs
                                      32201     0     32201   0% /sys/fs/cgroup
/dev/vda2
                                      99747 36805     57858  39% /etc/hostname
/dev/vda2
                                      99747 36805     57858  39% /etc/hosts
tmpfs
                                        200     1       200   1% /run
172.21.46.103:6789,172.21.215.255:6789,172.21.101.114:6789:/volumes/csi/csi-vol-e0726770-a86d-11ed-9726-da8f822b615d/702ffc43-c9ff-4fea-9dd7-aec5400698c5     10240   728      9512   8% /mnt/blumeta0
/dev/rbd0
                                       9980   549      9416   6% /mnt/bludata0
/dev/rbd1
                                       9980     1      9964   1% /mnt/tempts
tmpfs
                                       4096     1      4096   1% /secrets/db2instancepwd
tmpfs
                                       1024     1      1024   1% /dev/shm
172.21.46.103:6789,172.21.215.255:6789,172.21.101.114:6789:/volumes/csi/csi-vol-e0726336-a86d-11ed-9726-da8f822b615d/e91d21bf-42f2-438a-9e1a-58f48fae7e5e      1024     0      1024   0% /mnt/backup
tmpfs
                                       4096     1      4096   1% /db2u/license
/dev/rbd3
                                       9980   236      9729   3% /mnt/logs/archive
tmpfs
                                       4096     1      4096   1% /secrets/sshkeys/db2instusr
tmpfs
                                       4096     1      4096   1% /secrets/sshkeys/db2uadm
tmpfs
                                       4096     1      4096   1% /secrets/sshkeys/db2uhausr
tmpfs
                                       4096     1      4096   1% /secrets/certs/db2u-api
/dev/rbd2
                                       9980   255      9710   3% /mnt/logs/active
tmpfs
                                       4096     1      4096   1% /secrets/certs/wv-rest
tmpfs
                                       4096     1      4096   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs
                                      32201     0     32201   0% /proc/acpi
tmpfs
                                      32201     0     32201   0% /proc/scsi
tmpfs
                                      32201     0     32201   0% /sys/firmware
```

### (4) Db2デプロイ方法（Webコンソール VS コマンドライン)

フォームビューではPVのサイズ等一部編集機能が提供されない設定項目があるため、Yamlビューも必要に応じて活用しつつ、Deployします。

それならいっそ、Yamlファイル+コマンドラインを利用してDeployすればという気持ちになりますが、Db2Uデプロイ用Yamlのひな型を入手するのは難しいです。
[Db2マニュアル](https://www.ibm.com/docs/en/db2/11.5?topic=db2-deploying-using-db2ucluster-cr)やDb2U Operator Readme にYamlサンプルは提供されていますが、バージョン(Fixレベル)によって使えずエラーでDeployが失敗することがあります。

その点、OpenShiftのWebコンソールでデプロイすると、ベースのYaml定義がバージョンに適合した内容で生成されるため、バージョン整合性の問題は確実に回避できます。

[](Db2UOperatorの最新版リリース直後など、マニュアル記述との整合が取れていないのか、マニュアルに従ってもうまくDeployできないことがあります。)