非host网络模式下跨主机部署Apache Ignite Docker集群的方案
跨主机Docker容器部署Apache Ignite双节点集群解决方案(用户命名空间环境)
问题背景
在启用用户命名空间的主机上,无法使用--net=host模式部署Ignite集群;常规端口映射+默认配置无法实现跨主机容器节点通信,BasicAddressResolver配置无效,且排除overlay网络方案,需解决节点通信问题。
可行配置方案
1. 修正Ignite配置文件(核心)
需正确配置地址解析、发现SPI与通信SPI,确保节点能对外暴露主机IP而非容器内部IP。以下是示例配置(需根据实际主机/容器IP调整):
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration"> <!-- 集群名称必须一致 --> <property name="clusterName" value="ignite-cross-host-cluster"/> <!-- TCP发现SPI:指定集群所有节点的外部地址 --> <property name="discoverySpi"> <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi"> <property name="ipFinder"> <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder"> <property name="addresses"> <list> <!-- 替换为两台主机的IP+映射的发现端口 --> <value>192.168.1.100:47500</value> <value>192.168.1.101:47500</value> </list> </property> </bean> </property> <property name="localPort" value="47500"/> <!-- 地址解析:容器内部IP+端口 映射到 主机外部IP+端口 --> <property name="addressResolver"> <bean class="org.apache.ignite.configuration.BasicAddressResolver"> <constructor-arg> <map> <!-- 节点1的映射规则,节点2需对应修改自身容器IP与主机IP --> <entry key="172.17.0.2:47500" value="192.168.1.100:47500"/> <entry key="172.17.0.2:47100" value="192.168.1.100:47100"/> </map> </constructor-arg> </bean> </property> </bean> </property> <!-- 通信SPI:指定内部通信端口 --> <property name="communicationSpi"> <bean class="org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi"> <property name="localPort" value="47100"/> </bean> </property> <!-- 客户端连接配置 --> <property name="clientConnectorConfiguration"> <bean class="org.apache.ignite.configuration.ClientConnectorConfiguration"> <property name="port" value="10800"/> </bean> </property> </bean> </beans>
配置要点:
- 每个节点的
addressResolver需对应自身容器内部IP(可通过docker inspect <容器ID>获取)和主机外部IP的映射 TcpDiscoveryVmIpFinder中必须列出所有集群节点的外部地址
2. 启动容器的正确命令
主机1(IP:192.168.1.100)
docker run -v "/tmp/ignite-node1.xml:/opt/ignite/apache-ignite/config/default-config.xml" \ -p "192.168.1.100:10800:10800" \ -p "192.168.1.100:47100:47100" \ -p "192.168.1.100:47500:47500" \ apacheignite/ignite:latest
主机2(IP:192.168.1.101)
docker run -v "/tmp/ignite-node2.xml:/opt/ignite/apache-ignite/config/default-config.xml" \ -p "192.168.1.101:10800:10800" \ -p "192.168.1.101:47100:47100" \ -p "192.168.1.101:47500:47500" \ apacheignite/ignite:latest
命令要点:
- 明确绑定主机IP进行端口映射,避免容器监听0.0.0.0导致的地址歧义
- 无需映射端口范围,固定映射所需端口即可,减少冲突风险
3. 验证与排查
- 确保两台主机防火墙允许
47100、47500、10800端口的双向通信 - 进入容器执行
ignitevisorcmd.sh,输入nodes命令查看集群节点数量,确认是否形成双节点集群 - 若容器内部IP不固定,可通过环境变量传递IP参数,结合Spring表达式动态配置(示例):
启动时添加环境变量:<entry key="#{systemEnvironment['IGNITE_CONTAINER_IP']}:47500" value="#{systemEnvironment['IGNITE_HOST_IP']}:47500"/>-e IGNITE_CONTAINER_IP=172.17.0.2 -e IGNITE_HOST_IP=192.168.1.100
内容的提问来源于stack exchange,提问作者spf
相关产品推荐
相关产品推荐

