Db2 on OpenShift 11.5.6.0-cn3 導入手順  =ODF(OCS)ストレージ利用構成=

## Db2 on OpenShift (Db2U) とは

Db2 on OpenShift は、マイクロサービスアーキテクチャに基づいて設計され、コンテナとして提供されるDb2ランタイムです。Kubernetesをベースとするコンテナ・プラットフォームである Red Hat OpenShift クラスタ上で、Db2をマイクロサービス(Pod)として稼働させることができます。
別名として、Db2U(Db2 Universal Container) と呼ばれることもあります。

通常のオンプレ環境では、ユーザーがDb2バイナリをインストール→Db2インスタンス作成→データベース作成、といった流れで環境構築を行いますが、Db2 on OpenShift の場合は、OpenShift環境用に提供されるDb2uClusterというカスタムリソースをoc(kubectl)コマンド1つでデプロイすることで、Db2データベース作成までの構成作業がバックエンドで、自動で行われます。
Db2データベース名など環境ごとの設定情報は、事前にYamlファイルに定義しておくことができます。

#### 【補足：Db2 on OpenShift と Docker版Db2との違い】

Db2には、Docker版もあります。(正式名称：[Db2 Community Edition for Docker](https://www.ibm.com/docs/en/db2/11.5?topic=deployments-db2-community-edition-docker))
[DockerHub](https://hub.docker.com/r/ibmcom/db2) に配置されていて誰でも無償で利用できます。

Docker版も、この記事で扱う Db2 on OpenShift も、大きくくくればどちらも「コンテナ化されたDb2」です。
どちらかといえば、Dockerランタイムさえあれば利用可能なDocker版のほうが身近でお手軽です。
しかし、Docker版はライセンスを適用することが許可されず商用利用は実質出来ないため、お客さま環境のコンテナ化を目指す上では Db2 on OpenShift が適しています。

Docker版と、OpenShift版には大きく以下のような違いがあります。

| 比較項目 | Docker版Db2 | Db2 on OpenShift (Db2U) |
|:-|:-|:-|
|商用利用   |不可   |可   |
|Db2エンジンのバージョン   |オンプレ版Db2と一致   |オンプレ版Db2と基本的に同じ<br>cn-x というマイナーリリースアップが随時行われる   |
|作成可能なDBの数   |1つ   |複数(最大 8)   |
|初期セットアップ方法   |docker pull/docker runコマンド   | oc createコマンド(+yamlファイル)  |
|コンテナ障害時のデータの復元   |バックアップがあれば復元可能  | データ/ログがPV上に存在するため、コンテナ(Pod)が再起動出来れば障害発生時点に戻れる  |


## Db2 on OpenShift 11.5.6 新機能
* 複数データベース構成のサポート
    * これまで単一インスタンス / 単一データベース構成のみサポートされていましたが、<br>V11.5.6から、単一インスタンス / 複数データベース(最大8) の構成がサポートされるようになりました。
* IBM Common Services のサポート
* HADR マルチスタンバイ構成のサポート
* Db2 11.5.6.0-cn3 新機能：一時表スペース用に別のストレージ領域を指定可能
    * I/O のボトルネックを低減し、パフォーマンス向上の効果が期待されます
* Db2 11.5.6.0-cn1/2/5 はいずれも、不具合の修正のみ行われる修正版の位置づけとなります。

Db2 11.5.6.0-cn3 では label など定義情報が増えているため、旧バージョン(V11.5.6.0以前)用に作成しておいたYamlファイルを(バージョンストリングだけ変更して)流用することはできません。
Db2の導入/インスタンス作成/DB作成を行うには、OCP Webコンソールからインスタンス作成画面を利用するか、WebコンソールのDb2インスタンス作成画面のYamlビューで表示されるYamlファイルをベースとし、必要な定義情報を追加してoc apply(create)コマンドでデプロイを行います。
この記事では、Webコンソールを利用する手順を備忘録として残します。

随時リリースアップされますので、最新情報は [Db2製品マニュアル](https://www.ibm.com/docs/en/db2/11.5?topic=1156-whats-new-in-db2) を参照ください。

デプロイ済のDb2 on OpenShift 11.5.6 を、より新しいCN リリースにアップグレードするための手順はこちらに記載があります。

 * Db2 製品マニュアル [[Upgrading and updating your Db2 on Red Hat OpenShift cluster](https://www.ibm.com/docs/en/db2/11.5?topic=1156-upgrading-updating)]
 * [Db2 on OpenShift 11.5.6 アップグレード手順](https://qiita.com/mi-kana/items/4d89aad14ee836f2ea17)

## Db2 on OpenShift 11.5.6 前提要件
Db2 on OpenShift 11.5.6 (OLTP) 導入にあたり、以下の要件があります。
(*下記は、Db2製品マニュアル / Db2U Operator Readme から抜粋したものです)

###(1) ハードウェア要件

####Db2U Operator の要件

| Software | CPU(cores) | Memory(GB) |
|:-:|:-:|:-:|
| Db2 Operator  | 500m  | 512Mi  |

####Db2U Operand(Db2本体) の要件

 * 1.7 CPU
 * 2Gi

####最小構成でのDb2デプロイのためのリソース要件

| Software | CPU(cores) | Memory(GB) | Disk(GB) | Nodes |
|:-:|:-:|:-:|:-:|:-:|
| Db2  |0.5   |4Gi   | 100GB | 1 |
| Authentication (ldap)  |1   |1Gi   | | 1 |
| Etcd  |0.5   |512Mi   | |  1 |
| Tools  |0.5   |512Mi   | |  1 |
| **Total**  | 2.5  | 6Gi  |  |  |

#### 利用可能なストレージ

 * NFS
 * Red Hat OpenShift Container Storage 4.5
 * IBM Spectrum Scale CSI 2.1 or greater
 * IBM Cloud File Storage (gold storage class)
 * Portworx 2.5.5 or 2.5.6 or 2.6.2
 * A HostPath PV that is a mounted clustered filesystem
 * IBM® Cloud File Storage (ibmc-file-gold-gid storage class)
 * Traditional storage:
    * NFS
    * IBM Spectrum Scale
    * Local storage

ストレージについての要件は [Db2製品マニュアル](https://www.ibm.com/docs/en/db2/11.5?topic=cds-certified-storage-options)とDb2 Operator Readme(OCP Webコンソール) に記載されますが、バージョンが一致しない箇所もあるため、実際に採用を検討する場合はIBM社に確認を取ったほうが良さそうです。


###(2)その他の要件

* cluster-admin権限を持つOCPユーザ
*  [IBM Cloud](https://cloud.ibm.com/login) のユーザアカウント

[Db2 11.5 マニュアル [Installing Db2 on a Red Hat OpenShift cluster]](
https://www.ibm.com/docs/en/db2/11.5?topic=db2-deploying)

## 導入環境
ここで整理する導入手順では、Db2 on OpenShift の永続ボリュームとして、 Red Hat OpenShift Data Foundation (ODF, 旧名称: OpenShift Container Storage(OCS)) を利用する構成を想定します。

| 項目                    | バージョン         |
|:------------------------|:------------------|
| OS(bastion)             |          Red Hat Enterprise Linux release 8.3 (Ootpa) |
| OS(worker)       |          Red Hat Enterprise Linux CoreOS release 4.8 |
| OCP(Client)             | 4.8.12 |
| OCP(Server)            | 4.8.12             |
| Kubernetes              |  v1.21.1+d8043e1  |
| ODF(OCS)              |  4.8.0  |
| Db2 OLTP               |            11.5.6.0-cn3 |


### 構成
今回は、以下のような構成のOCP環境にDb2をデプロイします。
Db2はStatefulSetとしてデプロイされます。

 - Bastion Node x1
 - Master Node x3
 - Worker Node x3
 - Worker Node(ODF稼働) x3

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/e6fa5157-1e3c-34a6-83e6-ecc2a0fb88a4.png)


#### データ配置：
Db2 on OpenShift のデータとしては以下の内訳があり、いずれも Persistent Volume に保持されます。

 __① メタデータ - System & Backup storage [Shared with RWX]__

 - Db2 instance home directory
 - Diagnostic logs
 - Other global configuration directories
 - Backups, Restore or Load locations


__② ユーザデータ - User storage [Exclusive with RWO]__

 - Database storage paths
 - Transaction logs


※「①メタデータ」のうちBackups用領域を別PVに分け、合計3PV構成とすることも可能

今回は、ODFにデータを保持する構成で、Db2をデプロイします。
ODF(OCS)についてや、Db2 on OpenShift におけるデータの永続性については [過去記事](https://qiita.com/mi-kana/items/1f896f4a0000ec7183e5) に記載していますのでこの記事では割愛します。

Db2 on OpenShift を導入する際には、以下のODFストレージクラスを指定します。

|配置データ種別 |ストレージクラス名 |アクセスモード |
|:-:|:-:|:-:|
|メタデータ(System/backup data)   |ocs-storagecluster-cephfs   |ReadWriteMany (RWX)   |
|ユーザーデータ(User data)   |ocs-storagecluster-ceph-rbd   |ReadWriteOnce (RWO)   |

Db2導入作業を行う時点で、以下のように利用予定のストレージクラスが作成済であることを前提とします。

```
$ oc get sc
NAME                          PROVISIONER                             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
localblock                    kubernetes.io/no-provisioner            Delete          WaitForFirstConsumer   false                  59d
ocs-storagecluster-ceph-rbd   openshift-storage.rbd.csi.ceph.com      Delete          Immediate              true                   59d
ocs-storagecluster-ceph-rgw   openshift-storage.ceph.rook.io/bucket   Delete          Immediate              false                  59d
ocs-storagecluster-cephfs     openshift-storage.cephfs.csi.ceph.com   Delete          Immediate              true                   59d
openshift-storage.noobaa.io   openshift-storage.noobaa.io/obc         Delete          Immediate              false                  59d
```


#### 作業を行うノード / ユーザ

ここから先で実行するコマンドはすべてBastionノードから実行しています。
cluster-admin権限を持つ、ocコマンド実行可能なユーザで作業します。

コマンド操作の実行ノード・実行ユーザについてはご使用の環境に応じて決めてください。
また、ocコマンド実行前には、oc login が必要となります。


## Db2 on OpenShift 導入の流れ

Db2 on OpenShift(Db2U)は、以下の流れで導入します。
このうちDb2 Operatorについては、OpenShift Webコンソールを用いて導入します(※)。他作業はすべてコマンドラインで実施します。
(※)IBM Cloud環境であればCUI導入も可能)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/8fe1b4e3-87fa-fd3d-430c-d3ec3d07095f.png)

## Db2 on OpenShift デプロイ手順

### Step1. プロジェクトの作成

Db2 Operaotor/Db2本体をデプロイするためのプロジェクト(ネームスペース)を作成します。
「db2u-oltp1」プロジェクトを作成します。

```
oc new-project db2u-oltp1
Now using project "db2u-oltp1" on server "https://api.isvsol.jp-ise.com:6443".

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

    oc new-app ruby~https://github.com/sclorg/ruby-ex.git

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

    kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node

```


### Step2. Db2 Operator 導入

Db2 Operator は、OpenShift上にDb2のコンテナ・イメージをデプロイし、稼働させるための自動化ツールとしての役割を果たします。Db2 Operatorにより、OpenShift環境のDb2やHADRの導入・構成が容易に出来るようになっています。
Operatorとは何か、Db2 Operatorで出来ることは何か。については別記事に記載していますのでここでは割愛します。

 * 別記事 → [OpenShift環境へのDb2 Operator導入手順](https://qiita.com/mi-kana/items/c3fb640d671caf624eb8)

Db2 Operator を導入します。

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

IBM Operator Catalogは、openshift-marketplace プロジェクトに導入します。
事前にIBM Operator Catalog が導入済みであるか確認します。
(→導入済みであれば、Step2-1はスキップ可能)

```sh

$ oc get CatalogSource -n openshift-marketplace
NAME                  DISPLAY               TYPE   PUBLISHER   AGE
certified-operators   Certified Operators   grpc   Red Hat     98d
community-operators   Community Operators   grpc   Red Hat     98d
ibm-spp-operator      IBM SPP Operator      grpc   IBM         4h57m
redhat-marketplace    Red Hat Marketplace   grpc   Red Hat     98d
redhat-operators      Red Hat Operators     grpc   Red Hat     98d

```

[製品マニュアル](https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.5.0/com.ibm.db2.luw.db2u_openshift.doc/doc/t_db2u_install_op_catalog.html)に記載されるyaml定義の内容を、「ibm-operator-catalog.yaml」という名称のファイルに保管し、IBM Operator Catalog の CatalogSourceリソースを作成します。

```yaml:ibm-operator-catalog.yaml
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
```

CatalogSourceリソース作成：

```sh

$ oc create -f /work/ibm-operator-catalog.yaml
catalogsource.operators.coreos.com/ibm-operator-catalog created
```


CatalogSource およびパッケージマニフェストが正常に作成されていることを確認します。

```sh

$ oc get CatalogSource -n openshift-marketplace
NAME                   DISPLAY                TYPE   PUBLISHER   AGE
certified-operators    Certified Operators    grpc   Red Hat     98d
community-operators    Community Operators    grpc   Red Hat     98d
ibm-operator-catalog   IBM Operator Catalog   grpc   IBM         72s　　<---追加された
ibm-spp-operator       IBM SPP Operator       grpc   IBM         5h10m
redhat-marketplace     Red Hat Marketplace    grpc   Red Hat     98d
redhat-operators       Red Hat Operators      grpc   Red Hat     98d

```

OCP Webコンソールを開き、メニューバーの [Operators] -> [Operators Hub] を選択します。
ナビゲーションパネル [Provider Type] の下に [IBM Operator Catalog]のオプションが表示され、そこからDb2 Operatorをインストールすることができます。
(多くのOperatorが表示されるため、フィルターで「Db2」などと絞って検索するほうが見つけやすいです)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/9321a173-1609-92f9-36fe-dce3afb57e26.png)


上のOperator一覧の画面で「IBM Db2」を選択すると、Readmeが表示されるため、ここで手順・前提を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/a51ee9e5-4c8d-7db9-8a0a-a64f83683aae.png)


#### Step2-2. セキュリティ設定
後のDb2U Cluster(Db2インスタンス本体)の導入時に必要となる Entitlement key を取得します。


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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/67d96ade-38a4-1b98-53a1-16d4b3018914.png)




続いて「ライセンス・キーの取得 (Get entitlement key)」に移動してキーを取得します。
[Copy key]ボタンを押下し、Entitlement key をコピーします。(→後ほど利用するため、テキストファイル等に一時保管しておく)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/d9a0da54-fe8f-1344-55bb-e38370d4ba4b.png)


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

◆環境変数の設定

```sh

$ ENTITLEDKEY="①で取得したEntitlement key"
$ EMAIL="ｘｘｘ@sample.com"
$ NAMESPACE="db2u-ocs1"
```

◆Secret オブジェクトの作成

```sh

$ 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

```


#### Step2-3. Db2 Operator の導入

OCP Webコンソールにログインし、[Operators] -> [OperatorHub] の画面を開き、[IBM Db2]をクリックします。
(アイコンが多く探しづらい場合、「Db2」とキーワードを入力すると画面の表示対象が絞り込まれます)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/9321a173-1609-92f9-36fe-dce3afb57e26.png)

[インストール」ボタンを押下し、Db2 Operatorインストール画面を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/4753b8f9-2d9f-5ed0-32ba-d3cd5f333240.png)


Step1.で作成したプロジェクト(ネームスペース)名を選択し、
[インストール]を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/4a3059f7-26f4-a906-7f95-ecabf46cc800.png)

※この画面例では、「更新の承認(Approval Policy)」をデフォルトの「自動」から「手動」へ変更しているため、承認が求められます。「承認」を押下すると Operator 導入が開始されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/02eab0da-1ac4-1d99-2532-907756068e8e.png)


数分程度で、Db2 Operator導入は完了します。
"インストールされた Operator - 使用の準備ができています " というメッセージが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/82d4065b-2a6b-627e-8751-234280e4f694.png)


oc get pods コマンドで確認してみると、Db2 Operator Manager のPodは無事、Running状態となっています。

```sh
$ oc get pods -o wide
NAME                                     READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
db2u-operator-manager-7b5dfb5bc7-clgp4   1/1     Running   0          12m   10.129.3.51   worker3   <none>           <none>

```


### Step3. SecurityContextConstraints 定義作成

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

yamlファイル作成：

```yaml:db2u-scc.yaml
kind: SecurityContextConstraints
apiVersion: v1
apiGroup: security.openshift.io
metadata:
    name: db2u-scc
allowHostDirVolumePlugin: false
allowHostIPC: false
allowHostNetwork: false
allowHostPID: false
allowHostPorts: false
# privileged container is only needed for the init container that sets the Db2 kernel parameters
allowPrivilegedContainer: true
allowedCapabilities:
- "SYS_RESOURCE"
- "IPC_OWNER"
- "SYS_NICE"
- "CHOWN"
- "DAC_OVERRIDE"
- "FSETID"
- "FOWNER"
- "SETGID"
- "SETUID"
- "SETFCAP"
- "SETPCAP"
- "SYS_CHROOT"
- "KILL"
- "AUDIT_WRITE"
priority: 10
runAsUser:
    type: RunAsAny
seLinuxContext:
    type: MustRunAs
fsGroup:
    type: RunAsAny
supplementalGroups:
    type: RunAsAny
version: v1
```

SecurityContextConstraints定義作成：

```
 oc create -f ./db2u-scc.yaml
```

### Step4. Db2uCluster(シングル構成Db2本体)の導入

#### Step4-1. デプロイ実施
OCP Webコンソールより、カスタムリソース Db2uCluster のインスタンスを作成します。

OCP Webコンソールから、Db2uCluster インストール画面を開きます。
[Operator] > [インストールされたOperator] > [インスタンスの作成]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/9e222f15-075b-e82d-3d20-837651f2909e.png)

