客户端 连接 k8s-kafka 异常
异常信息:
java.net.UnknownHostException: kafka-0.kafka.flink-stat.svc.cluster.local at java.net.InetAddress.getAllByName0(InetAddress.java:1287) ~[?:1.8.0_341] at java.net.InetAddress.getAllByName(InetAddress.java:1199) ~[?:1.8.0_341] at java.net.InetAddress.getAllByName(InetAddress.java:1127) ~[?:1.8.0_341] at org.apache.kafka.clients.DefaultHostResolver.resolve(DefaultHostResolver.java:27) ~[kafka-clients-2.8.1.jar:?] at org.apache.kafka.clients.ClientUtils.resolve(ClientUtils.java:111) ~[kafka-clients-2.8.1.jar:?] at org.apache.kafka.clients.ClusterConnectionStates$NodeConnectionState.currentAddress(ClusterConnectionStates.java:513) ~[kafka-clients-2.8.1.jar:?] at org.apache.kafka.clients.ClusterConnectionStates$NodeConnectionState.access$200(ClusterConnectionStates.java:467) ~[kafka-clients-2.8.1.jar:?] at org.apache.kafka.clients.ClusterConnectionStates.currentAddress(ClusterConnectionStates.java:172) ~[kafka-clients-2.8.1.jar:?] at org.apache.kafka.clients.NetworkClient.initiateConnect(NetworkClient.java:985) [kafka-clients-2.8.1.jar:?]
客户端,主机,kafka容器 连接场景:
idea客户端(10.0.0.80)-> 10.0.0.80:30141(nginx-ingress) 代理 -> kafka-service(10.98.244.199:9092) -> kafkaPod(10.1.0.249:9092)
10.0.0.80 本机ip 。因为kafka 是运行在k8s上,所以通过是通过 nginx-ingress 代理ip:port 到 kafka-service 从而进行访问kafka。
分析:
idea客户端在链接kafka 并不是直接通过 10.0.0.80:30141 链接到kafka 然后消费消息。
会先获取 kafka 的 KAFKA_ADVERTISED_LISTENERS 配置,这个配置配置的是 kafka对外部请求暴漏的访问地址,不写默认是当前机器的hostname
网上一些处理方式是修改 宿主机的hosts配置,添加 kafka hostname与容器ip映射。因为我的kafka 是运行在容器中,是通过代理ip:port 端口访问,所以10.1.0.249 与我客户端网络是不通的。
但是 kafka 容器 访问 宿主机的ip(10.0.0.80) 是通的。所以最后处理方式是 :
KAFKA_ADVERTISED_LISTENERS:PLAINTEXT://10.0.0.80:30141 ### 10.0.0.80:30141 宿主机的ip, 30141 宿主机代理到 9092端口
客户端可以正常启动并消费消息。
KAFKA_CFG_ADVERTISED_LISTENERS 是因为我的使用的是bitnami的Kafka镜像,作者做了映射 KAFKA_ADVERTISED_LISTENERS -> KAFKA_CFG_ADVERTISED_LISTENERS
1: kafka 容器配置 KAFKA_CFG_ADVERTISED_LISTENERS
2: idea 客户端链接kafka 并消费消息