OpenShift on IBM CloudにDb2をStatefulSetで立ててみる

#1.概要
OpenShift on IBM Cloud上に、StatefulSetでDb2コンテナを立ててみた際の手順です。
事前準備として、下記からOpenShiftクラスタを作成します。
https://cloud.ibm.com/kubernetes/catalog/openshiftcluster

#2.構成
検証用のため、Worker NodeもPodも最小限のシングル構成としています。
![構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176470/7643dce6-4e3b-6441-6fb7-4218fefc8deb.png)


#3.手順
###3-1.Db2コンテナの準備
Db2のコンテナは、下記Docker Hubのバージョン11.5版を利用します。
https://hub.docker.com/r/ibmcom/db2

既存DBから抜いてきたDDLを流したいため、コンテナ内にDDLファイル類をコピーしています。

```ruby:Dockerfile
FROM ibmcom/db2
RUN mkdir /work
COPY DDL/ /work/DDL/
```

IBM Cloud Container Registryにbuild&pushします。
CLIでIBM Cloudにログインし、DockerファイルとDDLを配置しているディレクトリで下記コマンドを実行します。


```cmd
ibmcloud cr build -t jp.icr.io/<namespace>/db2:v1.0 .
```


###3-2.imagePullSecretの作成
前手順で、イメージはクラスタ外部のIBM Cloud Container Registry(ICCR)に配置しているため、OpenShiftクラスタがICCRからimageをpullできるようにSecretを準備します。

```cmd
ibmcloud oc cluster pull-secret apply --cluster <cluster_name>
```


参照：https://cloud.ibm.com/docs/openshift?topic=openshift-kubernetes-service-cli&locale=ja#cs_cluster_pull_secret_apply


###3-3.Service Accountの作成
3−1リンク先のDb2 Dockerは特権モードで起動していますが、OpenShiftではデフォルトでSCC(Security Context Constraints)がrestrictedで設定されているため、そのままでは起動できません。ここでは、Db2のStatefulSet向けにService Accountを作成し、特権モードを許可するようにSCCを設定します。
なお、事前にOpenShiftクラスタ内にCLIでログインし、projectを作成しています。

```cmd
oc create serviceaccount <sa_name>
oc adm policy add-scc-to-user privileged -n <project_name> -z <sa_name>
```



参照：https://cloud.ibm.com/docs/openshift?topic=openshift-openshift_apps&locale=ja#openshift_move_apps_example_scc

###3-4.StatefulSetのyaml作成
StatefulSetのyamlを準備します。
PV(Persistent Volume)が必要となりますが、ここではIBM CloudのBlockStorageをStatefulSetのデプロイ時に動的プロビジョニングします。

※事前にPV/PVCを作成する場合、StatefulSetではPVCの名前に命名規則があるので注意が必要です。`<volume_name>-<statefulset_name>-<replica_number>`
参照：https://cloud.ibm.com/docs/openshift?topic=openshift-block_storage#block_static_statefulset


※Storage Classの選択肢は下記を参照。ここでは検証用のため、2IOPSのbronzeの、さらにpvcの削除時もデータを保持するretainのStorage Classを選択しています。
参照：https://cloud.ibm.com/docs/openshift?topic=openshift-block_storage#block_storageclass_reference


```ruby:db2_statefulset.yaml
apiVersion: v1
kind: Service
metadata:
  name: db2
  labels:
    app: db2
spec:
  ports:
  - port: 50000
  selector:
    app: db2
  clusterIP: None
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: db2
spec:
  selector:
    matchLabels:
      app: db2
  serviceName: "db2"
  replicas: 1
#  podManagementPolicy: Parallel
  template:
    metadata:
      labels:
        app: db2
        billingType: "monthly"  # storageプロビジョニング用ラベル。"monthly" or "hourly"
        region: "jp-tok"        # storageプロビジョニング用ラベル。region指定
        zone: "tok02"　 　　　　　# storageプロビジョニング用ラベル。zone指定
    spec:
      serviceAccount: <sa_name> # SCC設定用ServiceAccount
      containers:
      - name: db2 
        securityContext:
          privileged: true　　　 # 特権モード
        image: jp.icr.io/<namespace>/db2:v1.0
        env:
        - name: LICENSE 
          value: accept 
        - name: DB2INSTANCE 
          value: db2inst1 
        - name: DB2INST1_PASSWORD 
          value: <password>
        - name: DBNAME
          value: <DB_name>
        ports:
        - containerPort: 50000
          name: db2
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - mountPath: /database
          name: db2vol
      imagePullSecrets:
      - name: <project_name>-jp-icr-io　 # 作成済みimagePullSecret名を指定
  volumeClaimTemplates:
  - metadata:
      name: db2vol　　　　　　# コンテナ内VolumeMountsのnameと揃える
    spec:
      accessModes:
      - ReadWriteOnce　　　　
      resources:
        requests:
          storage: 20Gi 　　# PVのサイズを指定
      storageClassName: ibmc-block-retain-bronze # Storage Classを指定
```

参照：https://cloud.ibm.com/docs/openshift?topic=openshift-block_storage#block_statefulset

###3-5.StatefulSetのデプロイ
StatefulSetをOpenShiftクラスタにデプロイします。

```cmd
oc apply -f db2_statefulset.yaml
```
###3-6.稼働確認
デプロイ＋PVの動的プロビジョニングが完了したら、Db2コンテナにログインしDDLを流します。

```shell
# pv/pvcの確認
oc get pv
oc get pvc
# project内のリソース(pod/service/statefulset)の確認
oc get all
# コンテナログイン
oc exec -it db2-0 /bin/bash
```

#4.まとめ
IBM CloudのOpenShiftクラスタにStatefulSetのDb2コンテナをシングル構成で立ててみるところまでできました。可用性や運用を考慮した構成は、Db2のOperator対応に期待したいと思います。