必要に応じて、リリース名を変更します。
デプロイされるDb2エンジンのPod名は、「c-リリース名-db2u-0」となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/99fe141b-48dc-a1c8-a15b-ca8fb0a9c152.png)

「Step2-2.②Image Pull Secret の作成」で作成したSecret名(ibm-registry)を選択し、
ライセンスの受け入れを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/d54a2174-b708-d2bc-5058-c8ff165bfc73.png)

データベースタイプ：db2oltp(デフォルト)を選択し、任意のデータベース名を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/262f83f9-57c5-1e82-fac3-623f95e21496.png)

必要に応じて、コードセット、照合順序、テリトリー(国)を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/9dd2d3fb-fa05-7f53-66b0-01a9a7d6c638.png)

Db2インスタンスオーナーとなるユーザ(デフォルトではdb2inst)のパスワードを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/dddd95ae-7eba-15ab-cbb3-a1bbb29d91c9.png)

今回は、ストレージは下記の2つに分ける想定でデプロイします。

|配置データ種別 |ストレージ名 |ストレージクラス名 |アクセスモード |
|:-|:-|:-|:-|
|メタデータ<br>(System/backup data)   |meta|ocs-storagecluster-cephfs   |ReadWriteMany (RWX)   |
|ユーザーデータ(User data)   |data|ocs-storagecluster-ceph-rbd   |ReadWriteOnce (RWO)   |

