我试图在 dockerized 环境中创建 kafka,但不是 kubernetes 集群的一部分
我在访问 kubernetes pod 内的 kafka bootstrap 服务器时遇到了问题。
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper
container_name: zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
container_name: kafka
ports:
- "29092:29092"
environment:
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: EXTERNAL_SAME_HOST://:29092,INTERNAL://:9092
KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:9092,EXTERNAL_SAME_HOST://localhost:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL_SAME_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
volumes:
- /var/run/docker.sock:/var/run/docker.sock
以上代码是我在google搜集的kafka的docker-compose文件。
好吧,通过使用消费工具、Python 和 Java,它在我的 Mac 环境中运行良好
但问题出现在kubernetes集群和dockerized环境中(与kafka容器不同)。
当我用 linux 在 kubernetes pod 上运行 kafkacat 测试时,就像
kafkacat -P -b host.docker.internal:29092 -t test
但是
%3|1681306449.415|FAIL|rdkafka#producer-1| [thrd:localhost:29092/1001]: localhost:29092/1001: Connect to ipv4#127.0.0.1:29092 failed: Connection refused (after 1ms in state CONNECT)
%3|1681306449.511|FAIL|rdkafka#producer-1| [thrd:localhost:29092/1001]: localhost:29092/1001: Connect to ipv4#127.0.0.1:29092 failed: Connection refused (after 0ms in state CONNECT, 1 identical error(s) suppressed)
发生。或者当我尝试连接 docker 时, 使用端口 9092
%3|1681307275.048|FAIL|rdkafka#producer-1| [thrd:172.17.0.1:9092/bootstrap]: 172.17.0.1:9092/bootstrap: Connect to ipv4#172.17.0.1:9092 failed: Connection refused (after 0ms in state CONNECT)
或29092
org.apache.kafka.clients.NetworkClient : [Producer clientId=producer-1] Connection to node 1001 (localhost/127.0.0.1:29092) could not be established. Broker may not be available.
我尝试了很多我喜欢的东西,将 advertised.listeners 设置为本地主机,外部 ip
尝试在 dockerized 环境中创建 kafka,但不是 kubernetes 集群的一部分
否则,只要 Egress 规则允许外部连接,Kubernetes 就不是问题。
您有
INTERNAL
,它只能从 Compose 网络中的容器访问。你有 EXTERNAL_SAME_HOST
,顾名思义,只能从同一台主机上的服务访问,not 外部 Kubernetes Pod,因为 localhost
被返回,这意味着 Pod 尝试连接到自己。
你需要做广告
192.168.1.x
,或者任何可以从 Kubernetes 主机到达你自己的开发机器的 LAN/WAN IP 或主机名。
如果你想使用
host.docker.internal