Kuberne在Kubernetes集群中 - 如何发布/使用来自Kubernetes集群外部的消息

Man*_*nha 12 apache-kafka docker kubernetes

  1. 我在Kubernetes集群中部署并运行了Kafka.我正在使用docker hub中的这个图像 - https://hub.docker.com/r/cloudtrackinc/kubernetes-kafka/
  2. 我的kubernetes集群中有3个kube节点.我有3个Kafka和3个zookeeper应用程序在运行,我有服务zoo1,zoo2,zoo3和kafka-1,kafka-2和kafka-3对应运行.我能够从kubernetes集群内部发布/使用,但我无法从kubernetes集群外部发布/使用,即从外部机器不是kubernetes集群的一部分.
  3. 我能够从外部机器到达kube节点 - 基本上我可以使用name/ip ping它们.
  4. 我没有使用任何外部负载均衡器,但我有一个DNS可以解析我的外部机器和kube节点.
  5. 在这种情况下,使用NodePort或ExternalIP公开Kafka服务不起作用.
  6. 设置KAFKA_ADVERTISED_HOST_NAMEKAFKA_ADVERTISED_LISTENERS在最终设置ADVERTISED_HOST_NAME/ ADVERTISED_LISTENERS属性的Kafka RC YML中,server.properties无助于从kubernetes集群外部访问kafka.

请建议我如何从kubernetes集群外部发布/使用.非常感谢!

小智 13

我在AWS上从k8s群集外部访问kafka时遇到了同样的问题.我设法通过使用版本0.10.2支持多个接口的kafka侦听器功能来解决此问题.

这是我如何配置kafka容器.

    ports:
    - containerPort: 9092
    - containerPort: 9093
    env:
    - name: KAFKA_ZOOKEEPER_CONNECT
      value: "zookeeper:2181"
    - name: KAFKA_LISTENER_SECURITY_PROTOCOL_MAP
      value: "INTERNAL_PLAINTEXT:PLAINTEXT,EXTERNAL_PLAINTEXT:PLAINTEXT"
    - name: KAFKA_ADVERTISED_LISTENERS
      value: "INTERNAL_PLAINTEXT://kafka-internal-service:9092,EXTERNAL_PLAINTEXT://123.us-east-2.elb.amazonaws.com:9093"
    - name: KAFKA_LISTENERS
      value: "INTERNAL_PLAINTEXT://0.0.0.0:9092,EXTERNAL_PLAINTEXT://0.0.0.0:9093"
    - name: KAFKA_INTER_BROKER_LISTENER_NAME
      value: "INTERNAL_PLAINTEXT"
Run Code Online (Sandbox Code Playgroud)

除此之外,我配置了两个服务.一个用于内部(无头)和一个用于外部(LoadBalancer)通信.

希望这会节省人们的时间.

  • 嗨,我想跟随你的解决方案,因为我有同样的问题和类似的设置.你能进一步解释,我不知道你是如何实现的. (4认同)

Man*_*nha 7

通过进行以下更改,我能够解决我的问题 -

  1. 在YML中使用NodeSelector使kafka pod在kube集群的特定节点上运行.

  2. 设置KAFKA_ADVERTISED_HOST_NAME为Kube hostName,此Kafka POD已配置为运行(如步骤1中所配置)

  3. 使用NodePort公开Kafka服务并设置与暴露的NodePort相同的POD端口,如下所示 -

    spec:
      ports:
        - name: broker-2
          port: **30031**
          targetPort: 9092
          nodePort: **30031**
          protocol: TCP
      selector:
        app: kafka-2
        broker_id: "2"
      type: NodePort
    
    Run Code Online (Sandbox Code Playgroud)

现在,您可以使用host:exposedPort从kube集群外部访问Kafka代理


Dag*_*Dag 0

目前看来这是不可能的,kafka 的网络架构对于这个主题来说相当糟糕。新的消费者使用代理列表,该列表返回动物园管理员的主机,但不幸的是,这是在不同的网络中,因此无法从本地客户端访问它。kafka 的缺点是,无法指定代理和 Zookeeper 服务器。这可以防止客户端从外部访问系统。

我们暂时使用 busybox 解决了这个问题,在其中安装了与 kafka 交互的工具。在我们的例子中柱塞