当前位置: 首页 > 知识库问答 >
问题:

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

公宜春
2023-03-14
    < li >我在Kubernetes集群中部署并运行了Kafka。我使用的图片来自docker hub-https://hub . docker . com/r/cloudtrackinc/kubernetes-Kafka/ < li >我的kubernetes群集中有3个kube节点。我有3个Kafka和3个zookeeper应用程序在运行,我有服务zoo1、zoo2、zoo3和kafka-1、kafka-2和kafka-3在运行。我可以从kubernetes集群内部发布/使用,但不能从kubernetes集群外部(即不属于kubernetes集群的外部计算机)发布/使用。 < li >我可以从外部机器访问kube节点,基本上我可以使用名称/IP ping它们。 < li >我没有使用任何外部负载平衡器,但是我有一个可以解析外部机器和kube节点的DNS。 < li >在这种情况下,使用NodePort或ExternalIP公开Kafka服务不起作用。 < li >在Kafka RC YML中设置< code > KAFKA _ ADVERTISED _ HOST _ NAME 或< code > KAFKA _ ADVERTISED _ LISTENERS ,最终在< code>server.properties中设置< code > ADVERTISED _ HOST _ NAME /< code > ADVERTISED _ LISTENERS 属性,这对于从kubernetes集群外部访问KAFKA没有帮助。

请建议如何从库伯内特集群之外发布/消费。非常感谢!

共有3个答案

谭文林
2023-03-14

我用合流的KafkaRest代理形象解决了这个问题。

https://hub.docker.com/r/confluentinc/cp-kafka-rest/

REST 代理的文档在这里:

http://docs.confluent.io/3.1.2/kafka-rest/docs/index.html

步骤A:使用最新的Kafka版本构建Kafka经纪人码头形象

我使用了基于您使用的相同映像的自定义构建的Kafka代理映像。您基本上只需要更新cloud dtrackinc的映像以使用Kafka版本0.10.1.0否则它将无法工作。只需从cloud dertrackinc的映像更新Dockerfile以使用最新的wurstmeister kafka映像并重建docker映像。

- FROM wurstmeister/kafka:0.10.1.0

我将每个Kafka代理的ADVERTISED_HOST_NAME设置为POD的IP,以便每个代理获得一个唯一的URL。

- name: ADVERTISED_HOST_NAME
  valueFrom:
    fieldRef:
      fieldPath: status.podIP

步骤B:设置cp-kafka-rest代理以使用您的kafka代理集群

Kafka Rest Proxy必须在与您的Kafka代理集群相同的集群中运行。

您至少需要为cp-kafka-rest映像提供两个环境变量才能运行。KAFKA_REST_HOST_NAME和KAFKA_REST_ZOOKEEPER_CONNECT。可以设置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代理公开为服务

< code >规格:类型:节点端口或负载平衡器端口:-名称:kafka-rest-port端口:8082协议:TCP

您可以使用NodePort或LoadBalancer来利用一个或多个Kafka REST代理pod。

使用Kafka REST代理的利弊

优点:

    < li >您可以轻松扩展Kafka broker集群 < li >您不必将Kakfa经纪人暴露在集群之外 < li >您可以将负载平衡器与代理一起使用。 < li >您可以使用任何类型的客户端访问Kafka集群(即curl)。重量很轻。

欺骗:

  1. 卡克法群集顶部的另一个组件/层。
  2. 使用者是在代理容器中创建的。这需要由您的 REST 客户端进行跟踪。
  3. 性能并不理想:使用 REST 而不是原生的Kafka协议。尽管如果您部署多个代理,这可能会有所帮助。我不会将此设置用于高流量流量。对于低容量的消息流量,这可能没问题。

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

宇文航
2023-03-14

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

>

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

    KAFKA_ADVERTISED_HOST_NAME设置为Kafka POD已配置为在其上运行的Kube主机名(如步骤1中配置的)

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

    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代理

  • 锺离卓
    2023-03-14

    我在AWS上从k8s集群外部访问kafka时遇到了同样的问题。我设法通过使用kafka侦听器特性来解决这个问题,该特性来自版本0.10.2,支持多个接口

    下面是我如何配置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"
    

    除此之外,我还配置了两个服务。一个用于内部(无头)

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

     类似资料:
    • 本系列文档介绍使用二进制部署最新 kubernetes v1.6.2 集群的所有步骤,而不是使用 kubeadm 等自动化方式来部署集群。 在部署的过程中,将详细列出各组件的启动参数,它们的含义和可能遇到的问题。 部署完成后,你将理解系统各组件的交互原理,进而能快速解决实际问题。 所以本文档主要适合于那些有一定 kubernetes 基础,想通过一步步部署的方式来学习和了解系统配置、运行原理的人。

    • 本系列文档介绍使用二进制部署最新 kubernetes v1.6.2 集群的所有步骤,而不是使用 kubeadm 等自动化方式来部署集群。

    • 我已经使用mongo k8s sidecar在kubernetes上提供了一个3成员副本集mongo集群。我需要在外部公开mongodb服务,因此创建了一个LoadBalancer。 这就是服务的样子 尝试使用mongodb shell 3.6进行连接,效果很好 但是在java客户端代码中,我看到了下面的异常。< code > Java . net . unknown hostexception:

    • 我目前正在使用bitnami/kafka image(https://hub.docker.com/r/bitnami/kafka)并将其部署在kubernetes上。 kubernetes大师:1 库伯内特斯工人:3人 在群集中,其他应用程序能够找到 kafka。尝试从群集外部访问 kafka 容器时出现问题。在阅读时,我读到我们需要为外部 kafka 客户端设置属性“广告.监听器=纯文本://

    • 我有以下问题: 我在aws上只使用1个worker和broker节点建立了一个尽可能基本的汇合平台。 我对所有与人脉和关系网有关的事情都很敏感,所以我希望有人能帮助我

    • 要从事 ceph 开发,可以用 vstart.sh 工具部署一个位于本地的伪集群,以便测试。 用法 用此工具可在本机部署伪集群以便开发,它可以启动 rgw 、 mon 、 osd 、和/或 mds ,不指定的话会启动所有类型。 要启动开发集群,执行此命令: vstart.sh [OPTIONS]... [mon] [osd] [mds] 要停止集群,可以执行: ./stop.sh 选项 -i ip