You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

K8s中Wildfly Embedded Artemis报UnknownHostException问题求助

K8s中Wildfly 26集群启动第二个Pod时ActiveMQ Artemis主机名解析失败

错误日志

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。

具体解决步骤

  1. 修改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中添加)。

  2. 验证JGroups DNS_PING配置
    确认rave.messaging.cluster.dns.query指向集群的Headless Service DNS记录,例如:

    msg-email-jay-test-headless.default.svc.cluster.local
    

    Headless Service会为每个Pod生成可解析的DNS条目,确保DNS_PING能发现所有集群节点。

  3. 创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 13:42:06