Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes集群中的Kafka-如何发布/使用来自Kubernetes集群外部的消息 我已经在Kubernetes集群中部署并运行了Kafka。我正在使用docker hub中的此图像- 我的kubernetes集群中有3个kube节点。我有3个Kafka和3个zookeeper应用程序在运行,我有相应的服务zoo1、zoo2、zoo3和Kafka-1、Kafka-2和Kafka-3在运行。我可以从kubernetes集群内部发布/消费,但我不能从kubernetes集群外部发布/消费,即从外部机器(不属于kubernetes集群)发布/消费 我能够从外部机器访问kube节点-基本上我可以使用name/ip ping它们 我没有使用任何外部负载平衡器,但我有一个DNS,可以解析我的外部机器和kube节点 在这种情况下,使用NodePort或ExternalIP公开Kafka服务不起作用 在KAFKA RC YML中设置KAFKA_advised_HOST_NAME或KAFKA_advised_侦听器,最终在服务器中设置advised_HOST_NAMEadvised_侦听器属性。属性都无助于从kubernetes集群外部访问KAFKA_Docker_Apache Kafka_Kubernetes - Fatal编程技术网

Kubernetes集群中的Kafka-如何发布/使用来自Kubernetes集群外部的消息 我已经在Kubernetes集群中部署并运行了Kafka。我正在使用docker hub中的此图像- 我的kubernetes集群中有3个kube节点。我有3个Kafka和3个zookeeper应用程序在运行,我有相应的服务zoo1、zoo2、zoo3和Kafka-1、Kafka-2和Kafka-3在运行。我可以从kubernetes集群内部发布/消费,但我不能从kubernetes集群外部发布/消费,即从外部机器(不属于kubernetes集群)发布/消费 我能够从外部机器访问kube节点-基本上我可以使用name/ip ping它们 我没有使用任何外部负载平衡器,但我有一个DNS,可以解析我的外部机器和kube节点 在这种情况下,使用NodePort或ExternalIP公开Kafka服务不起作用 在KAFKA RC YML中设置KAFKA_advised_HOST_NAME或KAFKA_advised_侦听器,最终在服务器中设置advised_HOST_NAMEadvised_侦听器属性。属性都无助于从kubernetes集群外部访问KAFKA

Kubernetes集群中的Kafka-如何发布/使用来自Kubernetes集群外部的消息 我已经在Kubernetes集群中部署并运行了Kafka。我正在使用docker hub中的此图像- 我的kubernetes集群中有3个kube节点。我有3个Kafka和3个zookeeper应用程序在运行,我有相应的服务zoo1、zoo2、zoo3和Kafka-1、Kafka-2和Kafka-3在运行。我可以从kubernetes集群内部发布/消费,但我不能从kubernetes集群外部发布/消费,即从外部机器(不属于kubernetes集群)发布/消费 我能够从外部机器访问kube节点-基本上我可以使用name/ip ping它们 我没有使用任何外部负载平衡器,但我有一个DNS,可以解析我的外部机器和kube节点 在这种情况下,使用NodePort或ExternalIP公开Kafka服务不起作用 在KAFKA RC YML中设置KAFKA_advised_HOST_NAME或KAFKA_advised_侦听器,最终在服务器中设置advised_HOST_NAMEadvised_侦听器属性。属性都无助于从kubernetes集群外部访问KAFKA,docker,apache-kafka,kubernetes,Docker,Apache Kafka,Kubernetes,请建议如何从kubernetes群集外部发布/消费。多谢 这在目前看来是不可能的,卡夫卡的网络架构在这个话题上相当糟糕。新消费者使用一个代理列表,该列表返回zookeeper的主机,但不幸的是,该主机位于不同的网络中,因此无法从本地客户端访问该主机。卡夫卡最糟糕的部分是,无法指定代理和zookeeper服务器。这会阻止客户端从外部访问系统 我们使用一个busybox暂时解决了这个问题,在那里我们安装了与卡夫卡交互的工具。在我们的例子中,我使用Confluent的Kafka REST代理图像解决了

请建议如何从kubernetes群集外部发布/消费。多谢

这在目前看来是不可能的,卡夫卡的网络架构在这个话题上相当糟糕。新消费者使用一个代理列表,该列表返回zookeeper的主机,但不幸的是,该主机位于不同的网络中,因此无法从本地客户端访问该主机。卡夫卡最糟糕的部分是,无法指定代理和zookeeper服务器。这会阻止客户端从外部访问系统


