首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何连接到部署到OpenShift的IBM?

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

Stack Overflow用户
提问于 2021-06-10 18:36:32
回答 2查看 1.9K关注 0票数 2

我有一个带有IBM (Docker ibmcom/mq/9.2.2.0-r1)的容器,它公开了两个端口(9443 - admin,1414 -应用程序)。

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

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

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

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

我尝试使用标准方法作为客户机(JMS2.0,com.ibm.mq.allclient:9.2.2.0)进行连接:

代码语言:javascript
运行
复制
  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,但没有成功。

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

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

代码语言:javascript
运行
复制
...
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

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

以前,我总是连接到IBM,显式地指定一个端口值,但是这里有一些不同的情况。

如何通过TCP?连接OpenShift集群中的IBM MQ

OpenShift中的配置如下:

代码语言:javascript
运行
复制
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

---

更新:最终创建并部署了一个小型web应用程序,该应用程序接收HTTP请求并通过JMS与MQ交互(put/get文本消息),如下所示:

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

它使用TCP与OpenShift集群中的MQ进行交互,并接受外部HTTP连接作为常规web应用程序。

其他解决方案似乎需要太多的努力,但我接受其中一个,因为它在理论上是正确和直截了当的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-10 20:00:18

我不确定完全理解您的设置,但是"Routes"只路由HTTP流量(端口80或443 onyl),而不是TCP流量。

如果您想从集群外部访问MQ服务器,有几种解决方案,一种是创建类型为:"NodePort"的服务。

医生:traffic/configuring-ingress-cluster-traffic-nodeport.html

您的服务不是NodePort服务。在你的例子中,应该是这样的

代码语言:javascript
运行
复制
kind: Service
apiVersion: v1
metadata:
  name: ibm-mq
spec:
  type: NodePort
  ports:
    - port: 1414
      targetPort: 1414
      nodePort: 30001
  selector:
    app: ibm-mq

然后用任何名字从外面进入。:30001。

并删除无用的相应路由。如前所述,我假设您在我所指向的文档中看到,该路由仅在端口80或443上路由HTTP通信。

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

票数 1
EN

Stack Overflow用户

发布于 2021-06-11 08:14:11

IBM类将在9.2.1和更高的位置为JMS读取以下Java系统属性,告诉它在启动TLS连接时将SNI头设置为远程系统的主机名:

代码语言:javascript
运行
复制
com.ibm.mq.cfg.SSL.OutboundSNI=HOSTNAME

要以编程方式设置此方法,只需使用System.setProperty方法,例如:

代码语言:javascript
运行
复制
System.setProperty("com.ibm.mq.cfg.SSL.OutboundSNI","HOSTNAME");

注意:字符串HOSTNAME是字面的,不打算被实际的主机名替换。

如果您不能从9.2.1或更高版本移动到com.ibm.mq.allclient.jar,那么在9.2.0.0和更高版本中可以使用com.ibm.mq.cfg.SSL.AllowOutboundSNI=NO,但是在9.2.1和更高版本中不推荐使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67926772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档