それぞれの構成情報を指定します。
いずれも、Typeには [create]を指定します。

 * メタデータ：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/9285f055-fa56-ae6a-a023-08a53c3fba01.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/c05abc39-790c-2c86-93ab-2287d6d64f72.png)

 * ユーザデータ：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/f9117ff0-d2da-da69-0431-e4d6cb84bec6.png)
(中略)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/e579ea8e-4513-971a-0c3c-52cd4022c495.png)

ここでYamlビューに切り替えると、GUI画面で指定した内容がYamlファイルに反映されていることを確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/5f58a7d1-3aaf-0c9a-50a7-099f99fefab5.png)

---

##### 補足：4Kセクターサポート
4Kセクターサイズのストレージを利用する場合には、DB2_4K_DEVICE_SUPPORTレジストリー変数を設定する必要があります。
Yamlビューにて以下のようにレジストリ変数設定を追記します。(一部抜粋)

```yaml
spec:
  (中略)
  environment:
    dbType: db2oltp
    database:
      name: sampledb
    instance:
      registry:
        DB2_4K_DEVICE_SUPPORT: "ON"
```

上記のレジストリー変数が設定されていない状態で 4K セクターサイズのストレージ上にDb2データベースを作成しようとすると、以下のようなエラーメッセージが発生し、DB作成が出来ません。

