如何连接到部署到 OpenShift 的 IBM MQ?

2023-12-11

我有一个带有 IBM MQ 的容器(Docker 镜像ibmcom/mq/9.2.2.0-r1)暴露两个端口(9443 - 管理,1414 - 应用程序)。

OpenShift 中所有必需的设置均已完成(Pod、服务、路由)。

有两条路线,每个港口一条。

  • https://route-admin.my.domain
  • https://route-app.my.domain

相应地指向端口(外部端口默认为 http=80、https=443)。

可以通过第一个路由访问管理控制台,因此 MQ 已启动并正在运行。

我尝试作为客户端连接(JMS 2.0,com.ibm.mq.allclient:9.2.2.0)使用标准方法:

  var fctFactory = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
  var conFactory = fctFactory.createConnectionFactory();

  // ... other props

  conFactory.setObjectProperty(WMQConstants.WMQ_HOST_NAME, "route-app.my.domain");
  conFactory.setObjectProperty(WMQConstants.WMQ_PORT, 443);

并且连接失败。还尝试将路由重新定义为 HTTP 并使用端口 80,但再次没有成功。

如果有帮助,我们假设我们使用最新版本的 MQ Explorer 作为客户端。

每次都会出现相同的连接错误:

...
Caused by: com.ibm.mq.MQException: JMSCMQ0001: 
           IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2009' ('MQRC_CONNECTION_BROKEN').
... 
Caused by: com.ibm.mq.jmqi.JmqiException: 
           CC=2;RC=2009;AMQ9204: Connection to host 'route-app.my.domain(443)' rejected.
           [1=com.ibm.mq.jmqi.JmqiException[CC=2;RC=2009;AMQ9208: 
            Error on receive from host 'route-app.my.domain/10.227.248.2:443 (route-app.my.domain)'.
           [1=-1,2=ffffffff,3=route-app.my.domain/10.227.248.2:443 (route-app.my.domain),4=TCP]],
            3=route-app.my.domain(443),5=RemoteConnection.receiveTSH]
...
Caused by: com.ibm.mq.jmqi.JmqiException: CC=2;RC=2009;AMQ9208: 
           Error on receive from host 'route-app.my.domain/10.227.248.2:443

也许,这个article可以给出一些有关错误代码 2009 的提示,但仍然不确定到底是什么影响了 OpenShift 端的连接错误。

以前,我总是连接到 IBM MQ 并显式指定端口值,但这里的情况有点不同。
如何通过 TCP 连接到 OpenShift 集群中的 IBM MQ?


OpenShift中的配置如下:


kind: Pod
apiVersion: v1
metadata:
  name: ibm-mq
  labels:
    app: ibm-mq
spec:
  containers:
    - resources:
        limits:
          cpu: '1'
          memory: 600Mi
        requests:
          cpu: '1'
          memory: 600Mi
      name: ibm-mq
      ports:
        - containerPort: 1414
          protocol: TCP
        - containerPort: 9443
          protocol: TCP
  containerStatuses:
      image: 'nexus-ci/docker-lib/ibm_mq:latest'

---
   
kind: Service
apiVersion: v1
metadata:
  name: ibm-mq
spec:
  ports:
    - name: admin
      protocol: TCP
      port: 9443
      targetPort: 9443
    - name: application
      protocol: TCP
      port: 1414
      targetPort: 1414
  selector:
    app: ibm-mq

---

kind: Route
apiVersion: route.openshift.io/v1
metadata:
  name: ibm-mq-admin
spec:
  host: ibm-mq-admin.my-domain.com
  to:
    kind: Service
    name: ibm-mq
    weight: 100
  port:
    targetPort: admin
  tls:
    termination: passthrough
    insecureEdgeTerminationPolicy: None
  wildcardPolicy: None

---

kind: Route
apiVersion: route.openshift.io/v1
metadata:
  name: ibm-mq-app
