我有一个带有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
)进行连接:
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,但没有成功。
如果有帮助的话,让我们假设我们使用的最新版本作为客户端。
每次出现相同的连接错误:
...
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中的配置如下:
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应用程序。
其他解决方案似乎需要太多的努力,但我接受其中一个,因为它在理论上是正确和直截了当的。
发布于 2021-06-10 20:00:18
我不确定完全理解您的设置,但是"Routes"
只路由HTTP流量(端口80或443 onyl),而不是TCP流量。
如果您想从集群外部访问MQ服务器,有几种解决方案,一种是创建类型为:"NodePort"
的服务。
医生: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
然后用任何名字从外面进入。:30001。
并删除无用的相应路由。如前所述,我假设您在我所指向的文档中看到,该路由仅在端口80或443上路由HTTP通信。
医生:https://kubernetes.io/docs/concepts/services-networking/service/#nodeport
发布于 2021-06-11 08:14:11
IBM类将在9.2.1和更高的位置为JMS读取以下Java系统属性,告诉它在启动TLS连接时将SNI头设置为远程系统的主机名:
com.ibm.mq.cfg.SSL.OutboundSNI=HOSTNAME
要以编程方式设置此方法,只需使用System.setProperty
方法,例如:
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和更高版本中不推荐使用。
https://stackoverflow.com/questions/67926772
复制相似问题