(標準出力) `SQL0293N Error accessing a table space container. SQLSTATE=57048`
(db2diag.log) `DIA8501C A buffer pool logic error has occured.`

---

最後に、「作成」ボタンを押下すると、Db2uClusterの新規デプロイが開始されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/df7ae27a-68cd-0950-57b9-02a8429ce690.png)




#### Step4-2. デプロイの状況確認
「作成」ボタンを押下したwebコンソール画面から、Db2uClusterインスタンスの作成状況を確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/d251c68e-b241-b66b-643b-3ce8e3ca2b3e.png)

コマンドラインからも同様に、Db2uCluster インスタンスの作成状況の確認が可能です。

```
oc get db2ucluster
NAME                 STATE      MAINTENANCESTATE   AGE
db2ucluster-sample   NotReady   None               10s
```

定義通り、メタデータ、ユーザデータ用に2つの永続ストレージが作成されていることを確認します。
2つのPVC/PVが作成されていることを確認します。

【PVC】
PVCはネーミングルールとして、「c-＜Db2uClusterインスタンス名＞」が先頭に付与されています。

```
oc get pvc
NAME                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                  AGE
c-db2ucluster-sample-data   Bound    pvc-92dd55dc-02f9-47cd-8a59-d9235920eed9   10Gi       RWO            ocs-storagecluster-ceph-rbd   15s
c-db2ucluster-sample-meta   Bound    pvc-c711f1af-a986-412b-9847-78e670ddc2c3   10Gi       RWX            ocs-storagecluster-cephfs     18s
```