spec:
  host: ibm-mq-app.my-domain.com
  to:
    kind: Service
    name: ibm-mq
    weight: 100
  port:
    targetPort: application
  tls:
    termination: passthrough
    insecureEdgeTerminationPolicy: None
  wildcardPolicy: None

---

UPDATE:最终创建并部署到 OpenShift 一个小型 Web 应用程序,接收 HTTP 请求并通过 JMS 与 MQ 交互(放置/获取文本消息),例如:

  • POST /queue/{queueName}/send + <body>;
  • GET /queue/{queueName}/receive.

它使用 TCP 与 OpenShift 集群内部的 MQ 交互,并像常规 Web 应用程序一样接受外部 HTTP 连接。
其他解决方案似乎需要太多努力,但我接受了其中一个,因为它在理论上是正确且简单的。


我不确定是否完全理解您的设置,但是"Routes"仅路由 HTTP 流量(仅在端口 80 或 443 上),而不路由 TCP 流量。
如果你想从集群外部访问你的MQ服务器,有几种解决方案,一种是创建一个类型的服务:"NodePort"

Doc: https://docs.openshift.com/container-platform/4.7/networking/configuring_ingress_cluster_traffic/configuring-ingress-cluster-traffic-nodeport.html

您的服务不是 NodePort 服务。在你的情况下,它应该是这样的

kind: Service
apiVersion: v1
metadata:
  name: ibm-mq
spec:
  type: NodePort
  ports:
    - port: 1414
      targetPort: 1414
      nodePort: 30001
  selector:
    app: ibm-mq

然后从外部使用anyname.:30001访问
并删除无用的对应路由。如前所述,我假设您阅读了我指给您的文档,该文档说路由仅路由端口 80 或 443 上的 HTTP 流量。

Doc: https://kubernetes.io/docs/concepts/services-networking/service/#nodeport

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何连接到部署到 OpenShift 的 IBM MQ? 的相关文章

