K8s中Wildfly Embedded Artemis报UnknownHostException问题求助
错误日志
2024-04-05 13:07:58,239 WARN [org.apache.activemq.artemis.core.server] (Thread-3 (ActiveMQ-server-org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl$6@4b262fe0)) AMQ224091: Bridge ClusterConnectionBridge@44dbdfc2 [name=$.artemis.internal.sf.my-cluster.c06524ea-f36e-11ee-95d7-4ef5e9f861e4, queue=QueueImpl[name=$.artemis.internal.sf.my-cluster.c06524ea-f36e-11ee-95d7-4ef5e9f861e4, postOffice=PostOfficeImpl [server=ActiveMQServerImpl::name=default], temp=false]@7e873458 targetConnector=ServerLocatorImpl (identity=(Cluster-connection-bridge::ClusterConnectionBridge@44dbdfc2 [name=$.artemis.internal.sf.my-cluster.c06524ea-f36e-11ee-95d7-4ef5e9f861e4, queue=QueueImpl[name=$.artemis.internal.sf.my-cluster.c06524ea-f36e-11ee-95d7-4ef5e9f861e4, postOffice=PostOfficeImpl [server=ActiveMQServerImpl::name=default], temp=false]@7e873458 targetConnector=ServerLocatorImpl [initialConnectors=[TransportConfiguration(name=http-connector, factory=org-apache-activemq-artemis-core-remoting-impl-netty-NettyConnectorFactory) ?httpUpgradeEndpoint=http-acceptor&activemqServerName=default&httpUpgradeEnabled=true&port=8080&host=msg-email-jay-test-0], discoveryGroupConfiguration=null]]::ClusterConnectionImpl@2015267711[nodeUUID=e793336e-f36e-11ee-82cb-9ed7cde89c14, connector=TransportConfiguration(name=http-connector, factory=org-apache-activemq-artemis-core-remoting-impl-netty-NettyConnectorFactory) ?httpUpgradeEndpoint=http-acceptor&activemqServerName=default&httpUpgradeEnabled=true&port=8080&host=msg-email-jay-test-1, address=jms, server=ActiveMQServerImpl::name=default])) [initialConnectors=[TransportConfiguration(name=http-connector, factory=org-apache-activemq-artemis-core-remoting-impl-netty-NettyConnectorFactory) ?httpUpgradeEndpoint=http-acceptor&activemqServerName=default&httpUpgradeEnabled=true&port=8080&host=msg-email-jay-test-0], discoveryGroupConfiguration=null]] is unable to connect to destination. Retrying 2024-04-05 13:07:58,723 ERROR [org.apache.activemq.artemis.core.client] (Thread-0 (ActiveMQ-server-org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl$6@4b262fe0)) AMQ214016: Failed to create netty connection: java.net.UnknownHostException: msg-email-jay-test-0
当前配置
messaging-activemq配置(standalone-ha.xml)
<subsystem xmlns="urn:jboss:domain:messaging-activemq:13.1"> <server name="default"> <security elytron-domain="ApplicationDomain"/> <cluster password="${jboss.messaging.cluster.password:CHANGE ME!!}"/> <security-setting name="#"> <role name="guest" send="true" consume="true" create-non-durable-queue="true" delete-non-durable-queue="true"/> </security-setting> <address-setting name="#" dead-letter-address="jms.queue.DLQ" max-delivery-attempts="${jboss.messaging.redelivery.maxAttempts:800}" redelivery-delay="${jboss.messaging.redelivery.delay.initialMillis:500}" max-redelivery-delay="${jboss.messaging.redelivery.delay.maxMillis:5000}" redelivery-multiplier="${jboss.messaging.redelivery.delay.multiplier:2}" max-size-bytes="10485760" page-size-bytes="2097152" message-counter-history-day-limit="10" redistribution-delay="1000"/> <http-connector name="http-connector" socket-binding="http" endpoint="http-acceptor"/> <http-connector name="http-connector-throughput" socket-binding="http" endpoint="http-acceptor-throughput"> <param name="batch-delay" value="50"/> </http-connector> <in-vm-connector name="in-vm" server-id="0"> <param name="buffer-pooling" value="false"/> </in-vm-connector> <http-acceptor name="http-acceptor" http-listener="default"/> <http-acceptor name="http-acceptor-throughput" http-listener="default"> <param name="batch-delay" value="50"/> <param name="direct-deliver" value="false"/> </http-acceptor> <in-vm-acceptor name="in-vm" server-id="0"> <param name="buffer-pooling" value="false"/> </in-vm-acceptor> <jgroups-broadcast-group name="bg-group1" jgroups-channel="activemq-cluster" connectors="http-connector"/> <jgroups-discovery-group name="dg-group1" jgroups-channel="activemq-cluster"/> <cluster-connection name="my-cluster" address="jms" connector-name="http-connector" discovery-group="dg-group1"/> <jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/> <connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm" consumer-window-size="${jboss.messaging.consumer.buffer.bytes:0}"/> <connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector" ha="true" block-on-acknowledge="true" reconnect-attempts="-1" consumer-window-size="${jboss.messaging.consumer.buffer.bytes:0}"/> <pooled-connection-factory name="activemq-ra" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="in-vm" transaction="xa"/> </server> </subsystem>
JGroups配置
<subsystem xmlns="urn:jboss:domain:jgroups:8.0"> <channels default="ee"> <channel name="ee" stack="tcp" cluster="ejb"/> </channels> <stacks> <stack name="tcp"> <transport type="TCP" socket-binding="jgroups-tcp"/> <protocol type="dns.DNS_PING"> <property name="dns_query">${rave.messaging.cluster.dns.query}</property> </protocol> <protocol type="MERGE3"/> <protocol type="FD_SOCK"/> <protocol type="FD_ALL"/> <protocol type="VERIFY_SUSPECT"/> <protocol type="pbcast.NAKACK2"/> <protocol type="UNICAST3"/> <protocol type="pbcast.STABLE"/> <protocol type="pbcast.GMS"/> <protocol type="MFC"/> <protocol type="FRAG2"/> </stack> </stacks> </subsystem>
问题分析与解决
主机名来源说明
Wildfly默认会将http-connector的host设置为Pod的短主机名(即K8s中Pod的名称,如msg-email-jay-test-0),而非完整的FQDN(格式为${POD_NAME}.${SERVICE_NAME}.${NAMESPACE}.svc.cluster.local)。K8s内部Pod之间仅通过短主机名无法直接解析,必须依赖同命名空间下的Headless Service,或者使用完整FQDN。
具体解决步骤
修改http-connector使用FQDN
调整messaging-activemq配置中的http-connector,显式指定host为Pod的完整FQDN,利用K8s注入的环境变量动态获取:<http-connector name="http-connector" socket-binding="http" endpoint="http-acceptor"> <param name="host" value="${env.POD_NAME}.${env.SERVICE_NAME}.${env.NAMESPACE}.svc.cluster.local"/> </http-connector> <http-connector name="http-connector-throughput" socket-binding="http" endpoint="http-acceptor-throughput"> <param name="batch-delay" value="50"/> <param name="host" value="${env.POD_NAME}.${env.SERVICE_NAME}.${env.NAMESPACE}.svc.cluster.local"/> </http-connector>确保Pod的环境变量
POD_NAME、SERVICE_NAME、NAMESPACE已正确注入(K8s默认会注入POD_NAME和NAMESPACE,SERVICE_NAME需手动在Deployment中添加)。验证JGroups DNS_PING配置
确认rave.messaging.cluster.dns.query指向集群的Headless Service DNS记录,例如:msg-email-jay-test-headless.default.svc.cluster.localHeadless Service会为每个Pod生成可解析的DNS条目,确保DNS_PING能发现所有集群节点。
创建Headless Service(若未存在)
为Wildfly集群创建Headless Service,示例YAML:apiVersion: v1 kind: Service metadata: name: msg-email-jay-test-headless namespace: default spec: clusterIP: None selector: app: msg-email-jay-test ports: - name: http port: 8080 - name: jgroups-tcp port: 7600这样K8s会为每个Pod分配
${POD_NAME}.msg-email-jay-test-headless.default.svc.cluster.local的FQDN,保证节点间解析正常。
内容的提问来源于stack exchange,提问作者TheCycoONE

