[OpenShift Container Platform][Kubernetes][IBM MQ Advanced]

示例:使用 IBM MQ Operator 部署简单的本地 HA CRR 配置

本示例使用简单的本地 HA 跨区域复制 (CRR) 配置,通过 IBM® MQ Operator 将队列管理器部署到 OpenShift® Container Platform。

开始之前

要完成此示例,必须首先完成以下步骤:

  • 在命令行上登录正在使用的 OpenShift Container Platform (OCP) 群集。
  • 为此示例创建两个 OCP 项目/命名空间。 示例将提及伦敦和罗马网站。 这些指的是伦敦和罗马在一个群集中的两个命名空间,或者是每个站点在每个群集中的一个命名空间。
  • 确保在群集中安装了 IBM MQ Operator 3.5.0 或更高版本,并在命名空间中可用。
  • 确保已安装 OpenSSL 命令行工具。
  • 通过创建拉取机密任务来完成准备使用 Kubernetes
  • 阅读 " 使用 IBM MQ 操作符部署简单队列管理器" ,以便熟悉 IBM MQ 操作符的使用。

关于本任务

本地 HA CRR 配置定义了两个本地 HA 组,它们共同组成一个高可用性队列管理器。 这些组通常部署在不同地点的两个 OCP 集群中,但本示例允许您根据需要将这两个组部署到同一个集群中。 有关本地 HA CRR 的概述,请参阅本地 HA 跨区域复制

为简单起见,本例使用单个证书来保护所有队列管理器复制流量,该证书名为 nhacrr-qm-replication。

要了解如何在 Native HA CRR 中使用证书,以及如何使用不同证书确保组和实例流量的安全,请参阅示例:使用 Native HA CRR 的多个 TLS 证书

显示配置示例

重要提示: 这些示例旨在帮助您入门,并不适合生产环境。 对于高级用户来说,证书管理是一个复杂的课题。 在生产过程中,你必须考虑轮换、撤销、密钥长度、灾难恢复等问题。

本例提供自定义资源 YAML,用于定义两个提供跨区域复制的本地 HA 组。

