背景介绍:
我想适用docker搭建Kafka KRAFT集群,节点是:
序号 | 节点名称 | 节点地址 |
---|---|---|
1 | kafka1 | 192.168.100.234 |
2 | kafka2 | 192.168.100.235 |
3 | kafka3 | 192.168.100.236 |
错误描述
当我启动首个Kafka节点时,Kafka容器启动失败,报错内容如下:
[root@db mintunnel_234]# docker logs -f kafka1
kafka 09:33:44.18 INFO ==>
kafka 09:33:44.18 INFO ==> Welcome to the Bitnami kafka container
kafka 09:33:44.18 INFO ==> Subscribe to project updates by watching https://github.com/bitnami/containers
kafka 09:33:44.19 INFO ==> Did you know there are enterprise versions of the Bitnami catalog? For enhanced secure software supply chain features, unlimited pulls from Docker, LTS support, or application customization, see Bitnami Premium or Tanzu Application Catalog. See https://www.arrow.com/globalecs/na/vendors/bitnami/ for more information.
kafka 09:33:44.19 INFO ==>
kafka 09:33:44.19 INFO ==> ** Starting Kafka setup **
kafka 09:33:44.37 WARN ==> Kafka has been configured with a PLAINTEXT listener, this setting is not recommended for production environments.
kafka 09:33:44.41 INFO ==> Initializing Kafka...
kafka 09:33:44.42 INFO ==> No injected configuration files found, creating default config files
kafka 09:33:45.02 INFO ==> Initializing KRaft storage metadata
kafka 09:33:45.02 INFO ==> Formatting storage directories to add metadata...
Picked up JAVA_TOOL_OPTIONS:
All of the log directories are already formatted.kafka 09:33:48.00 INFO ==> ** Kafka setup finished! **
kafka 09:33:48.02 INFO ==> ** Starting Kafka **
Picked up JAVA_TOOL_OPTIONS:
[2025-03-19 09:33:48,902] INFO Registered kafka:type=kafka.Log4jController MBean (kafka.utils.Log4jControllerRegistration$)
[2025-03-19 09:33:49,301] INFO Setting -D jdk.tls.rejectClientInitiatedRenegotiation=true to disable client-initiated TLS renegotiation (org.apache.zookeeper.common.X509Util)
[2025-03-19 09:33:49,654] INFO Registered signal handlers for TERM, INT, HUP (org.apache.kafka.common.utils.LoggingSignalHandler)
[2025-03-19 09:33:49,662] INFO [ControllerServer id=1] Starting controller (kafka.server.ControllerServer)
[2025-03-19 09:33:50,391] INFO Updated connection-accept-rate max connection creation rate to 2147483647 (kafka.network.ConnectionQuotas)
[2025-03-19 09:33:50,467] INFO [SocketServer listenerType=CONTROLLER, nodeId=1] Created data-plane acceptor and processors for endpoint : ListenerName(CONTROLLER) (kafka.network.SocketServer)
[2025-03-19 09:33:50,474] ERROR Encountered fatal fault: caught exception (org.apache.kafka.server.fault.ProcessTerminatingFaultHandler)
java.net.UnknownHostException: db: db: Name or service not knownat java.base/java.net.InetAddress.getLocalHost(InetAddress.java:1671)at org.apache.kafka.metadata.ListenerInfo.withWildcardHostnamesResolved(ListenerInfo.java:237)at kafka.server.ControllerServer.startup(ControllerServer.scala:191)at kafka.server.KafkaRaftServer.$anonfun$startup$1(KafkaRaftServer.scala:98)at kafka.server.KafkaRaftServer.$anonfun$startup$1$adapted(KafkaRaftServer.scala:98)at scala.Option.foreach(Option.scala:407)at kafka.server.KafkaRaftServer.startup(KafkaRaftServer.scala:98)at kafka.Kafka$.main(Kafka.scala:112)at kafka.Kafka.main(Kafka.scala)
Caused by: java.net.UnknownHostException: db: Name or service not knownat java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:934)at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1543)at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:852)at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1533)at java.base/java.net.InetAddress.getLocalHost(InetAddress.java:1666)
docker-compose.yaml
kafka:image: hub.dehuinet.com:58443/middleware/kafka:3.9.0container_name: 'kafka'network_mode: "host"volumes:- "kafka_data:/bitnami"environment:- KAFKA_ENABLE_KRAFT=yes- KAFKA_CFG_NODE_ID=1- KAFKA_CFG_PROCESS_ROLES=broker,controller- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.100.234:9092- KAFKA_CFG_BROKER_ID=1- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@192.168.100.234:9093,2@192.168.100.235:9093,3@192.168.100.236- KAFKA_KRAFT_CLUSTER_ID=LelM2dIFQkiUFvXCEcqRWA- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true- KAFKA_CFG_NUM_PARTITIONS=3- ALLOW_PLAINTEXT_LISTENER=yesulimits:memlock:soft: -1hard: -1nofile:soft: 1000000hard: 1000000extra_hosts:- "kafka1:192.168.100.234"- "kafka2:192.168.100.235"- "kafka3:192.168.100.236"
报错分析
上面的报错日志显示,KAFKA 程序尝试解析域名“db”失败,“db”是我的宿主机主机名,当前主机IP地址是“192.168.100.234”。
解决办法
去掉docker-compose.yaml文件中的extra_hosts配置即可
原因分析
因为容器使用了host网络模式,容器会共享宿主机的网络命名空间,也包括宿主机的/etc/hosts记录;
kafka在启动时会读取主机名进行解析(非host模式下,则读取容器名),extra_hosts会覆盖容器内的/etc/hosts记录,由于extra_hosts配置中未包含“db”域名的映射,所以域名解析失败。