【PV】
自動作成されるため、名前は任意文字列となります。
CLAIM列にて、対応するPVCの名前がわかるため、どのPVがDb2用途のものか識別可能です。

```
oc get pv | grep -i db2
pvc-92dd55dc-02f9-47cd-8a59-d9235920eed9   10Gi       RWO            Delete           Bound    db2u-oltp1/c-db2ucluster-sample-data                       ocs-storagecluster-ceph-rbd            38s
pvc-c711f1af-a986-412b-9847-78e670ddc2c3   10Gi       RWX            Delete           Bound    db2u-oltp1/c-db2ucluster-sample-meta                       ocs-storagecluster-cephfs              34s
```

PVC/PVは、Db2uClusterインスタンス作成開始から間もなく作成されます。
環境にも依存しますが、数分経過してもPVC/PVが表示されない場合には何か問題が起きている可能性があります。

#### Step4-3. デプロイ完了待ち～デプロイ完了確認

Db2uClusterインスタンス作成ボタン自体の応答はすぐに戻されますが、実際にデプロイが完了するまではもう少し時間がかかります。(数十分～数時間。環境に依存します)
しばらくの間 oc get pod コマンドを実行してもそれらしい出力が一切出てこないため不安になりますが、しばらく待ちます。
以下の状態になっていればデプロイ完了し、Db2インスタンスが利用可能な状態になっています。

 - 「c-<Db2uClusterインスタンス名>-instdb-*」の Pod の状態が「Completed」
 - 「c-<Db2uClusterインスタンス名>-restore-morph-*」の Pod の状態が「Completed」
 - 「c-<Db2uClusterインスタンス名>-db2u-0」の Pod の状態が「Running」

