OpenShift Operatorを使ってIBM MQをデプロイする

IBM MQ 9.2は、OpenShiftのOperatorに対応しており、簡単にクラスターにデプロイできるようになっている。  
基本的には以下の公式の手順に従えばよい。  
https://www.ibm.com/support/knowledgecenter/ja/SSFKSJ_9.2.0/com.ibm.mq.ctr.doc/ctr_install_uninstall.html

## カタログソースの追加

デフォルトのOperator HubにはIBM MQは表示されないことと思う。まずはカタログソースを追加する。  
以下のyamlファイルを作成する。  

```yaml:operator-source-cs.yaml
apiVersion: operators.coreos.com/v1alpha1
kind: CatalogSource
metadata:
  name: opencloud-operators
  namespace: openshift-marketplace
spec:
  displayName: IBMCS Operators
  publisher: IBM
  sourceType: grpc
  image: docker.io/ibmcom/ibm-common-service-catalog:latest
  updateStrategy:
    registryPoll:
      interval: 45m
```

```yaml:operator-source-ibm.yaml
apiVersion: operators.coreos.com/v1alpha1
kind: CatalogSource
metadata:
  name: ibm-operator-catalog
  namespace: openshift-marketplace
spec:
  displayName: ibm-operator-catalog 
  publisher: IBM Content
  sourceType: grpc
  image: docker.io/ibmcom/ibm-operator-catalog
  updateStrategy:
    registryPoll:
      interval: 45m
```

上記の2ファイルをクラスターに適用する。

```bash
$ oc apply -f operator-source-cs.yaml
catalogsource.operators.coreos.com/opencloud-operators created
$ oc apply -f operator-source-ibm.yaml
catalogsource.operators.coreos.com/ibm-operator-catalog created

$ oc get catalogsource -n openshift-marketplace
NAME                   DISPLAY                TYPE   PUBLISHER     AGE
certified-operators    Certified Operators    grpc   Red Hat       186d
community-operators    Community Operators    grpc   Red Hat       186d
ibm-operator-catalog   ibm-operator-catalog   grpc   IBM Content   28s
opencloud-operators    IBMCS Operators        grpc   IBM           59s
redhat-marketplace     Red Hat Marketplace    grpc   Red Hat       46d
redhat-operators       Red Hat Operators      grpc   Red Hat       186d
```

## Operator Groupの作成
Operatorのインストールは、デフォルトだとすべてのネームスペース（プロジェクト）に対して行われるが、今回は特定のネームスペースに限定する。特定のネームスペースに限定する場合は、そのネームスペースにOperator Groupを作成する必要があるようだ。

```yaml:mq-operator-group.yaml
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: ibm-mq-operator
  namespace: kame-test 
spec:
  targetNamespaces:
  - kame-test
```

```bash
$ oc apply -f mq-operator-group.yaml
operatorgroup.operators.coreos.com/ibm-mq-operator created
```

## Subscription Objectの作成
以下のyamlファイルを作成して適用する。チャネルのバージョンは現時点で最新の1.4とした。

```yaml:mq-sub.yaml 
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: ibm-mq
  namespace: kame-test 
spec:
  channel: v1.4
  name: ibm-mq 
  source: ibm-operator-catalog 
  sourceNamespace: openshift-marketplace
```
```bash
$ oc apply -f mq-sub.yaml
subscription.operators.coreos.com/ibm-mq created
```

## QMGRのデプロイ
まずはSWライセンス認証のためのシークレットを作成する。キーは以下のリンクから取得する(要IBM ID)。  
https://myibm.ibm.com/products-services/containerlibrary

```bash
$ oc create secret docker-registry ibm-entitlement-key -n kame-test \
--docker-server=cp.icr.io \
--docker-username=cp \
--docker-password=XXXXXXXXXXX \
--docker-email=XXXXXXXX
secret/ibm-entitlement-key created
```

QMGRデプロイ用のyamlを作成し、デプロイする。今回はとりあえず動くものをデプロイする目的で、永続ストレージは利用しない。実運用で利用する場合はyamlにボリューム情報を記載するのがよいと思われる。

```yaml:test-qmgr01.yaml
apiVersion: mq.ibm.com/v1beta1
kind: QueueManager
metadata:
  name: test-qmgr01
  namespace: kame-test
spec:
  version: 9.2.1.0-r1
  license:
    accept: true
    license: L-APIG-BMJJBM
  web:
    enabled: true
  queueManager:
    name: "QUICKSTART"
    storage:
      queueManager:
        type: ephemeral
  template:
    pod:
      containers:
       - name: qmgr
         env:
         - name: MQSNOAUT
           value: "yes"
```

```bash
$ oc apply -f test-qmgr01.yaml
queuemanager.mq.ibm.com/test-qmgr01 created
```

デプロイが成功すると、ステータスがRunningになる。
デフォルトだと1つのPodで1コア/1GBのメモリーを必要としているため、クラスターのリソース起因でPendingになっていないか確認するとよい。

```bash
$ oc get queuemanager -n kame-test
NAME          PHASE
test-qmgr01   Running
```

実体としては、StatefulSetとしてデプロイされていることが分かる。また、Routerが自動的に作成されている(Webコンソール用も含めて)。