我们使用一个busybox暂时解决了这个问题,在那里我们安装了与卡夫卡交互的工具。在我们的例子中,我使用Confluent的Kafka REST代理图像解决了这个问题

REST代理的文档如下所示:

步骤A:使用最新的卡夫卡版本构建卡夫卡经纪人docker映像

我使用了一个基于您使用的相同图像的定制Kafka代理图像。基本上,您只需要更新cloudtrackinc的映像以使用Kafka版本0.10.1.0,否则它将无法工作。只需从cloudertrackinc的映像更新Dockerfile,以使用最新的wurstmeister kafka映像并重建docker映像

- FROM wurstmeister/kafka:0.10.1.0
我将每个Kafka代理的广告主机名设置为POD的IP,这样每个代理都会获得一个唯一的URL

- name: ADVERTISED_HOST_NAME
  valueFrom:
    fieldRef:
      fieldPath: status.podIP
步骤B:设置cp kafka rest代理以使用kafka代理群集

Kafka Rest代理必须与Kafka代理集群在同一集群中运行

您需要至少为cp kafka rest映像提供两个环境变量,使其能够运行。卡夫卡休息室休息室主机名和卡夫卡休息室动物园管理员连接。您可以将KAFKA_REST_HOST_NAME设置为使用POD的IP

- name: KAFKA_REST_HOST_NAME
  valueFrom:
    fieldRef:
      fieldPath: status.podIP
- name: KAFKA_REST_ZOOKEEPER_CONNECT
  value: "zookeeper-svc-1:2181,zookeeper-svc-2:2181,zookeeper-svc-3:2181"
步骤C:将Kafka REST代理作为服务公开

spec:
类型:节点端口或负载平衡器
端口:
-名称:卡夫卡休息港
端口:8082
协议:TCP

您可以使用NodePort或LoadBalancer来利用单个或多个Kafka REST代理吊舱

使用卡夫卡REST代理的利弊

优点:

  • 您可以轻松地扩展Kafka代理集群
  • 您不必在集群之外公开Kakfa代理
  • 您可以将loadbalancer与代理一起使用
  • 您可以使用任何类型的客户端访问Kafka群集(即curl)。重量很轻
  • 缺点:

  • Kakfa集群顶部的另一个组件/层
  • 消费者是在代理pod中创建的。这需要由您的REST客户机进行跟踪
  • 性能并不理想:REST而不是本机Kafka协议。虽然如果您部署多个代理,这可能会有所帮助。我不会将此设置用于高流量。对于低流量的消息流量,这可能没问题

  • 因此,如果您可以接受上述问题,那么请尝试使用Kafka Rest代理。

    我可以通过执行以下更改来解决我的问题-

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

  • KAFKA_advised_HOST_NAME
    设置为Kube主机名,该KAFKA POD已配置为在其上运行(如步骤1中所配置)

  • 使用NodePort公开Kafka服务,并将POD端口设置为与公开的NodePort相同,如下所示-

    spec:
      ports:
        - name: broker-2
          port: **30031**
          targetPort: 9092
          nodePort: **30031**
          protocol: TCP
      selector:
        app: kafka-2
        broker_id: "2"
      type: NodePort
    

  • 现在,您可以使用host:exposedPort从kube群集外部访问Kafka代理。在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"
    
    除此之外,我还配置了两个服务。一个用于内部(无头)通信,一个用于外部(负载平衡器)通信


    希望这能节省人们的时间。

    谢谢@Dag是的,在kubernetes运行的卡夫卡集群位于不同的西北部。但是,由于集群计算机和外部计算机都可以由内部DNS服务器解析,是否有一种方法或解决方法可以使发布/使用来自外部计算机的消息成为可能?另外,由于我使用NodePort公开了kafka服务,我可以通过以下方式连接到卡夫卡:但仅从kubernetes集群内的机器n/w连接,从外部机器n/w连接不起作用,尽管我可以从外部机器访问/ping这些kube节点。互联网上的一些资源称,人们使用广告的主机名在AWS/云外部工作可能是因为公共IP…外部负载均衡器dnsThanks@yuqing mai。我还能够使我的初始配置工作。请看我对这个问题的回答。嗨,我想