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も最小限のシングル構成としています。

3.手順

3-1.Db2コンテナの準備

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

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

Dockerfile
FROM ibmcom/db2
RUN mkdir /work
COPY DDL/ /work/DDL/

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

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

3-2.imagePullSecretの作成

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

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を作成しています。

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

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クラスタにデプロイします。

oc apply -f db2_statefulset.yaml

3-6.稼働確認

デプロイ+PVの動的プロビジョニングが完了したら、Db2コンテナにログインしDDLを流します。

# 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対応に期待したいと思います。