在 docker 中运行 kafka,它不是 kubernetes 集群的一部分,但可以从该集群访问它

问题描述 投票:0回答:1

我试图在 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

docker kubernetes apache-kafka
1个回答
0
投票

尝试在 dockerized 环境中创建 kafka,但不是 kubernetes 集群的一部分

嗯,你 可以使用 Strimzi 做到这一点

否则,只要 Egress 规则允许外部连接,Kubernetes 就不是问题。

您有

INTERNAL
,它只能从 Compose 网络中的容器访问。你有
EXTERNAL_SAME_HOST
,顾名思义,只能从同一台主机上的服务访问,not 外部 Kubernetes Pod,因为
localhost
被返回,这意味着 Pod 尝试连接到自己

你需要做广告

192.168.1.x
,或者任何可以从 Kubernetes 主机到达你自己的开发机器的 LAN/WAN IP 或主机名。

如果你想使用

host.docker.internal

© www.soinside.com 2019 - 2024. All rights reserved.