ICPでIBM Db2 Developer-C Helm ChartのDb2を使ってみる　その２

#具体的な作業の続き
2.　IBM Db2 Developer-C Helm Chartの使用
前述のようにレシピとして公開されています。又は、ICP Enterprise Edition 2.1.0.3を導入すると「カタログ」-「ibm-db2oltp-dev」で参照することができます。この記事では後者を前提に作業します。なお、インストール直後で、Helm Chartの内容が適切に表示されない場合は、「管理」-「Helmリポジトリー」でリポジトリーの同期をクリックしてしばらく待ちます。余談ですが、レシピにはIBM Db2 Developer-C Helm ChartをICP Community Edition上に構築する方法が含まれています。
![db2helm.png](https://qiita-image-store.s3.amazonaws.com/0/104507/eefef0c2-0966-244a-1c97-e3014207e676.png)

2.1 前提作業
2.1.1 Docker container (Prereq #1)
・ユーザーはDb2 Developer-C Editionを利用するために、[Docker Store](https://store.docker.com/images/db2-developer-c-edition)でTerms of Service("Single server deployment, full feature, non-production, non-warranted")に合意しSubscribeされる必要があります。Docker Storeのアカウントを作成してない場合は、新規作成します。
![dockerStore.png](https://qiita-image-store.s3.amazonaws.com/0/104507/46990c4c-b04a-4a1a-bc65-1a102e7b4cb4.png)

・次に、[Docker Cloud](https://cloud.docker.com/swarm/e50376/account/user)にログインし、API KeysでAdd API Keyをクリックし、API Keyを生成します。API keyの値は一度しか表示されないのでScreen shotを取ったり、文字列をコピーするなどしておきます(もし、忘れてしまった場合は、再度Add API Keyで生成します)。例では、Db2CEというラベルを設定しています。
![APIKeys.png](https://qiita-image-store.s3.amazonaws.com/0/104507/2345147e-98a8-dbca-fbbd-f079a638d339.png)

・masterノードの端末で生成されたAPI Keyの動作確認として`curl -u Dockerユーザー名:API key値 https://cloud.docker.com/api/app/v1/service/`を実行します。

```text:実行例
{"meta": {"limit": 25, "next": null, "offset": 0, "previous": null, "total_count": 0}, "objects": []}
```

・ICPコンソールのアカウントアイコンをクリックして表示されるクライアントの構成のコマンドを実行します。
![clientconfig.png](https://qiita-image-store.s3.amazonaws.com/0/104507/fbfc4bfa-764f-4a94-f6f6-d5556da07e44.png)

・取得したAPI Keyを使用して、masterノードでsecretを登録します。例では、secret名を"yoshio-secret"としています。
コマンド例：
`kubectl create secret docker-registry yoshio-secret --docker-username=Dockerユーザー名 --docker-password=API key値 --docker-email=Dockerユーザーのemail --namespace=default`

・正常に作成されたかどうか、作成されたsecretの詳細を確認したい場合は以下のどちらかのコマンドを実行します。
`kubectl get secrets yoshio-secret`
`kubectl describe secret`

・オマケ：間違えてしまったsecretの削除
`kubectl delete secret yoshio-secret`

・レシピではここで、 serviceaccountをpatchする作業を行っていますが、省略します。その代わりに、Db2構成時に前項で作成したsecretを指定します。

2.1.2 Storage (Prereq #2)
・Persisent Volumeを[マニュアル](https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/#create-a-persistentvolume)を参考に作成します。本環境で最も容量に余裕があるディスクは"/"なので、"path: /"に変更しています。ここで指定した値以外はデフォルトのままです。

||入力項目|値|
|---------|----|---|
|一般|名前|task-pv-volume|
||容量|20|
||単位|Gi|
||アクセスモード|一度だけの読み取り/書き込み|
||再利用ポリシー|保持|
||ストレージ・タイプ|ホスト・パス|
|パラメーター|キー|path|
||値|/|

参考：pathの値指定にダブルクォートは不要です。ICP上での作成自体は正常終了しますが、PersistentVolumeを使用する際にエラーになり正常にPodをDeployできません。画面例の様に値そのものを入力します。
![PV構成.png](https://qiita-image-store.s3.amazonaws.com/0/104507/59dbf590-6cbd-06cd-f25c-f53e7316b791.png)

参考：KubernetesのマニュアルにおけるPersistent Volumeの作成のためのyaml

```text:pods/storage/pv-volume.yaml
pods/storage/pv-volume.yaml 

kind: PersistentVolume
apiVersion: v1
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"
```

・参考：PV作成直後。状況はAvailableですが、請求(Claim)は割り当てられていません。
![PV作成直後.png](https://qiita-image-store.s3.amazonaws.com/0/104507/5697b5a5-9fb8-b857-804b-744cba7a6c07.png)

・Persistent Volume Claimは、Db2の構成時に指定することが可能なので、事前に作成する必要はない、と考えられます。しかし、私の環境では、事前作成しないとエラーが発生しました。したがって、この記事でも事前に、Persistent Volume Claimを[マニュアル](https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/#create-a-persistentvolumeclaim)を参考に作成します。名前空間は、Db2をInstallする際のターゲット名前空間と一致している必要があります。Storage Class名はsc.yamlで定義したlocal-storageを使用します。アクセス・モードが使用されるPersistent Volumeと同じである必要があります(本環境では上記のtask-pv-volumeと同じアクセス・モードである必要があります)。そうでないと、Persistent Volumeを使用できなくなり、PodがDeployされません。

|入力項目|値|
|---------|----|
|名前|task-pv-volume|
|名前空間|default|
|ストレージ・クラス名|local-storage|
|ストレージ要求|10|
|単位|Gi|
|アクセスモード|一度だけの読み取り/書き込み|

参考：KubernetesのマニュアルにおけるPersistent Volume Claimの作成のためのyaml

```text:pods/storage/pv-claim.yaml
pods/storage/pv-claim.yaml 

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

```

参考：PVC作成直後。状況はPendingで、PVは割り当てられていません。実際に、Db2のPodを作成するとPVが割り当てられます。
![PVC作成直後.png](https://qiita-image-store.s3.amazonaws.com/0/104507/5402ab66-758d-d3d2-3cd8-bd5620da410d.png)

・Helm Chartの構成をクリックし、Db2を構成します。構成後、InstallをクリックするとDb2のPodがDeployされます。

||入力項目|値|
|---------|----|---|
|構成|リリース名|yoshio-db2|
||ターゲット名前空間|default|
||使用条件を読んで、 内容に同意しました|チェックを入れる|
|Docker-registry secret|Secret Name|yoshio-secret|
|Service configuration|Service Type|NodePort|
|Db2 instance configuration|Db2 instance name|db2inst1|
|Database configuration options|Database Name|sample|
|Data persistence configuration|Enable persistence for this deployment|チェックを入れる|
|Data volume configuration|Name of the persistent volume claim|data-stor ※変更しない|
||Existing storage class name|local-storage|
||Size of the volume claim|5Gi|

参考：Installをクリック直後からしばらく時間が経過すると、準備完了が0/1→1/1、状況がContainerCreating→Runningになれば、正常にインストールされています。![Db2Install直後.png](https://qiita-image-store.s3.amazonaws.com/0/104507/6614473e-6926-3226-98e3-b3f18f728e73.png)

参考：PVCではPVとしてtask-pv-volumeが割り当てられていることを確認できます。
![PVCDb2.png](https://qiita-image-store.s3.amazonaws.com/0/104507/66007e6d-8656-ea43-09ae-f0f71efc6da8.png)

参考：PVでは請求にPVCとし名前空間がdefaultのtask-pv-claimが割り当てられていることを確認できます。
![PVDb2.png](https://qiita-image-store.s3.amazonaws.com/0/104507/a30a867a-d672-1db5-4f2a-bfd032f99d4b.png)

参考：Db2のPodの詳細では、クラスターIPが確認できます(例では10.0.0.35です)。
![Db2detail.png](https://qiita-image-store.s3.amazonaws.com/0/104507/841c64f1-9844-d777-ec14-38d5fde7a035.png)

参考：このDb2のPodはNodePortで構成したため、メモに記載されているコマンドを実行することで、外部から接続するためのURLを取得可能です(例ではjdbc:db2://192.168.11.130:/sampleです)。ただし、このままでは使えません。後述のオプションを参照ください。

```text:url.log
root@bootmaster1:~# export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services yoshio-db2-ibm-db2oltp-dev)
root@bootmaster1:~# export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
root@bootmaster1:~# echo jdbc:db2://$NODE_IP:$NODE_PORT/sample
jdbc:db2://192.168.11.130:/sample
```


#オプション１
・外部アプリケーションからの動作と接続の確認ため、先達の[サイト](https://symfoware.blog.fc2.com/?m&no=1331)のDb2のPodに接続するjavaソースを以下のように編集し実行してみました。IPアドレスとport番号は、前述のDb2のPodの詳細で確認します(50000:31658/TCPの31658の方が外部から接続するためのポート番号になります)。user、password、データベース名は構成した値を設定します。

        public static void main(String... args) throws Exception {
            
            String url = "jdbc:db2://192.168.11.130:31658/sample";
            String user = "db2inst1";
            String pass = "db2inst1";
            
            // Java 1.5ぐらいから自動でロードされる
            //Class.forName("com.ibm.db2.jcc.DB2Driver");
            
            try (Connection con = DriverManager.getConnection(url, user, pass);
                Statement stmt = con.createStatement()) {

実行結果

```text:接続確認.log
C:\Users\YOSHIOOno>"C:\Program Files\Java\jdk1.8.0_171\bin\javac.exe" Sample.java

C:\Users\YOSHIOOno>"C:\Program Files\Java\jdk1.8.0_171\bin\java.exe" -classpath "C:\Users\YOSHIOOno\db2jcc4.jar;." Sample
1
Javaからテスト登録
```

#オプション２
・ibm-websphere-libertyのPodをdeployする場合のDockerFile例

```text:Dockerfile
FROM websphere-liberty:webProfile7

COPY /server.xml            /config/

COPY /InfraTestForWLP.war   /config/dropins/

COPY /db2jcc4.jar         /IBM/DB2Driver/
```

・ibm-websphere-libertyのPodをdeployする場合のserver.xmlの例
Dockerfileで指定したjdbcドライバーのパス(例では/IBM/DB2Driver/)とserver.xmlのそれを一致させる必要があります。また、Db2のHelmリリースで確認し、server.xmlのservernameにクラスターIPアドレス(例では10.0.0.35、)、portNumber(例では50000)を設定します。クラスターIPアドレスとポート番号はPodがアクセスするための値であり、外部から接続するためのモノではありません。

```text:server.xmlの抜粋
    <authData id="任意のID" user="db2inst1" password="db2inst1"/>
・・・省略
        <properties.db2.jcc databaseName="sample" portNumber="50000" serverName="10.0.0.35"/>
・・・省略
            <fileset dir="/IBM/DB2Driver" includes="db2jcc4.jar"/>
・・・省略
        </library>
```

参考としてDb2にアクセスするJavaソースを引用させていただた皆様に謝意を表します。記事として作業内容を公開する際には、自分の名前をオブジェクト名に含めるのはやめたほうが良いという教訓を得ました。最後までご覧くださりありがとうございました。
[初め](https://qiita.com/yoshiono/items/37cfc8d035d8baf302d9)に戻る。