```
$ oc get pods -o wide

NAME                                        READY   STATUS      RESTARTS   AGE     IP             NODE      NOMINATED NODE   READINESS GATES
c-db2ucluster-sample-db2u-0                 1/1     Running     0          3h36m   10.129.2.151   worker3   <none>           <none>
c-db2ucluster-sample-etcd-0                 1/1     Running     0          3h37m   10.129.2.150   worker3   <none>           <none>
c-db2ucluster-sample-instdb-4fwnx           0/1     Completed   0          3h38m   10.131.1.81    worker2   <none>           <none>
c-db2ucluster-sample-ldap-7d6d659bc-26c7g   1/1     Running     0          3h38m   10.128.3.78    worker1   <none>           <none>
c-db2ucluster-sample-restore-morph-lvr9w    0/1     Completed   0          3h35m   10.131.1.82    worker2   <none>           <none>
db2u-operator-manager-7b5dfb5bc7-clgp4      1/1     Running     193        9d      10.129.3.51    worker3   <none>           <none>

```

以上でデプロイ完了です。



###Step5. 動作確認
Db2 の Pod「c-db2ucluster-sample-db2u-0」 にログインし、データベースに接続できることを確認します。
Podには以下のコマンドでログインします。

```
 $ oc rsh c-db2ucluster-sample-db2u-0 /bin/bash
```


**【動作確認例】**
ログイン時のユーザは Db2コマンド実行権限を持たない db2uadm であるため、Podへのログインが成功したら db2inst1 ユーザにスイッチユーザします。
db2 list db directory コマンドにより、この環境に作成されるデータベース名が、WebコンソールのDb2uCluterインスタンス作成画面で指定した、SAMPLEDBであると確認できます。
以下は、DBに接続しテスト用テーブルを作成し、データを挿入することで動作確認を行う例。

```
$ oc rsh c-db2ucluster-sample-db2u-0 bash
Defaulted container "db2u" out of: db2u, init-labels (init), init-kernel (init)

[db2uadm@c-db2ucluster-sample-db2u-0 /]$ su - db2inst1
Last login: Thu Dec  2 09:20:38 UTC 2021
[db2inst1@c-db2ucluster-sample-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-db2ucluster-sample-db2u-0 - Db2U db2inst1]$ db2 connect to sampledb

   Database Connection Information

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

[db2inst1@c-db2ucluster-sample-db2u-0 - Db2U db2inst1]$ db2 list tables

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

  0 record(s) selected.

[db2inst1@c-db2ucluster-sample-db2u-0 - Db2U db2inst1]$ db2 "create table t1 (c1 integer, c2 char(32))"
DB20000I  The SQL command completed successfully.
[db2inst1@c-db2ucluster-sample-db2u-0 - Db2U db2inst1]$ db2 "insert into t1 values (101,'TARGET DB DATA1'), (102, 'TARGET DB DATA2')"
DB20000I  The SQL command completed successfully.
[db2inst1@c-db2ucluster-sample-db2u-0 - Db2U db2inst1]$ db2 "select * from t1"

C1          C2
----------- --------------------------------
        101 TARGET DB DATA1
        102 TARGET DB DATA2

  2 record(s) selected.

[db2inst1@c-db2ucluster-sample-db2u-0 - Db2U db2inst1]$ db2 terminate
DB20000I  The TERMINATE command completed successfully.
[db2inst1@c-db2ucluster-sample-db2u-0 - Db2U db2inst1]$ exit
[db2uadm@c-db2ucluster-sample-db2u-0 /]$ exit
```

 ---> 導入したDb2は問題なく稼働していることが確認できました。


### Step6. ライセンスの登録状況確認
Db2 V11.5では、ライセンスを適用しなくても Community Editionという無償版ライセンスが適用された状態となっている。旧バージョンのDb2試用版のように90日経過したらDb2が起動しなくなるということはありません。
この点はDb2 on OpenShiftも共通です。

導入したDb2のライセンス確認/更新を行うには、下記マニュアルに記載コマンドを実行します。

