Db2 on CP4Dへの接続 - ClusterIP サービスを使用して接続する

Cloud Pak for Data 内のDb2サービスへ接続できた4つの方法をご紹介しています。 使用頻度が高いと思われる順に記事を並べました。

1. ["データベース詳細"を使用して"プラットフォーム接続"を作成する](https://qiita.com/mi-shimo/items/7abf2bb699c7c4267cce)
1. [NodePort サービスを使用して接続する](https://qiita.com/mi-shimo/items/f52aea45dad0835b29cc)
1. [ClusterIP サービスを使用して接続する](https://qiita.com/mi-shimo/items/2f0d5caa654e5721271d)
1. [Db2 Podに直接接続する](https://qiita.com/mi-shimo/items/32f8609975caf0015b56) 

ここでは ClusterIP サービスを使用して接続を作成します。
ROKS (Red Hat OpenShift Kubernetes Service)に 2つ Db2 デプロイメントを作成し、１つを Db2 サーバー１つをクライアントとみなして、ClusterIP サービスを使用してDb2 サーバー上のデータベースに接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855502/4b0d56a5-a888-df67-a182-dd9c3d990817.png)

Db2のClusterIP サービスを使用するための接続情報をコマンドで入手し、Db2データベースへの接続テストができるDb2Jccを利用して接続を確認しました。

## ClusterIP サービスの接続情報を得る

著者は　Db2 on Cloud Pak for Dataの ClusterIPサービスに関する情報はまだ見ていないのですが、`oc get svc`で確認すると　c-db2oltp-xxxxxxxx-db2u というようなClusterIPサービスでデータベースに接続可能なようです。

接続に成功した方法をご紹介します。

Cloud Pak for Data 内の 接続したいDb2 サービス (Db2 デプロイメント ID) を db2ucluster変数に登録します。 Db2 がデプロイされている OpenShift プロジェクトは zen です。
```
[user99@bastion7 ~]$ db2ucluster=db2oltp-1668582373852911
[user99@bastion7 ~]$ echo ${db2ucluster}
db2oltp-1668582373852911
[user99@bastion7 ~]$
```
作業するOpenShift プロジェクトをzenに切り替え　確認のため Db2uCluster カスタム・リソースをリストします。
```
# 実行コマンド
oc get db2ucluster $db2ucluster

# 実行結果例
[user99@bastion7 ~]$ oc project zen
Already on project "zen" on server "https://c101-e.jp-osa.containers.cloud.ibm.com:32291".
[user99@bastion7 ~]$ oc get db2ucluster $db2ucluster
NAME                       STATE   MAINTENANCESTATE   AGE
db2oltp-1668582373852911   Ready   None               7d16h
[user99@bastion7 ~]$
```

### Cluster IPサービス　
`oc get svc`で ClusterIP サービスを確認すると　c-${db2ucluster}-db2u (c-db2oltp-1668582373852911-db2u) でデータベースに接続可能なようです。
 
```
# 実行コマンド
oc get service -o wide c-${db2ucluster}-db2u

# 実行結果例
[user99@bastion7 ~]$ oc get service -o wide c-${db2ucluster}-db2u
NAME                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                                           AGE   SELECTOR
c-db2oltp-1668582373852911-db2u   ClusterIP   172.21.250.18   <none>        50000/TCP,50001/TCP,25000/TCP,25001/TCP,25002/TCP,25003/TCP,25004/TCP,25005/TCP   8d    app=db2oltp-1668582373852911,component=db2oltp,formation_id=db2oltp-1668582373852911,role=db,type=engine
[user99@bastion7 ~]$
```
ClusterIP サービスで使用するポートを取得します。　
#### 非 SSL ポート取得　
非 SSL ポート情報はClusterIPサービス c-${db2ucluster}-db2u に`db2-server`として登録されています。
次の結果から　非 SSL ポートは `50000`になります。
```
# 実行コマンド
oc get svc c-${db2ucluster}-db2u -o jsonpath='{.spec.ports[?(@.name=="db2-server")].port}{"\n"}'

# 実行結果例
[user99@bastion7 ~]$ oc get svc c-${db2ucluster}-db2u -o jsonpath='{.spec.ports[?(@.name=="db2-server")].port}{"\n"}'
50000
[user99@bastion7 ~]$
```

#### SSL ポート取得　
SSL ポートも確認しておきましょう。　SSL ポート情報はDb2 NodePortサービス(c-${db2ucluster}-db2u-engn-svc)に`db2-ssl-server`として登録されています。
```
# 実行コマンド
oc get svc c-${db2ucluster}-db2u -o jsonpath='{.spec.ports[?(@.name=="db2-ssl-server")].port}{"\n"}'

# 実行結果例
[user99@bastion7 ~]$ oc get svc c-${db2ucluster}-db2u -o jsonpath='{.spec.ports[?(@.name=="db2-ssl-server")].port}{"\n"}'
50001
[user99@bastion7 ~]$
```

### Db2 Pod
Db2 Podは　c-${db2ucluster}-db2u-0 ( c-db2oltp-1668505262111014-db2u-0 )となります。
```
[user99@bastion7 ~]$ oc get pod c-${db2ucluster}-db2u-0 -o wide
NAME                                READY   STATUS    RESTARTS   AGE     IP              NODE           NOMINATED NODE   READINESS GATES
c-db2oltp-1668582373852911-db2u-0   1/1     Running   0          2d11h   172.17.49.247   10.248.64.30   <none>           <none>
[user99@bastion7 ~]$
```
### データベース名 : BLUDB 

Db2 Pod に入ってDb2 インスタンスユーザー db2inst1に切り替えデータベース名を確認します。
データベース名は BLUDBです。
```
[user99@bastion7 ~]$ oc exec -it c-${db2ucluster}-db2u-0 -- bash
Defaulted container "db2u" out of: db2u, init-labels (init), init-kernel (init)
[db2uadm@c-db2oltp-1668582373852911-db2u-0 /]$ su - db2inst1
Last login: Wed Nov 23 23:28:40 UTC 2022
[db2inst1@c-db2oltp-1668582373852911-db2u-0 - Db2U db2inst1]$ db2 list db directory

 System Database Directory

 Number of entries in the directory = 1

Database 1 entry:

 Database alias                       = BLUDB
 Database name                        = BLUDB
 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-db2oltp-1668582373852911-db2u-0 - Db2U db2inst1]$
```


## 接続情報のまとめ
### 接続情報取得のためのリソース情報
| Db2サービスリソース情報                          | 値           |
| -------------------------------- | ------------ | 
| OpenShift プロジェクト         | zen | 
| Db2uCluster カスタム・リソース     | ${db2ucluster}         |
| Db2 Pod                         | c-${db2ucluster}-db2u-0 | 
| Db2 インスタンスユーザー       | db2inst1        |  
| Db2 ClusterIPサービス　       | c-${db2ucluster}-db2u   | 

### 取得した接続情報
| 接続情報               　| 値           |                                                |
| ------------------------| ------------ | ---------------------------------------------- |
| host_name_or_IP_address | c-${db2ucluster}-db2u | ClusterIP サービス |
| Database_name           | BLUDB        | Db2 データベース           |
| db2-server              | 50000        | Db2 インスタンスのポート番号|
| db2-ssl-server          | 50001        | Db2 の Secure Sockets Layer (SSL) インスタンスのポート番号。 |


## Db2Jccを利用して接続を確認する
ここでは　Cloud Pak for Data にもう一つDb2サービスをデプロイして　その中でJDBCアプリケーションを使用して接続を確認します。
Db2サービスなので　JavaやIBM Data Server Driver for JDBC and SQLJが導入されています。
Db2データベースへの接続テストができるDb2Jccを利用して接続を確認します。

今回 Db2 Clientとして使用する Db2のPod `c-db2oltp-1668505262111014-db2u-0` に入ります。

```
[user99@bastion7 ~]$ oc exec -it c-db2oltp-1668505262111014-db2u-0 -- bash
Defaulted container "db2u" out of: db2u, init-labels (init), init-kernel (init)
[db2uadm@c-db2oltp-1668505262111014-db2u-0 /]$ 
```
PATH, CLASSPATHを設定します。
```
DB2JDBCPATH=/mnt/bludata0/home/db2inst1/sqllib/java
export PATH=${PATH}:.:${DB2JDBCPATH}/jdk64/bin
export CLASSPATH=${DB2JDBCPATH}/db2java.zip:${DB2JDBCPATH}/sqlj.zip:${DB2JDBCPATH}/db2jcc_license_cu.jar:${DB2JDBCPATH}/db2jcc4.jar:.
```

非 SSL ポート50000を使用して接続する場合　接続文字列は `jdbc:db2://c-${db2ucluster}-db2u:50000/BLUDB`となります。
Db2Jccを実行します。
```
# 実行コマンド
db2ucluster=db2oltp-1668582373852911
java com.ibm.db2.jcc.DB2Jcc \
-url "jdbc:db2://c-${db2ucluster}-db2u:50000/BLUDB" \
-user user02 -password xxxxx \
-version

# 実行結果
[db2uadm@c-db2oltp-1668505262111014-db2u-0 ~]$ java com.ibm.db2.jcc.DB2Jcc \
> -url "jdbc:db2://c-${db2ucluster}-db2u:50000/BLUDB" \
> -user user02 -password xxxxx \
> -version


[jcc][10521][13706]Command : java com.ibm.db2.jcc.DB2Jcc -url jdbc:db2://c-db2oltp-1668582373852911-db2u:50000/BLUDB -user user02 -password ******** -version


IBM Data Server Driver for JDBC and SQLJ 4.31.10
[jcc][10516][13709]Test Connection Successful.

DB product version = SQL110570
DB product name = DB2/LINUXX8664
DB URL = jdbc:db2://172.21.250.18:50000/BLUDB
DB Drivername = IBM Data Server Driver for JDBC and SQLJ
DB OS Name = Linux
[db2uadm@c-db2oltp-1668505262111014-db2u-0 ~]$
```

接続できました。

## おわりに
ここでは コマンドでDbのClusterIP サービスを使用するための接続情報を入手し、Db2データベースへの接続テストができるDb2Jccを利用して接続を確認しました。

Db2 on Cloud Pak for Data のドキュメントで ClusterIP サービスに関する記述はみつけていません。　

### 実施環境
- IBM Cloud VPC Gen2
- OCP 4.10.32
- CP4D 4.5.3 
  - Db2 Version 11.5.7.0-cn7

### 参照文献
- [DB2Jcc - IBM Data Server Driver for JDBC and SQLJ diagnostic utility](https://www.ibm.com/docs/en/db2/11.5?topic=pddsdjs-db2jcc-data-server-driver-jdbc-sqlj-diagnostic-utility)