docker - 无法在 Kubernetes 部署中查询 Kafka

标签 docker apache-kafka kubernetes

在单个 Ubuntu 14.04 机器上

我遵循了相同的配置
http://dojoblog.dellemc.com/dojo/deploy-kafka-cluster-kubernetes/

我使用 Kubernetes 版本 v1.10.2
(我也在 yml 文件中使用 apiVersion: apps/v1 。)

基本上我已经为 kafka 设置了一个 kubernetes 服务,并使用图像 进行了 kafka 部署香肠/卡夫卡 .动物园管理员工作正常。 Zookeeper 和 Kafka 服务已启动。
Kafka 部署按照博客进行配置: KAFKA_ADVERTISED_HOST_NAME = kafa 服务集群 IP 这对我来说是 10.106.84.132

部署配置:

....
 containers:
      - name: kafka
        image: wurstmeister/kafka
        ports:
        - containerPort: 9092
        env:
        - name: KAFKA_ADVERTISED_PORT
          value: "9092"
        - name: KAFKA_ADVERTISED_HOST_NAME
          value: 10.106.84.132
        - name: KAFKA_ZOOKEEPER_CONNECT
          value: zoo1:2181
        - name: KAFKA_BROKER_ID
          value: "1"
        - name: KAFKA_CREATE_TOPICS
          value: topic1:3:3

然后我从我的主机上的 kafka 容器外部测试 kafka 订阅和发布,但失败如下:
root@edmitchell-virtual-machine:~# kafkacat -b 10.106.84.132:9092 -t topic1

% Auto-selecting Consumer mode (use -P or -C to override)
% ERROR: Topic topic1 error: Broker: Leader not available

总的来说,我能做的最好的是

我删除并重新创建了一个 kafka 部署
  • 名称:KAFKA_ADVERTISED_HOST_NAME
    值:本地主机

  • 然后我可以订阅和发布,但只能从 kafka 容器内,它不能从外部工作。如果我将值更改为 localhost 以外的任何值,则没有任何效果。

    任何的想法 ?
    看来 Kafka 不适合与 Kubernetes 一起使用?
    也许我不应该在不使用 kubernetes 的情况下部署 Kafka ..

    非常感谢


    谢谢,我现在更好地理解了nodeport功能。

    我仍然有同样的问题:
    root@fnature-virtual-machine:~/Zookeeper# kafkacat -b 192.168.198.160:32748 -t topic1 % Auto-selecting Consumer mode (use -P or -C to override) % ERROR: Topic topic1 error: Broker: Leader not available
    

    正如你所说,我创建了 nodeport 服务。
    kafka-nodeport NodePort 10.111.234.104 9092:32748/TCP 27m
    
    kafka-service LoadBalancer 10.106.84.132 9092:30351/TCP 1d
    

    我还使用以下 env 删除/创建 kafka 部署:
     KAFKA_ADVERTISED_PORT: 32748
    
     KAFKA_ADVERTISED_HOST_NAME:  192.168.198.160
    
      KAFKA_ZOOKEEPER_CONNECT:     zoo1:2181
    
      KAFKA_BROKER_ID:             1
    
      KAFKA_CREATE_TOPICS:         topic1:3:3
    



    另外,如果我从 kafka 容器内部运行以下命令,我会收到类似的错误

    "Leader not available". kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topic1 --from-beginning



    如果我使用 KAFKA_ADVERTISED_HOST_NAME: localhost 创建 kafka 部署, 然后上面的命令在 kafka 容器内工作

    和 192.168.198.160 是我的 Ubuntu VM 中默认接口(interface) ens33 的 ip

    我似乎找不到任何关于 kafka 的日志

    最佳答案

    Kafka 代理通过 KAFKA_ADVERTISED_HOST_NAME 向 Zookeeper 注册地址.但是这个地址是一个kubernetes集群ip(10.106.84.132),只能在kubernetes集群内部访问。因此集群外的客户端无法使用此地址访问 Kafka 代理。

    要解决此问题,您可以通过 NodePort 将 kafka 服务公开给公共(public) ip。或 LoadBalancer .例如,运行 kubectl expose svc $YOUR_KAFKA_SERVICE_NAME --name=kafka-nodeport --type=NodePort ,然后查找暴露的节点端口:kubectl get svc kafka-nodeport -o yaml | grep nodePort .在本例中,可以通过以下地址访问 kafka 代理:$KUBERNETES_NODE_IP : $NODEPORT .

    关于docker - 无法在 Kubernetes 部署中查询 Kafka,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50092446/

    相关文章:

    node.js - 在 Docker node.JS 项目中安全存储 SMTP 密码

    spring-boot - Spring Reactive kafka Receiver 总是将引导服务器覆盖到本地主机

    kubernetes - 将负载均衡器与 Kubernetes 结合使用

    docker - 如何从 kubernetes 作业的部署 yml 覆盖 Dockerfile 的入口点 `/bin/sh`?

    docker - 从 istio bookinfo 示例中获取 404

    mysql - Docker-compose:将文件从本地环境复制到 EC2 实例

    Docker-compose 找不到包

    java - Hortonworks 架构注册表 + Nifi + Java : Deserialize Nifi Record

    VSTS 上的 Docker-compose

    java - 发送kafka字符串消息java启动其他java上的程序