随机推荐

  • CLI 中的 JUnit 测试等效项

    我编写了某些代码 但它并没有主要方法 但我想知道代码是否有问题 基本上我可以使用 Eclipse 中的 JUnit 测试用例来完成它 我使用的是 Linux 但我面临的情况是 我必须在目前没有 Eclipse 的 Windows 中测试它
  • 在 SQL 数据库上强制执行“零或一对一”关系?

    我有一个Post实体和一个FbPost entity Post FbPost为 null 或FbPost 并且没有两个Post实体可以引用相同的FbPost实体 换句话说 zero or one to one 强制执行此操作的正确方法是什么
  • 按分隔符分割字符串,但如果它被转义则不会

    如何用分隔符分割字符串 但如果它被转义则不能分割 例如 我有一个字符串 1 2 2 3 4 4 分隔符是 转义分隔符是 此外 我想忽略转义的反斜杠 所以在 the 仍然是一个分隔符 因此 使用上面的字符串 结果应该是 0 gt 1 1 gt
  • parsedhtml 不再响应

    因此 我尝试从网站获取一些文本 一旦我尝试使用 ParsedHtml 返回对象 powershell 就会停止响应 即使我让它在后台运行几分钟 它也不会再执行任何操作 造成这种情况的原因是什么 PS P gt url mywebsite P
  • Flask:当 flash() 位于 @app.before_request 中时获取随机重复的 flash 消息

    当我在 app before request 中使用 flash 时 我得到的似乎是随机数量的重复条目 一遍又一遍地刷新页面会给我 1 到 4 条重复的消息 没有任何重定向 我的代码很简单 if app config INSTANCE DE
  • 避免 html 模板中的自动转义

    尝试使用 URL 呈现 HTML 模板 问题是 URL 中包含 而这些字符被转义了 我尝试使用template URL http myurl com data aaa jpg 并且template HTML http myurl com d
  • 从 numpy 数组中分离出最大/最小的标记补丁

    我有一个大的 numpy 数组 并用 scipy 中的连接组件标签对其进行标记 现在我想创建这个数组的子集 其中只留下尺寸最大或最小的标签 当然 这两个极值都可能出现多次 import numpy from scipy import ndi
  • React Hook 中使用 setInterval() 的 Javascript 闭包

    在下面的示例中 我预计控制台中的计数值将像 UI 中一样增加 然而事实并非如此 该值始终为0 但UI中的值却增加了 我知道这个问题可能与 Javascript Closure 有关 在我的理解中 count应参考中的值useState 自从
  • Angular 4.3.4 破坏了 mdInput 和 md-input-container

    我的团队最近从 4 3 0 升级到 Angular 4 3 3 在这些更改之后 mdInput 和 md input container 不再正常工作 在您单击输入字段之前 动画将按照material angular io componen
  • 在 NHibernate / SQL Server 中自动截断字符串

    我在 SQL Server 2005 数据库中有一个 nvarchar 2000 列 并将其映射到 NHibernate 中 如下所示
  • XE5 Android TBitmap.LoadFromStream 在线程内失败

    我正在使用 Delphi XE5 创建一个简单的 Android 游戏 我有一些资源 PNG 和 Jpeg 我想在我的程序加载所有资源时显示加载屏幕 但我发现将 TBitmap LoadFromFile 或 TBitmap LoadFrom
  • Thymeleaf 表单使用 ArrayList 对象提交

    我编写了一个简单的程序 用于表单提交 并将数据 ArrayList 从表发送到控制器类 提交表单时 数据始终为空 不确定我在这里做错了什么 我几乎花了很多时间来确定问题 但运气不佳 控制器类 我在 Post 方法中总是得到 null pub
  • magento multistore子文件夹没有符号链接

    是否可以设置带有子文件夹 子目录的 magento 多重商店而无需创建符号链接 For example www mainstore www mainstore store1 www mainstore store2 www mainstor
  • Pandas:如何将年度数据相互叠加

    我有一系列按时间值 浮点数 索引的数据 我想获取该系列的块并将它们绘制在彼此之上 举例来说 假设我在 20 周的时间内大约每 10 分钟获取一次股票价格 并且我想通过绘制 20 条股票价格线来查看每周模式 所以我的 X 轴是一周 我有 20
  • Android中计算用户移动速度

    我需要计算用户移动的速度 所以我们需要两件事来计算速度 GPS and Accelerometer 但两者都有其局限性 1 GPS并非始终可用 虽然我始终获取用户的当前位置 但我从Network provider仅而不是来自GPS 2 Ac
  • 使用 magrittr 管道前向运算符传递参数两次

    这是一个让我烦恼的虚拟例子 在vanilla会议 library magrittr test gt is na 1 FALSE test gt nchar gt 3 1 TRUE test gt is na 1 FALSE test gt
  • 对一维数据使用什么聚类算法? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我有一个数组中的数字列表 每个元素的索引是 X 值是 Y 我如何对这些数据进行分
  • Adobe Air - 检查互联网连接

    我正在使用 Adob e Flash CS 5 构建 Air 应用程序 我需要检查互联网连接是否可用 我遇到了这个错误 1172 找不到air net 定义 1046 未找到类型或不是编译时常量 URLMonitor 这是我的代码 impo
  • MySQL:复合索引全文+btree?

    我想要一个查询 它对一个字段进行全文搜索 然后对不同的字段进行排序 想象一下搜索一些文本文档并按发布日期排序 该表大约有 17M 行 它们在日期上或多或少均匀分布 这将在 Web 应用程序请求 响应周期中使用 因此查询最多必须在 200 毫
  • 如何连接到部署到 OpenShift 的 IBM MQ?

    我有一个带有 IBM MQ 的容器 Docker 镜像ibmcom mq 9 2 2 0 r1 暴露两个端口 9443 管理 1414 应用程序 OpenShift 中所有必需的设置均已完成 Pod 服务 路由 有两条路线 每个港口一条 h