[OpenShift Container Platform][Kubernetes][亚马逊EKS][IBM Cloud Pak for Integration]

使用 IBM MQ Operator 配置多实例队列管理器

此示例通过使用 IBM® MQ Operator.部署了一个多实例队列管理器。 相互认证( TLS )用于身份验证,将 TLS 证书映射到队列管理器中的身份。

开始之前

要完成此示例,必须首先完成以下先决条件:

  • 在您的集群上为这个示例创建一个项目/命名空间。
  • 在命令行中登录到集群,然后切换到上述命名空间。
  • 确保 IBM MQ Operator 已安装并在以上名称空间中可用。

关于本任务

此示例提供了一个自定义资源 YAML 文件,用于定义待部署的队列管理器。 它还详细说明了在启用 TLS 的情况下部署队列管理器所需的额外步骤。

过程

  1. 确定合适的存储类
    集群 Kubernetes 中的存储可通过多种持久卷访问模式进行访问。 多实例队列管理器创建多个持久卷: 每个队列管理器一个持久卷,至少一个共享卷。 多实例队列管理器的共享卷必须使用 ReadWriteMany 存储类。 Kubernetes 集群中的缺省存储类通常用于 ReadWriteOnce 存储类 (块存储器)。 例如,如果您正在使用 Red Hat® OpenShift® Data Foundation,那么存储类 ocs-storagecluster-cephfs 将提供合适的共享文件系统。 文件系统的选择非常重要,因为并非所有共享文件系统都以相同的方式处理文件锁定。 参见 《多平台规划文件系统支持》《 IBM MQ 多实例队列管理器文件系统测试说明》
  2. 按照 《使用 OpenSSL 创建自签名PKI 》中的说明创建一对证书。
  3. 创建包含 MQSC 命令和 INI 文件的配置映射
    创建包含 MQSC 命令的 Kubernetes ConfigMap ,以创建新队列和 SVRCONN 通道,并添加允许访问该通道的通道认证记录。
    请确保您当前处于先前创建的命名空间中(参见 开始之前),然后通过命令行输入以下 YAML 内容,或可选地使用 Web Red Hat OpenShift 控制台 进行 如果你正在使用一个 Red Hat OpenShift 集群操作。
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: example-miqm-configmap
    data:
      example-tls.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') REPLACE 
        SET AUTHREC PROFILE('EXAMPLE.QUEUE') PRINCIPAL('app1') OBJTYPE(QUEUE) AUTHADD(BROWSE,PUT,GET,INQ)
      example-tls.ini: |
        Service:
            Name=AuthorizationService
            EntryPoints=14
            SecurityPolicy=UserExternal
    MQSC 定义了一个名为 MTLS.SVRCONN 的通道和一个名为 的 EXAMPLE.QUEUE队列。 该通道配置为仅允许向客户端提供证书,且该证书的"通用名称"为 example-app1。 这是在步骤2 中创建的其中一份证书中使用的通用名称。 此通道上具有此通用名称的连接被映射到用户ID, app1该用户ID被授权连接到队列管理器并访问示例队列。 INI文件启用了一项安全策略,这意味着用户 app1 ID无需存在于外部用户注册表中——它仅作为名称存在于此配置中。
  4. 部署队列管理器
    使用以下自定义资源 YAML 创建新的队列管理器。 开始此任务前,请确保您已处于之前创建的命名空间中。

    可用性类型设置 MultiInstance为,这将导致持久化存储被自动选中。

    切换 STORAGE_CLASS步骤 1中确定的存储类。

    请注意, example-qm-tls 密钥是在步骤2 中创建的,而 ConfigMapexample-miqm-configmap 是在步骤3 中创建的

    注: 以下 YAML 采用 许可证 IBM MQ Advanced ,但您也可以使用 IBM MQ 许可证。 有关详细信息,请参阅 《使用 IBM MQ 操作符通过 IBM MQ 许可证注释配置队列管理器 》。
    重要提示: 若您接受许可 IBM MQ Advanced 协议,请将 替换 accept: falseaccept: true。 有关许可证的详细信息,请参阅 mq.ibm.com/v1beta1: 当前许可证版本
    示例 QueueManager 用于 Red Hat OpenShift
    使用命令行或Web Red Hat OpenShift Container Platform 控制台,以以下配置部署队列管理器。
    apiVersion: mq.ibm.com/v1beta1
    kind: QueueManager
    metadata:
      name: exampleqm
    spec:
      license:
        accept: false
        license: L-NUUP-23NH8Y
        use: Production
      queueManager:
        name: EXAMPLEQM
        availability:
          type: MultiInstance
        mqsc:
        - configMap:
            name: example-miqm-configmap
            items:
            - example-tls.mqsc
        ini:
        - configMap:
            name: example-miqm-configmap
            items:
            - example-tls.ini
        storage:
          defaultClass: STORAGE_CLASS
      version: 9.4.5.0-r2
      pki:
        keys:
          - name: default
            secret:
              secretName: example-qm-tls
              items:
                - tls.key
                - tls.crt
                - ca.crt
    示例 QueueManager 用于 Amazon EKS

    Amazon EKS 集群上部署队列管理器时,请使用以下配置:

    apiVersion: mq.ibm.com/v1beta1
    kind: QueueManager
    metadata:
      name: exampleqm
    spec:
      license:
        accept: false
        license: L-NUUP-23NH8Y
        use: Production
      queueManager:
        name: EXAMPLEQM
        availability:
          type: MultiInstance
        mqsc:
        - configMap:
            name: example-miqm-configmap
            items:
            - example-tls.mqsc
        ini:
        - configMap:
            name: example-miqm-configmap
            items:
            - example-tls.ini
        storage:
          defaultClass: STORAGE_CLASS
        route:
          enabled: false
        metrics:
          serviceMonitor:
            enabled: false        
      version: 9.4.5.0-r2
      pki:
        keys:
          - name: default
            secret:
              secretName: example-qm-tls
              items:
                - tls.key
                - tls.crt
                - ca.crt
      web:
        enabled: false
        route:
          enabled: false
    spec.queueManager.route.enabled, spec.queueManager.metrics.serviceMonitor.enabled, 和 spec.web.route.enabled 被设置为 false ,因为这些是默认启 Red Hat OpenShift 用的特定功能。 这些功能必须在 Amazon EKS. 上明确禁用。
  5. 确认队列管理器正在运行
    现在正在部署队列管理器。 请先确认其处于 Running 状态,然后再继续。 例如:
    • 在以下环境中的 Red Hat OpenShift Container Platform部署:
      oc get qmgr exampleqm
      
    • 部署于 Amazon EKS
      kubectl get qmgr exampleqm
  6. 测试与队列管理器的连接
    要确认队列管理器已配置为支持 TLS 互通通信,请根据您的平台选择相应链接中的步骤操作:
  7. 强制活动 pod 失败
    要验证队列管理器的自动恢复,请模拟 pod 故障:
    1. 查看活动和备用 pod
      运行以下命令:
      • 在以下环境中的 Red Hat OpenShift Container Platform部署:
        oc get pods --selector app.kubernetes.io/instance=exampleqm
      • 部署于 Amazon EKS
        kubectl get pods --selector app.kubernetes.io/instance=exampleqm
      请注意,在 READY 字段中,活动 pod 返回值 1/1,而备用 pod 返回值 0/1
    2. 删除活动 pod
      运行以下命令,并指定活动 pod 的全名:
      • 在以下环境中的 Red Hat OpenShift Container Platform部署:
        oc delete <ACTIVE_POD> exampleqm-ibm-mq-<VALUE>
      • 部署于 Amazon EKS
        kubectl delete <ACTIVE_POD> exampleqm-ibm-mq-<VALUE>
    3. 再次查看 pod 状态(参见步骤 7.a )。
    4. 查看队列管理器状态
      运行以下命令并指定其他 pod 的全名:
      • 在以下环境中的 Red Hat OpenShift Container Platform部署:
        oc exec -t <POD> -- dspmq -x
      • 部署于 Amazon EKS
        kubectl exec -t <POD> -- dspmq -x
      您应该会看到状态显示活动实例已更改,例如:
      QMNAME(EXAMPLEQM)                                         STATUS(Running as standby)
          INSTANCE(exampleqm-ibm-mq-1) MODE(Active)
          INSTANCE(exampleqm-ibm-mq-0) MODE(Standby)
    5. 再次测试与队列管理器的连接
      注意: 您无需重复配置连接的步骤,只需执行向队列发送和从队列接收消息的操作即可

结果

您部署了一个采用相互 TLS 认证的多实例队列管理器,并验证了当活动Pod发生故障时,该队列管理器能够自动恢复。