文章

在K8S中安裝開發用IBM MQ

首先建立一個namespace來安裝

1
kubectl create namespace ibmmq

建立一個PV提供MQ做使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pv.yaml內容
apiVersion: v1
kind: PersistentVolume
metadata:
  name: ibmmq-pv1
  labels:
    type: local
spec:
  storageClassName: ibmmq-storage-class
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    #在本機上開個資料夾給PV用
    path: "/someWhere"
1
kubectl apply -f pv.yaml

我們希望每次POD啟動都可以抓到相同的PV,所以使用StatefulSet,為了創建StatefulSet,需要先創建一個Headless Service。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#headless.yaml內容
apiVersion: v1
kind: Service
metadata:
  name: ibmmq-headless-server
  namespace: ibmmq
  labels:
    app: ibmmq
spec:
  ports:
  - name: ibmmq-port
    port: 1414
  - name: console-port
    port: 9443
  clusterIP: None
  selector:
    app: ibmmq
1
kubectl apply -f headless.yaml

再來是創建StatefulSet,Docker Hub上面的ibmcom/mq已經deprecated,現在移到IBM Container Registry。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#ibmmq.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: ibmmq
  namespace: ibmmq
spec:
  selector:
    # 必須與 ".spec.template.metadata.labels" 相同
    matchLabels:
      app: ibmmq
  serviceName: "ibmmq"
  replicas: 1
  template:
    metadata:
      # 必須與 ".spec.selector.matchLabels" 相同
      labels:
        app: ibmmq
    spec:
      securityContext:
        fsGroup: 1001
      terminationGracePeriodSeconds: 10
      containers:
      - name: ibmmq
        image: icr.io/ibm-messaging/mq:9.2.5.0-r1
        ports:
        - containerPort: 1414
          name: ibmmq
        - containerPort: 9443
          name: console
        # 指定將 pvc 掛載到特定的目錄上
        volumeMounts:
        - name: data
          mountPath: /mnt/mqm
        env:
        - name: LICENSE
          value: accept
        - name: MQ_QMGR_NAME
          value: QM_1
#指定admin跟app的密碼,測試用,這邊改用secret會比較合理
        - name: MQ_ADMIN_PASSWORD
          value: passw0rd
        - name: MQ_APP_PASSWORD
          value: passw0rd
  # 使用 persistent volume 來確保資料不會因為 pod reschedule 而消失
  # 以下是使用 volumeClaimTemplates + StorageClass 來完成
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "ibmmq-storage-class"
      resources:
        requests:
          storage: 5Gi

IBM MQ container會用UID 1001來執行(參考這),我們mount了/mnt/mqm來給IBM MQ使用,如果沒有改權限,就會無法正常運作,首先試了initContainer,總是會報錯誤,後來改用mount options,但mount options不支援local的模式,後來終於找到可以用securityContext解決,設定fsGroup: 1001,則/mnt/mqm的owner就會是1001。

再來我是用NodePort的模式試圖把1414跟9443開通給本機連線,不過minikube似乎無法直接這麼做,我還是只能使用port forward或minikube service來連接,所以下面這個service做了也沒效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: v1
kind: Service
metadata:
  name: ibmmq-service
  namespace: ibmmq
  labels:
    app: ibmmq
spec:
  type: NodePort
  ports:
  - name: ibmmq-port
    protocol: "TCP"
    port: 1414
    nodePort: 30000
    targetPort: 1414
  - name: console-port
    protocol: "TCP"
    port: 9443
    nodePort: 30001
    targetPort: 9443
  selector:
    app: ibmmq

透過Lens Desktop來開Port Forward也很方便

可以選擇直接打開browser跟使用https,比minikube service方便多了,不能指定https,打開browser就變成做白工。

9443是內建web console的入口,Lens打開browser就會到console的登入畫面,預設帳號是admin,密碼是pod環境變數MQ_ADMIN_PASSWORD的內容,若沒有設定則預設passw0rd,成功登入後就會看到下面的畫面:

再來要開1414的Port-Forwarding,測試IBM MQ Explorer是否可以正常連接,這個image啟動後會建立兩條channel

成功了

用MQ Explorer試著放一筆訊息,然後web console來檢視

這次用到的範例YAML檔案可以在這裡找到。

本文章以 CC BY 4.0 授權