[Db2 11.5 マニュアル [Upgrading your Db2 Community Edition license certificate key]](
https://www.ibm.com/docs/en/db2/11.5?topic=updating-managing-licenses)



###  Step7.接続情報の確認
#### (1) OCPクラスタ内からの接続情報
Liberty など、OCPクラスタ内からのDB接続時に必要となる接続情報として、クラスターIPアドレスとポート番号を確認します。

#####① IPアドレス
プロジェクト名、リリース名は環境に応じて書き換えて実行します。

```
oc get svc -n <PROJECT> c-<RELEASE-NAME>-db2u-engn-svc -o jsonpath='{.spec.clusterIP}'
```

(確認例)

```
$ oc get svc -n db2u-oltp1 c-db2ucluster-sample-db2u-engn-svc -o jsonpath='{.spec.clusterIP}'
172.30.217.115
$
```

#####② ポート番号
プロジェクト名、リリース名は環境に応じて書き換えて実行します。

```
oc get svc -n <PROJECT> c-<RELEASE-NAME>-db2u-engn-svc -o jsonpath='{.spec.ports[?(@.name=="legacy-server")].nodePort}'
```

(確認例)

```
$ oc get svc -n db2u-oltp1 c-db2ucluster-sample-db2u-engn-svc -o jsonpath='{.spec.ports[?(@.name=="legacy-server")].nodePort}'
31545
$
```

#### (2) OCPクラスタ外からの接続情報
Db2uClusterカスタムリソースをデプロイすると、NodePortタイプのサービスが作成/公開されます。
以下のドキュメントに記載される通り、
\<いずれかのワーカーノードのIP\>:\<NodePortのポート番号\> の組み合わせを指定すれば、OpenShiftクラスタ外のクライアントからDb2に接続できるようになります。

https://kubernetes.io/ja/docs/concepts/services-networking/service/
> NodePort: 各NodeのIPにて、静的なポート(NodePort)上でServiceを公開します。

https://cloud.ibm.com/docs/containers?topic=containers-nodeport&locale=ja
> ワーカー・ノードのパブリック・ポートを公開し、ワーカー・ノードのパブリック IP アドレスを使用して、クラスター内のサービスにインターネットからパブリック・アクセスを行います。
> NodePort タイプの Kubernetes サービスを作成してアプリを公開する場合は、30000 から 32767 の範囲の NodePort と内部クラスター IP アドレスがサービスに割り当てられます。 NodePort サービスは、アプリに対する着信要求のための外部エントリー・ポイントとして機能します。 

######① IPアドレス
Db2が稼働するワーカーノードのIPアドレス(ホスト名)を確認します。
今回の環境では、/etc/hosts ファイルで確認可能です。
(どのワーカーノードのIPアドレス宛でも、Db2接続可能)

######② ポート番号
Service定義を確認し、TYPE:NodePort のエントリを探します。
Db2のデフォルトのListenPortは50000番(※バージョンによっては25000番)であり、この50000番に対応するポートが接続先となります。

```
$ oc get svc
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                           AGE
c-db2ucluster-sample-db2u            ClusterIP   172.30.60.2      <none>        50000/TCP,50001/TCP,25000/TCP,25001/TCP,25002/TCP,25003/TCP,25004/TCP,25005/TCP   6d4h
c-db2ucluster-sample-db2u-engn-svc   NodePort    172.30.217.115   <none>        50000:31545/TCP,50001:30675/TCP                                                   6d4h
c-db2ucluster-sample-db2u-internal   ClusterIP   None             <none>        50000/TCP,9443/TCP,50052/TCP                                                      6d4h
c-db2ucluster-sample-etcd            ClusterIP   None             <none>        2379/TCP,2380/TCP                                                                 6d4h
c-db2ucluster-sample-ldap            ClusterIP   172.30.89.239    <none>        50389/TCP                                                                         6d4h
```

(NodePortのみ抜粋)

```
c-db2ucluster-sample-db2u-engn-svc   NodePort    172.30.217.115   <none>        50000:31545/TCP,50001:30675/TCP  
```

→ この環境においては、Db2のデフォルトのサービスポートである50000番に対応する 31545 番が、クライアントの指定する接続先ポートに該当します。

----
### (参考) デプロイ完了後の oc get all 出力

```
$ oc get all -o wide
NAME                                            READY   STATUS      RESTARTS   AGE    IP             NODE      NOMINATED NODE   READINESS GATES
pod/c-db2ucluster-sample-db2u-0                 1/1     Running     0          6d5h   10.129.2.151   worker3   <none>           <none>
pod/c-db2ucluster-sample-etcd-0                 1/1     Running     0          6d5h   10.129.2.150   worker3   <none>           <none>
pod/c-db2ucluster-sample-instdb-4fwnx           0/1     Completed   0          6d5h   10.131.1.81    worker2   <none>           <none>
pod/c-db2ucluster-sample-ldap-7d6d659bc-26c7g   1/1     Running     0          6d5h   10.128.3.78    worker1   <none>           <none>
pod/c-db2ucluster-sample-restore-morph-lvr9w    0/1     Completed   0          6d5h   10.131.1.82    worker2   <none>           <none>
pod/db2u-operator-manager-7b5dfb5bc7-clgp4      1/1     Running     243        15d    10.129.3.51    worker3   <none>           <none>

NAME                                         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                           AGE    SELECTOR
service/c-db2ucluster-sample-db2u            ClusterIP   172.30.60.2      <none>        50000/TCP,50001/TCP,25000/TCP,25001/TCP,25002/TCP,25003/TCP,25004/TCP,25005/TCP   6d5h   app=db2ucluster-sample,component=db2oltp,formation_id=db2ucluster-sample,role=db,type=engine
service/c-db2ucluster-sample-db2u-engn-svc   NodePort    172.30.217.115   <none>        50000:31545/TCP,50001:30675/TCP                                                   6d5h   app=db2ucluster-sample,component=db2oltp,formation_id=db2ucluster-sample,role=db,type=engine
service/c-db2ucluster-sample-db2u-internal   ClusterIP   None             <none>        50000/TCP,9443/TCP,50052/TCP                                                      6d5h   app=db2ucluster-sample,component=db2oltp,formation_id=db2ucluster-sample,role=db,type=engine
service/c-db2ucluster-sample-etcd            ClusterIP   None             <none>        2379/TCP,2380/TCP                                                                 6d5h   app=db2ucluster-sample,component=etcd,formation_id=db2ucluster-sample
service/c-db2ucluster-sample-ldap            ClusterIP   172.30.89.239    <none>        50389/TCP                                                                         6d5h   app=db2ucluster-sample,formation_id=db2ucluster-sample,role=ldap

NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES                                                                                                     SELECTOR
deployment.apps/c-db2ucluster-sample-ldap   1/1     1            1           6d5h   ldap         cp.icr.io/cp/db2u.auxiliary.auth@sha256:34c5d313843262d4027fcf84eeed8ed8ec0886b7361796ee493bd42b9224bc4a   app=db2ucluster-sample,formation_id=db2ucluster-sample,role=ldap
deployment.apps/db2u-operator-manager       1/1     1            1           15d    manager      docker.io/ibmcom/db2u-operator@sha256:5dc50046595172f94fd37ef8497e2b4f2fdf2c12dff4885b6397969bdade11a5     control-plane=db2u-operator-manager

NAME                                                  DESIRED   CURRENT   READY   AGE    CONTAINERS   IMAGES                                                                                                     SELECTOR
replicaset.apps/c-db2ucluster-sample-ldap-7d6d659bc   1         1         1       6d5h   ldap         cp.icr.io/cp/db2u.auxiliary.auth@sha256:34c5d313843262d4027fcf84eeed8ed8ec0886b7361796ee493bd42b9224bc4a   app=db2ucluster-sample,formation_id=db2ucluster-sample,pod-template-hash=7d6d659bc,role=ldap
replicaset.apps/db2u-operator-manager-7b5dfb5bc7      1         1         1       15d    manager      docker.io/ibmcom/db2u-operator@sha256:5dc50046595172f94fd37ef8497e2b4f2fdf2c12dff4885b6397969bdade11a5     control-plane=db2u-operator-manager,pod-template-hash=7b5dfb5bc7

NAME                                         READY   AGE    CONTAINERS   IMAGES
statefulset.apps/c-db2ucluster-sample-db2u   1/1     6d5h   db2u         cp.icr.io/cp/db2u@sha256:dc570377bd8e0a740bc53dc491fca3752096dfa64e00b1dedd239eb1cfa312aa
statefulset.apps/c-db2ucluster-sample-etcd   1/1     6d5h   etcd         cp.icr.io/cp/etcd@sha256:e8efda1725011bd75194953043c581281a164bc0ad2f23e96d266c869d9e4686

NAME                                           COMPLETIONS   DURATION   AGE    CONTAINERS      IMAGES                                                                                             SELECTOR
job.batch/c-db2ucluster-sample-instdb          1/1           33s        6d5h   instdb          cp.icr.io/cp/db2u.instdb@sha256:c35d117b57a57971afb24dbe60f34cc0c496fba46d7f11756d80a25bf4edf3c1   controller-uid=e762b583-29cb-43db-8e41-efb95191eaf9
job.batch/c-db2ucluster-sample-restore-morph   1/1           25m        6d5h   restore-morph   cp.icr.io/cp/db2u.tools@sha256:a981cb52a2d87416417fd58e434c9dbeff6115f8656dc8dea4f89b25271fbaf0    controller-uid=99941ba6-bb8a-4536-a753-aa2106bea80b

```

---

以上です。