```bash
$ oc get all -n kame-test
NAME                                               READY   STATUS    RESTARTS   AGE
pod/ibm-common-service-operator-769d788d44-wdjkc   1/1     Running   0          21m
pod/ibm-mq-7848fd4d66-b65t2                        1/1     Running   0          21m
pod/test-qmgr01-ibm-mq-0                           1/1     Running   0          4m53s

NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
service/ibm-mq-webhook               ClusterIP   172.21.187.212   <none>        443/TCP             21m
service/test-qmgr01-ibm-mq           ClusterIP   172.21.104.164   <none>        9443/TCP,1414/TCP   10m
service/test-qmgr01-ibm-mq-metrics   ClusterIP   172.21.222.188   <none>        9157/TCP            10m

NAME                                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ibm-common-service-operator   1/1     1            1           21m
deployment.apps/ibm-mq                        1/1     1            1           21m

NAME                                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/ibm-common-service-operator-769d788d44   1         1         1       21m
replicaset.apps/ibm-mq-7848fd4d66                        1         1         1       21m

NAME                                  READY   AGE
statefulset.apps/test-qmgr01-ibm-mq   1/1     10m

NAME                                                 HOST/PORT                                                                                                               PATH   SERVICES              PORT      TERMINATION   WILDCARD
route.route.openshift.io/test-qmgr01-ibm-mq-qm       test-qmgr01-ibm-mq-qm-kame-test.XXXXXXXXXXXXXXXXXXXXX.jp-tok.containers.appdomain.cloud           test-qmgr01-ibm-mq    1414      passthrough   None
route.route.openshift.io/test-qmgr01-ibm-mq-web      test-qmgr01-ibm-mq-web-kame-test.XXXXXXXXXXXXXXXXXXXXX.jp-tok.containers.appdomain.cloud          test-qmgr01-ibm-mq    9443      passthrough   None

NAME                                  PHASE
queuemanager.mq.ibm.com/test-qmgr01   Running
```

Podにログインすると、runmqscが実行可能になっています。

```bash
$ oc -n kame-test rsh test-qmgr01-ibm-mq-0 
sh-4.4$ 
sh-4.4$ runmqsc
5724-H72 (C) Copyright IBM Corp. 1994, 2020.
Starting MQSC for queue manager QUICKSTART.

dis q(*)
     1 : dis q(*)
AMQ8409I: Display Queue details.
   QUEUE(AMQ.600C0F612593CC02)             TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.ADMIN.ACCOUNTING.QUEUE)    TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.ADMIN.ACTIVITY.QUEUE)      TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.ADMIN.CHANNEL.EVENT)       TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.ADMIN.COMMAND.EVENT)       TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.ADMIN.COMMAND.QUEUE)       TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.ADMIN.CONFIG.EVENT)        TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.ADMIN.LOGGER.EVENT)        TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.ADMIN.PERFM.EVENT)         TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.ADMIN.PUBSUB.EVENT)        TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.ADMIN.QMGR.EVENT)          TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.ADMIN.STATISTICS.QUEUE)    TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.ADMIN.TRACE.ACTIVITY.QUEUE)
   TYPE(QLOCAL)                         
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.ADMIN.TRACE.ROUTE.QUEUE)   TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.AMQP.COMMAND.QUEUE)        TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.BROKER.ADMIN.STREAM)       TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.BROKER.CONTROL.QUEUE)      TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.BROKER.DEFAULT.STREAM)     TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.BROKER.INTER.BROKER.COMMUNICATIONS)
   TYPE(QLOCAL)                         
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.CHANNEL.INITQ)             TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.CHANNEL.SYNCQ)             TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.CHLAUTH.DATA.QUEUE)        TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.CICS.INITIATION.QUEUE)     TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.CLUSTER.COMMAND.QUEUE)     TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.CLUSTER.HISTORY.QUEUE)     TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.CLUSTER.REPOSITORY.QUEUE)
   TYPE(QLOCAL)                         
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.CLUSTER.TRANSMIT.MODEL.QUEUE)
   TYPE(QMODEL)                         
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.CLUSTER.TRANSMIT.QUEUE)    TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.DDELAY.LOCAL.QUEUE)        TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.DEAD.LETTER.QUEUE)         TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.DEFAULT.ALIAS.QUEUE)       TYPE(QALIAS)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.DEFAULT.INITIATION.QUEUE)
   TYPE(QLOCAL)                         
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.DEFAULT.LOCAL.QUEUE)       TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.DEFAULT.MODEL.QUEUE)       TYPE(QMODEL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.DEFAULT.REMOTE.QUEUE)      TYPE(QREMOTE)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.DOTNET.XARECOVERY.QUEUE)   TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.DURABLE.MODEL.QUEUE)       TYPE(QMODEL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.DURABLE.SUBSCRIBER.QUEUE)
   TYPE(QLOCAL)                         
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.HIERARCHY.STATE)           TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.INTER.QMGR.CONTROL)        TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.INTER.QMGR.FANREQ)         TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.INTER.QMGR.PUBS)           TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.INTERNAL.REPLY.QUEUE)      TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.INTERNAL.REQUEST.QUEUE)    TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.JMS.TEMPQ.MODEL)           TYPE(QMODEL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.MQEXPLORER.REPLY.MODEL)    TYPE(QMODEL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.MQSC.REPLY.QUEUE)          TYPE(QMODEL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.NDURABLE.MODEL.QUEUE)      TYPE(QMODEL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.PENDING.DATA.QUEUE)        TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.PROTECTION.ERROR.QUEUE)    TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.PROTECTION.POLICY.QUEUE)   TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.REST.REPLY.QUEUE)          TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.RETAINED.PUB.QUEUE)        TYPE(QLOCAL)
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.SELECTION.EVALUATION.QUEUE)
   TYPE(QLOCAL)                         
AMQ8409I: Display Queue details.
   QUEUE(SYSTEM.SELECTION.VALIDATION.QUEUE)
   TYPE(QLOCAL)                         

```