过程

  1. 创建用于队列管理器复制流量的证书。

    使用以下命令创建私钥,并用它为内部证书颁发机构颁发自签名证书。 然后为队列管理器创建私钥和证书,并与内部证书颁发机构签署:

    openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:4096 -out nhacrr-ca.key
    openssl req -x509 -new -nodes -key "nhacrr-ca.key" -sha512 -days 30 -subj "/CN=nhacrr-selfsigned-ca" -out nhacrr-ca.crt
    openssl req -new -nodes -out nhacrr-qm-replication.csr -newkey rsa:4096 -keyout nhacrr-qm-replication.key -subj "/CN=nhacrr-qm-replication"
    openssl x509 -req -in nhacrr-qm-replication.csr -CA nhacrr-ca.crt -CAkey nhacrr-ca.key -CAcreateserial -out nhacrr-qm-replication.crt -days 7 -sha512
    

    有关这些命令的更多信息,请参阅使用 OpenSSL 创建自签名 PKI

  2. 创建两个 Kubernetes 保密文件,其中包含队列管理器密钥和证书。 在罗马和伦敦站点上创建名为 nhacrr-qm-replication 的秘密,用于存储队列管理器实例的密钥和证书。

    使用以下命令创建秘密。 在运行该命令前,先切换到每个命名空间(先是罗马,然后是伦敦)。

    kubectl create secret generic nhacrr-qm-replication --type="kubernetes.io/tls" --from-file=tls.key=nhacrr-qm-replication.key --from-file=tls.crt=nhacrr-qm-replication.crt --from-file=nhacrr-ca.crt
    
  3. 按照使用 OpenSSL 创建自签名 PKI 中的描述,为队列管理器流量创建一对证书。 在罗马和伦敦站点上创建密文(即图中名为 mq-channel 和 client-app 的证书)。
  4. 为罗马和伦敦创建一个包含 MQSC 命令和 INI 文件的配置地图。 创建 ConfigMap 资源,其中包含 MQSC 命令,用于创建新的持久消息队列和 SVRCONN 通道,并添加允许访问通道的通道验证记录。 在 Rome 网站上,在 OCP 网络控制台输入以下 YAML,选择 ConfigMaps ,然后创建 ConfigMap, 或使用 oc apply 命令。 在伦敦站点重复上述步骤:
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: nhacrr-configmap
    data:
      nhacrr.mqsc: |
        DEFINE CHANNEL('MTLS.SVRCONN') CHLTYPE(SVRCONN) SSLCAUTH(REQUIRED) SSLCIPH('ANY_TLS13_OR_HIGHER') REPLACE
        SET CHLAUTH('MTLS.SVRCONN') TYPE(SSLPEERMAP) SSLPEER('CN=*') USERSRC(NOACCESS) ACTION(REPLACE)
        SET CHLAUTH('MTLS.SVRCONN') TYPE(SSLPEERMAP) SSLPEER('CN=example-app1') USERSRC(MAP) MCAUSER('app1') ACTION(REPLACE)
        SET AUTHREC PRINCIPAL('app1') OBJTYPE(QMGR) AUTHADD(CONNECT,INQ)
        DEFINE QLOCAL('EXAMPLE.QUEUE') DEFPSIST(YES) REPLACE 
        SET AUTHREC PROFILE('EXAMPLE.QUEUE') PRINCIPAL('app1') OBJTYPE(QUEUE) AUTHADD(BROWSE,PUT,GET,INQ)
      nhacrr.ini: |
        Service:
            Name=AuthorizationService
            EntryPoints=14
            SecurityPolicy=UserExternal

    MQSC 定义了一个名为 MTLS.SVRCONN 的通道和一个名为 EXAMPLE.QUEUE 的队列。 通道被配置为只允许提交 CN 为 example-app1 的证书(如步骤 3 中创建的证书)的客户端访问。

  5. 部署本地 HA 恢复组。 在 Rome 网站上创建一个新的恢复组。 确保处于 rome 命名空间,然后在 OCP 网络控制台输入以下 YAML,创建 QueueManager, 或使用 oc apply 命令。 检查是否指定了正确的许可证,并通过将 false 更改为 true 来接受许可证。
    注意: 必须在实时组和恢复组中使用相同的队列管理器名称。 默认情况下,如果不指定 .spec.queuemanager.name ,则默认为 .metadata.name。 您可以使用以下方法之一实现名称匹配:
    • 在每个群集中为队列管理器资源命名相同的名称(即 .metadata.name 匹配),并且不要覆盖名称
    • .metadata.name 中单独命名队列管理器,并用 .spec.queuemanager.name 覆盖该名称,以便两个站点的名称一致。

    在本例中,使用 .metadata.name 将队列管理器名称设置为 exampleqm

    apiVersion: mq.ibm.com/v1beta1
    kind: QueueManager
    metadata:
      name: exampleqm
      labels:
        role: Recovery
    spec:
      license:
        accept: false
        license: L-NUUP-23NH8Y
        use: Production
      queueManager:
        name: EXAMPLEQM
        availability:
          type: NativeHA
          tls:
            secretName: nhacrr-qm-replication
          nativeHAGroups:
            local:
              name: "rome"
              role: "Recovery"
        mqsc:
        - configMap:
            name: nhacrr-configmap
            items:
            - nhacrr.mqsc
        ini:
        - configMap:
            name: nhacrr-configmap
            items:
            - nhacrr.ini
        storage:
          queueManager:
            type: persistent-claim
      version:  9.4.2.0-r1
      pki:
        keys:
          - name: default
            secret:
              secretName: example-qm-tls
              items:
                - tls.key
                - tls.crt
                - ca.crt
  6. 验证恢复组是否已正确部署:
    1. 发出 oc get qmgr exampleqm 命令显示队列管理器资源,等待队列管理器运行。 您将看到以下信息:
      NAME             PHASE
      exampleqm   Running
    2. 队列管理器运行后,使用 oc get pods 命令检查 pod 的状态。 一个 pod 应处于就绪状态:
      NAME                 READY   STATUS    RESTARTS   AGE
      exampleqm-ibm-mq-0   1/1     Running   0          2m45s
      exampleqm-ibm-mq-1   0/1     Running   0          2m45s
      exampleqm-ibm-mq-2   0/1     Running   0          2m45s
    3. 使用 oc exec -t <leader-pod> -- dspmq -o nativeha -g 查看恢复组的状态,其中 <leader-pod> 是就绪 1/1 pod 的名称(示例中为 exampleqm-ibm-mq-0 )。
      QMNAME(EXAMPLEQM)                                         ROLE(Leader) INSTANCE(exampleqm-ibm-mq-0) INSYNC(yes) QUORUM(1/3) GRPLSN() GRPNAME(rome) GRPROLE(Recovery)
       GRPNAME(rome) GRPROLE(Recovery) GRPADDR(Unknown) GRPVER(9.4.2.0) GRSTATUS(Waiting for connection) RCOVLSN() RCOVTIME() BACKLOG(Unknown) INSYNC(Unknown) SYNCTIME() ALTDATE(2025-04-25) ALTTIME(13.48.15)
      

      这一地位的关键部分是

      • Role(Leader)
      • QUORUM(1/3) - 在实时组和恢复组连接之前,该值保持为 1/3
      • GRSTATUS(Waiting for connection) - 在 Live 群组连接时更新
  7. 部署本地 HA Live 组。 现场小组部署在伦敦现场:
    要在伦敦站点创建新的实时群组,请确保处于正确的命名空间,然后在 OCP 网络控制台或使用命令行输入以下 YAML。 检查是否指定了正确的许可证,并通过将 false 更改为 true 来接受许可证。
    apiVersion: mq.ibm.com/v1beta1
    kind: QueueManager
    metadata:
      name: exampleqm
      labels:
        role: Live
    spec:
      license:
        accept: false
        license: L-NUUP-23NH8Y
        use: Production
      queueManager:
        name: EXAMPLEQM
        availability:
          type: NativeHA
          tls:
            secretName: nhacrr-qm-replication
          nativeHAGroups:
            local:
              name: "london"
              role: "Live"
            remotes:
              - name: "rome"
                addresses:
                  - "<rome group hostname>:443"
        mqsc:
        - configMap:
            name: nhacrr-configmap
            items:
            - nhacrr.mqsc
        ini:
        - configMap:
            name: nhacrr-configmap
            items:
            - nhacrr.ini
        storage:
          queueManager:
            type: persistent-claim
      version: 9.4.2.0-r1
      pki:
        keys:
          - name: default
            secret:
              secretName: example-qm-tls
              items:
                - tls.key
                - tls.crt
                - ca.crt
    更新 YAML 中指定实时组用于连接恢复组的地址(示例中为"<rome group hostname>:443 ")。 用 Rome 网站上 exampleqm-ibm-mq-nhacrr 路由的 host 属性替换它。 要检索该属性,请确保您在 Rome 网站上,并使用以下命令检索 nhacrr 路由主机名:
    oc get route exampleqm-ibm-mq-nhacrr --template="{{.spec.host}}"
    注:

    部署 CRR 组时创建了两条路由,一条以 qm 结尾,另一条以 nhacrr 结尾。 qm 路由用于向队列管理器发送信息, nhacrr 路由用于组与组之间的通信。 始终将 nhacrr 路由的主机地址添加为 YAML 中组的远程地址。

  8. 验证实时组和跨区复制。 重复步骤 6 中的操作,但这次是针对伦敦组。
    1. 发出 oc get qmgr exampleqm 命令显示队列管理器资源,等待队列管理器运行。 您将看到以下信息:
      NAME             PHASE
      exampleqm   Running
    2. 队列管理器运行后,使用 oc get pods 命令检查 pod 的状态。 一个 pod 应处于就绪状态:
      NAME                 READY   STATUS    RESTARTS   AGE
      exampleqm-ibm-mq-0   1/1     Running   0          2m45s
      exampleqm-ibm-mq-1   0/1     Running   0          2m45s
      exampleqm-ibm-mq-2   0/1     Running   0          2m45s
    3. 使用 oc exec -t <active-pod> -- dspmq -o nativeha -g 查看 Live 组的状态,其中 <active-pod> 是就绪 1/1 pod 的名称(示例中为 exampleqm-ibm-mq-0 )。
      QMNAME(EXAMPLEQM)                                         ROLE(Active) INSTANCE(exampleqm-ibm-mq-0) INSYNC(yes) QUORUM(3/3) GRPLSN(<0:0:87:58322>) GRPNAME(london) GRPROLE(Live)
       GRPNAME(london) GRPROLE(Live) GRPADDR(Unknown) GRPVER(9.4.2.0) GRSTATUS(Normal) RCOVLSN(<0:0:87:58322>) RCOVTIME(2025-05-16T14:27:09.051799Z) INITLSN(<0:0:9:4696>) INITTIME(2025-05-12T16:58:13.582274Z) LIVETIME(2025-05-12T16:58:16.319844Z) ALTDATE(2025-05-16) ALTTIME(14.27.10)
       GRPNAME(rome) GRPROLE(Recovery) GRPADDR(exampleqm-ibm-mq-nhacrr-<namespace>.apps.<cluster>) GRPVER(9.4.2.0) CONNGRP(yes) GRSTATUS(Normal) RCOVLSN(<0:0:87:58322>) RCOVTIME(2025-05-16T14:27:09.051799Z) BACKLOG(0) INSYNC(yes) SYNCTIME(2025-05-16T14:28:38.084565Z) ALTDATE(2025-05-16) ALTTIME(14.28.31)

      这一地位的关键部分是

      • Role(Active)
      • QUORUM(3/3) - 直播小组的法定人数已满
      • GRSTATUS(Normal)
    4. 在 Rome 网站上使用 oc exec -t <leader-pod> -- dspmq -o nativeha -g 命令,再次检查恢复组的状态。
      QMNAME(EXAMPLEQM)                                         ROLE(Leader) INSTANCE(exampleqm-ibm-mq-0) INSYNC(yes) QUORUM(3/3) GRPLSN(<0:0:87:58322>) GRPNAME(rome) GRPROLE(Recovery)
       GRPNAME(rome) GRPROLE(Recovery) GRPADDR(exampleqm-ibm-mq-nhacrr-<namespace>.apps.<cluster>) GRPVER(9.4.3.0) GRSTATUS(Normal) RCOVLSN(<0:0:87:58322>) RCOVTIME(2025-05-16T14:27:09.051799Z) BACKLOG(0) INSYNC(yes) SYNCTIME(2025-05-16T14:30:40.134627Z) ALTDATE(2025-05-16) ALTTIME(14.27.17)
       GRPNAME(london) GRPROLE(Live) GRPADDR(Unknown) GRPVER(9.4.3.0) CONNGRP(yes) GRSTATUS(Normal) RCOVLSN(<0:0:87:58322>) RCOVTIME(2025-05-16T14:27:09.051799Z) INITLSN(<0:0:9:4696>) INITTIME(2025-05-12T16:58:13.582274Z) LIVETIME(2025-05-12T16:58:16.319844Z) ALTDATE(2025-05-16) ALTTIME(14.30.41)
      
      请注意, QUORUM(3/3)GRSTATUS(Normal) 字段已更新。
  9. 测试与队列管理器的连接。 要确认队列管理器已配置且可用,请按照 " 测试从笔记本电脑到队列管理器的 TLS 互连 "中的步骤操作,确保队列管理器主机名(在步骤 2 中确定)是伦敦站点路由的主机名。
  10. 将远程地址添加到本地 HA 恢复组。 当 Rome 成为实时群组时,它需要知道 London 的远程地址,以便作为恢复群组连接到 London。 要添加此功能,请更新罗马站点的 spec.queueManager.availability.nativeHAGroups ,在本地协议下方添加以下内容:
              remotes:
                - name: "london"
                  addresses:
                  - "<london group hostname>:443"
    将地址替换为伦敦站点 exampleqm-ibm-mq-nhacrr 路由的主机属性。 确保您位于伦敦站点,并使用以下命令获取 nhacrr 路由的主机名:
    oc get route exampleqm-ibm-mq-nhacrr --template="{{.spec.host}}"
    更新完成后,等待 pod 重新启动、运行,并等待一个 pod 成为准备就绪的 1/1 pod。
  11. 将 Rome 网站主机名添加到 ccdt.json 文件。 切换后,罗马成为实时站点,客户需要连接到罗马的群组。 将 Rome 的主机名添加到 ccdt.json 文件可方便重新连接。

    确保你在 Rome 网站上,并使用以下命令获取 qm 路由的主机名:

    oc get route exampleqm-ibm-mq-qm --template="{{.spec.host}}"
    注意: 有两条路由,在这种情况下,应使用报文流量的路由。 您应将 qm 路由的主机地址添加到 ccdt.json 文件中。
    ccdt.json 文件中,在连接列表中添加第二个主机名和端口对,这样连接列表就会变成这样:
    "connection":
                    [
                        {
                            "host": "<hostname from London qm route>",
                            "port": 443
                        },
                        {
                            "host": "<hostname from Rome qm route>",
                            "port": 443
                        }
                    ],
  12. 向队列中添加一些持续信息。 ConfigMap 中指定的 mqsc 文件中定义的队列具有 DEFPSIST(YES) 属性,因此放入队列的所有报文都将是持久的,并复制到恢复组。 使用以下命令将信息放入队列:
    /opt/mqm/samp/bin/amqsputc EXAMPLE.QUEUE EXAMPLEQM
    如果与队列管理器的连接成功,则输出以下响应:
    target queue is EXAMPLE.QUEUE

    输入一些文字,然后每次都按回车键 ,即可将多条信息放入队列。 按两次回车键完成。

  13. 执行从伦敦的实时组到罗马的恢复组的托管切换,以证明本地 HA - CRR 设置是正确的。 请按照 " 在本地 HA CRR 配置上完成计划的切换 "中的说明进行操作。 在更新 "实时 "组和 "恢复 "组的角色时,您可能会发现在 YAML 中更新 metadata.labels.role 以反映您的更改非常有用,但这对于切换来说并非必要。 完成切换后,您可以在罗马检索新实时群组中的信息。

    有关故障切换和切换的更多信息,请参阅本地 HA CRR 切换和故障切换

  14. 运行以下命令,检索切换前发送的信息:
    /opt/mqm/samp/bin/amqsgetc EXAMPLE.QUEUE EXAMPLEQM

    您在步骤 11 中添加的信息可用,并将输出。 几秒钟后,命令退出。

后续操作

维护完成后,可以通过重复步骤 12 和 13 中的过程切换回原来的实时组。

您还可以按照在本机 HA CRR 配置上完成计划外故障转移中的说明尝试计划外故障转移。

要进一步了解如何使用不同证书保护 CRR 配置的不同部分,请参阅示例:使用 Native HA CRR 的多个 TLS 证书