Db2 on OpenShift 11.5.6.0 導入手順  - 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つ   |複数   |
|初期セットアップ方法   |docker pull/docker runコマンド   | oc createコマンド(+yamlファイル)  |
|データの所在   |コンテナ内   |コンテナ外(Persistent Volume)   |
|コンテナ障害時のデータの復元   |バックアップがあれば復元可能   | データ/ログがPV上に存在するため、コンテナ(Pod)が再起動出来れば障害発生時点に戻れる  |


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

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

## 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
 * IBM Cloud File Storage (gold storage class)
 * Portworx 2.5.5
 * A HostPath PV that is a mounted clustered filesystem

ストレージについての詳細な要件はマニュアルで確認します。
[Db2 11.5 マニュアル [Certified storage options for Db2]](
https://www.ibm.com/docs/en/db2/11.5?topic=storage-certified-options)

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

* OpenShift version 3.11以上(4.xも含む)
* 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 の永続ボリュームとして、 OpenShift Container Storage(OCS) を利用する構成を想定します。

| 項目                    | バージョン         |
|:------------------------|:------------------|
| OS(bastion)             |          RHEL 7.7 |
| OS(worker)       |          RHEL 7.7 |
| OCP(Client) ※            | 4.5.0-202007240519.p0-b66f2d3 |
| OCP(Server) ※           | 4.5.7             |
| Kubernetes              |  v1.18.3+2cf11e2  |
| Db2 OLTP               |            11.5.6.0 |


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

 - Bastion Node x1
 - Master Node x3
 - Worker Node x3
 - Worker Node(OCS稼働) 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構成とすることも可能

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

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

|配置データ種別 |ストレージクラス名 |アクセスモード |
|:-:|:-:|:-:|
|メタデータ(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-ocs1」プロジェクトを作成します。

```
oc new-project db2u-ocs1
Now using project "db2u-ocs1" 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] を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/23934099-4147-3a68-2f88-f284d75a9e4d.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/82483748-60b7-eca6-7834-0a3b01b3e53f.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/fb1f4c4b-8bc8-3f70-6ba0-6f8a72ff692e.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/b8269907-3140-a06c-32b8-a265fb2301bb.png)


[Install」ボタンを押下し、Db2 Operatorインストール画面を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/dba828e5-a9c8-d961-2543-81b6cd15cd66.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/72f1c1a5-7024-40e8-40be-e2ac41ee9c10.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/042768d6-41b3-21d8-bf7e-3d411bd813a3.png)

数分程度で、Db2 Operator導入は完了します。
"Installed operator - ready for use" という表示に切り替わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/0bfed9a3-3933-a942-cd16-f32fed62151c.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-64f9457887-b4428   1/1     Running   351        3d22h   10.129.2.28   worker1   <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. Yaml編集
カスタムリソース Db2uCluster のインスタンスを作成します。
[Db2製品マニュアル](https://www.ibm.com/docs/en/db2/11.5?topic=db2-deploying-using-db2ucluster-api)に掲載されるyamlファイルのサンプルを必要に応じて編集します。
例えば下記プロパティを編集します。

**【主要な編集項目】**

 - metadata.name　... デプロイ毎に、固有となる名前
 - spec.version ... デプロイするDb2Uバージョン
 - spec.environment.database.name　... Pod内で作成されるDB名
 - spec.environment.instance.password ... インスタンスオーナーdb2inst1ユーザのパスワード

**【ストレージ関連の編集項目】**

 - spec.storage.spec.storageClassName ... OCSストレージクラス名を指定
    - メタデータ(meta)：ocs-storagecluster-cephfs
    - ユーザデータ(data)：ocs-storagecluster-ceph-rbd
 - spec.storage.spec.resources.requests.storage ... ストレージサイズ<br>(無指定だとデフォルトで100GB確保されます)

```yaml:db2ucluster-ocs2.yaml
apiVersion: db2u.databases.ibm.com/v1
kind: Db2uCluster
metadata:
  name: db2ucluster-ocs2
spec:
  license:
    accept: true
  account:
    privileged: true
    imagePullSecrets:
      - ibm-registry
  version: "11.5.6.0"
  size: 1
  podConfig:
    db2u:
      resource:
        db2u:
          requests:
            cpu: 2
            memory: 4Gi
          limits:
            cpu: 4
            memory: 8Gi
  environment:
    dbType: db2oltp
    database:
      name: sampledb
    instance:
      password: cicdtest
  addOns:    
    rest:     
      enabled: false
    graph:     
      enabled: false
  storage:
    - name: meta
      type: "create"
      spec:
        storageClassName: ocs-storagecluster-cephfs
        accessModes:
          - ReadWriteMany
        resources:
          requests:
            storage: 10Gi
    - name: data
      type: "create"
      spec:
        storageClassName: ocs-storagecluster-ceph-rbd
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 10Gi
```

##### 補足：4Kセクターサポート
4Kセクターサイズのストレージを利用する場合には以下のレジストリー変数を設定しておく必要があります。

```
db2set DB2_4K_DEVICE_SUPPORT=ON
```

Db2uClusterデプロイ用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.`


#### Step4-2. Db2uClusterインスタンス作成
Step4-1.で作成したyamlを用いて、Db2のデプロイを実行します。(→即時に応答が戻ります)

```
$ oc create -f db2ucluster-ocs2.yaml
db2ucluster.db2u.databases.ibm.com/db2ucluster-ocs2 created
```

Db2uCluster インスタンスが作成されていることを確認します。

```
oc get Db2uCluster db2ucluster-ocs2
```

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

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

```
$ oc get pvc
NAME                      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   NAME                      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                  AGE
c-db2ucluster-ocs2-data   Bound    pvc-42a4c57d-4d75-4dd2-84d6-7c301d887a6e   10Gi       RWO            ocs-storagecluster-ceph-rbd   2s
c-db2ucluster-ocs2-meta   Bound    pvc-ee7e32c0-4d24-4a5a-b9fa-aa6dd5f0fd5e   10Gi       RWX            ocs-storagecluster-cephfs     2s
```

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

```
$ oc get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                                             STORAGECLASS                  REASON   AGE
pvc-42a4c57d-4d75-4dd2-84d6-7c301d887a6e   10Gi       RWO            Delete           Bound    db2u-ocs1/c-db2ucluster-ocs2-data                                 ocs-storagecluster-ceph-rbd            44s
pvc-ee7e32c0-4d24-4a5a-b9fa-aa6dd5f0fd5e   10Gi       RWX            Delete           Bound    db2u-ocs1/c-db2ucluster-ocs2-meta                                 ocs-storagecluster-cephfs              40s
```


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

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

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

```
$ oc get all -o wide

NAME                                           READY   STATUS      RESTARTS   AGE    IP             NODE      NOMINATED NODE   READINESS GATES
pod/c-db2ucluster-ocs2-db2u-0                  1/1     Running     0          69m    10.128.2.146   worker2   <none>           <none>
pod/c-db2ucluster-ocs2-etcd-0                  1/1     Running     0          70m    10.128.2.145   worker2   <none>           <none>
pod/c-db2ucluster-ocs2-instdb-pp7cw            0/1     Completed   0          77m    10.129.2.207   worker1   <none>           <none>
pod/c-db2ucluster-ocs2-ldap-6d8d9db5cc-vfjj6   1/1     Running     0          82m    10.129.2.204   worker1   <none>           <none>
pod/c-db2ucluster-ocs2-restore-morph-6t9p2     0/1     Completed   0          67m    10.129.2.208   worker1   <none>           <none>
pod/db2u-operator-manager-64f9457887-b4428     1/1     Running     388        4d1h   10.129.2.28    worker1   <none>           <none>

NAME                                       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                           AGE   SELECTOR
service/c-db2ucluster-ocs2-db2u            ClusterIP   172.30.182.52    <none>        50000/TCP,50001/TCP,25000/TCP,25001/TCP,25002/TCP,25003/TCP,25004/TCP,25005/TCP   69m   app=db2ucluster-ocs2,component=db2oltp,formation_id=db2ucluster-ocs2,role=db,type=engine
service/c-db2ucluster-ocs2-db2u-engn-svc   NodePort    172.30.24.129    <none>        50000:31130/TCP,50001:32135/TCP                                                   69m   app=db2ucluster-ocs2,component=db2oltp,formation_id=db2ucluster-ocs2,role=db,type=engine
service/c-db2ucluster-ocs2-db2u-internal   ClusterIP   None             <none>        50000/TCP,9443/TCP,50052/TCP                                                      69m   app=db2ucluster-ocs2,component=db2oltp,formation_id=db2ucluster-ocs2,role=db,type=engine
service/c-db2ucluster-ocs2-etcd            ClusterIP   None             <none>        2379/TCP,2380/TCP                                                                 70m   app=db2ucluster-ocs2,component=etcd,formation_id=db2ucluster-ocs2
service/c-db2ucluster-ocs2-ldap            ClusterIP   172.30.162.133   <none>        50389/TCP                                                                         82m   app=db2ucluster-ocs2,formation_id=db2ucluster-ocs2,role=ldap

NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES                                                                                                     SELECTOR
deployment.apps/c-db2ucluster-ocs2-ldap   1/1     1            1           82m    ldap         cp.icr.io/cp/db2u.auxiliary.auth@sha256:f3d2a3e24bb4b80251bcfd9284a10a5edf40f90c44d1689b84f7aa6729c64f04   app=db2ucluster-ocs2,formation_id=db2ucluster-ocs2,role=ldap
deployment.apps/db2u-operator-manager     1/1     1            1           4d1h   manager      docker.io/ibmcom/db2u-operator@sha256:5c806b6f8c245c38b83f69c853f54406b08eb749e7635cd8fe5f514b35c9e98c     control-plane=db2u-operator-manager

NAME                                                 DESIRED   CURRENT   READY   AGE    CONTAINERS   IMAGES                                                                                                     SELECTOR
replicaset.apps/c-db2ucluster-ocs2-ldap-6d8d9db5cc   1         1         1       82m    ldap         cp.icr.io/cp/db2u.auxiliary.auth@sha256:f3d2a3e24bb4b80251bcfd9284a10a5edf40f90c44d1689b84f7aa6729c64f04   app=db2ucluster-ocs2,formation_id=db2ucluster-ocs2,pod-template-hash=6d8d9db5cc,role=ldap
replicaset.apps/db2u-operator-manager-64f9457887     1         1         1       4d1h   manager      docker.io/ibmcom/db2u-operator@sha256:5c806b6f8c245c38b83f69c853f54406b08eb749e7635cd8fe5f514b35c9e98c     control-plane=db2u-operator-manager,pod-template-hash=64f9457887

NAME                                       READY   AGE   CONTAINERS   IMAGES
statefulset.apps/c-db2ucluster-ocs2-db2u   1/1     69m   db2u         cp.icr.io/cp/db2u@sha256:5d2faf3cc705c8b970e46427173ac8544437e8ac4379fd46abc0e9d3bfe4529f
statefulset.apps/c-db2ucluster-ocs2-etcd   1/1     70m   etcd         cp.icr.io/cp/etcd@sha256:07dc9db9e2c1c08de8091d5999cada507a34428b53785692c6021dbb87fb258a

NAME                                         COMPLETIONS   DURATION   AGE   CONTAINERS      IMAGES                                                                                             SELECTOR
job.batch/c-db2ucluster-ocs2-instdb          1/1           10m        82m   instdb          cp.icr.io/cp/db2u.instdb@sha256:1109fbdc5a90b4377925ebedd2a3d812d002efbfd9c9632f2968408884ebfe96   controller-uid=fe542a03-9caa-4939-bfa2-3dc73d24b419
job.batch/c-db2ucluster-ocs2-restore-morph   1/1           48m        67m   restore-morph   cp.icr.io/cp/db2u.tools@sha256:056685dd666729e243dccaa66065eaeacbecc9a33c7b002f3682bd559efe4120    controller-uid=1a7b0c71-1b44-4e04-a52f-8f2c517322a9
```


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

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

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


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

```
[db2uadm@c-db2ucluster-ocs2-db2u-0 /]$ su - db2inst1
Last login: Tue Jul  6 11:11:30 UTC 2021 on pts/1
[db2inst1@c-db2ucluster-ocs2-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-ocs2-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-ocs2-db2u-0 - Db2U db2inst1]$ db 2 list tables

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

  0 record(s) selected.

[db2inst1@c-db2ucluster-ocs2-db2u-0 - Db2U db2inst1]$ db2 "create table t1 (c1 integer, c2 char(32)" )"


DB20000I  The SQL command completed successfully.
[db2inst1@c-db2ucluster-ocs2-db2u-0 - Db2U db2inst1]$ 
[db2inst1@c-db2ucluster-ocs2-db2u-0 - Db2U db2inst1]$ 
[db2inst1@c-db2ucluster-ocs2-db2u-0 - Db2U db2inst1]$ time db2 "insert into t1 values (1,'a'),(2,'b')"
DB20000I  The SQL command completed successfully.

real	0m0.08s
user	0m0.02s
sys	0m0.01s
[db2inst1@c-db2ucluster-ocs2-db2u-0 - Db2U db2inst1]$ db2 "select * from t1"

C1          C2                              
----------- --------------------------------
          1 a                               
          2 b                               

  2 record(s) selected.

[db2inst1@c-db2ucluster-ocs2-db2u-0 - Db2U db2inst1]$ db2 terminate

DB20000I  The TERMINATE command completed successfully.
```

 ---> 導入した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> <RELEASE-NAME>-db2u-engn-svc -o jsonpath='{.spec.clusterIP}'
```

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

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

#### (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-ocs2-db2u            ClusterIP   172.30.182.52    <none>        50000/TCP,50001/TCP,25000/TCP,25001/TCP,25002/TCP,25003/TCP,25004/TCP,25005/TCP   37d
c-db2ucluster-ocs2-db2u-engn-svc   NodePort    172.30.24.129    <none>        50000:31130/TCP,50001:32135/TCP                                                   37d
c-db2ucluster-ocs2-db2u-internal   ClusterIP   None             <none>        50000/TCP,9443/TCP,50052/TCP                                                      37d
c-db2ucluster-ocs2-etcd            ClusterIP   None             <none>        2379/TCP,2380/TCP                                                                 37d
c-db2ucluster-ocs2-ldap            ClusterIP   172.30.162.133   <none>        50389/TCP                                                                         37d
```

(NodePortのみ抜粋)

```
c-db2ucluster-ocs2-db2u-engn-svc   NodePort    172.30.24.129    <none>        50000:31130/TCP,50001:32135/TCP
```

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


----

以上です。