Docker Swarm覆盖网络中服务间无法通信的排查求助
我最近在Docker Swarm环境里部署Confluent的Kafka相关服务时遇到了头疼的问题:overlay网络内的其他容器无法和schema-registry、kafka-rest服务建立通信。
具体情况是这样的:我已经完成了Swarm节点的部署和集群加入,创建了可附加的overlay网络kafka-network,然后通过以下命令部署了ZooKeeper、Kafka、Schema Registry和Kafka Rest服务:
# 创建overlay网络 docker network create --driver overlay --attachable kafka-network # 部署ZooKeeper docker service create --name zookeeper --network kafka-network \ -e ZOOKEEPER_CLIENT_PORT=2181 \ confluentinc/cp-zookeeper:latest # 部署Kafka docker service create --name kafka --network kafka-network \ -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \ -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092 \ -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \ confluentinc/cp-kafka:latest # 部署Schema Registry docker service create --name schema-registry --network kafka-network \ -e SCHEMA_REGISTRY_KAFKASTORE_CONNECTION_URL=zookeeper:2181 \ -e SCHEMA_REGISTRY_HOST_NAME=schema-registry \ -e SCHEMA_REGISTRY_LISTENERS=http://0.0.0.0:8081 \ confluentinc/cp-schema-registry:latest # 部署Kafka Rest docker service create --name kafka-rest --network kafka-network \ -e KAFKA_REST_BOOTSTRAP_SERVERS=kafka:9092 \ -e KAFKA_REST_SCHEMA_REGISTRY_URL=http://schema-registry:8081 \ -e KAFKA_REST_HOST_NAME=kafka-rest \ -e KAFKA_REST_LISTENERS=http://0.0.0.0:8082 \ confluentinc/cp-kafka-rest:latest
所有服务看起来都运行正常,比如Schema Registry的启动日志显示服务已经成功初始化并监听端口:
[2024-XX-XX XX:XX:XX,XXX] INFO SchemaRegistryConfig values:
schema.registry.host.name = schema-registry
schema.registry.listeners = [http://0.0.0.0:8081]
...(省略其他配置项)
[2024-XX-XX XX:XX:XX,XXX] INFO Started listening for HTTP requests on http://0.0.0.0:8081 (io.confluent.kafka.schemaregistry.rest.SchemaRegistryMain)
[2024-XX-XX XX:XX:XX,XXX] INFO Successfully initialized schema registry (io.confluent.kafka.schemaregistry.rest.SchemaRegistryMain)
但奇怪的是,当我从同一个overlay网络里的其他容器(比如用docker run --rm --network kafka-network alpine curl schema-registry:8081/subjects)尝试访问这两个服务时,请求会超时断开;但直接进入schema-registry或kafka-rest的服务容器内部执行相同的curl命令却能正常返回结果。
有没有大佬遇到过类似的问题?求指点排查方向或者解决办法!
内容的提问来源于stack exchange,提问作者James Hines

