【问题标题】:Unable to query Kafka in Kubernetes deployment无法在 Kubernetes 部署中查询 Kafka
【发布时间】:2018-10-10 01:44:42
【问题描述】:

在单个 Ubuntu 14.04 机器上

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

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

基本上我已经为 kafka 设置了一个 kubernetes 服务,并使用图像 wurstmeister/kafka 进行了 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

我还使用以下环境删除/创建 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 容器内部运行以下命令,我也会收到类似的错误

“领导者不可用”。 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 中默认接口 ens33 的 ip

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

【问题讨论】:

  • 您是否先创建了“topic1”?
  • 它是由 kafka 部署和以下环境变量 KAFKA_CREATE_TOPICS 创建的。

标签: docker apache-kafka kubernetes


【解决方案1】:

在k8s中,部署kafka.yaml

env:
- name: KAFKA_BROKER_ID
  value: "1"
- name: KAFKA_CREATE_TOPICS
  value: "test:1:1"
- name: KAFKA_ZOOKEEPER_CONNECT
  value: "zookeeper:2181"
- name: KAFKA_ADVERTISED_LISTENERS
  value: "INSIDE://:9092,OUTSIDE://kafka-com:30322"
- name: KAFKA_LISTENERS
  value: "INSIDE://:9092,OUTSIDE://:30322"
- name: KAFKA_LISTENER_SECURITY_PROTOCOL_MAP
  value: "INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT"
- name: KAFKA_INTER_BROKER_LISTENER_NAME
  value: "INSIDE" 

kafka服务,外部服务调用地址,或者traefik代理地址

---
kind: Service
apiVersion: v1
metadata:
  name: kafka-com
  namespace: dev
  labels:
    k8s-app: kafka
spec:
  selector:
    k8s-app: kafka
  ports:
  - port: 9092
    name: innerport
    targetPort: 9092
    protocol: TCP
  - port: 30322
    name: outport 
    targetPort: 30322
    protocol: TCP
    nodePort: 30322
  type: NodePort

保证Kafka外部端口和nodePort一致,其他服务调用kafka-com:30322,我的博客写这个config_kafka_in_kubernetes,希望对U有帮助!

【讨论】:

    【解决方案2】:

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

    要解决此问题,您可以通过NodePortLoadBalancer 将kafka 服务公开给公共IP。例如,运行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

    【讨论】:

    • 我不知道如何在那个论坛上回复。我的答案被删除了。我用我的 cmets 对原始问题进行了编辑。谢谢!
    猜你喜欢
    • 2019-11-14
    • 1970-01-01
    • 2018-11-05
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2020-09-13
    • 1970-01-01
    相关资源
    最近更新 更多