【问题标题】:How to expose kafka using istio ingress?如何使用 istio ingress 暴露 kafka?
【发布时间】:2022-04-22 16:29:19
【问题描述】:

我使用 istio-ingress gateway 和 virtualservice 来暴露不同的微服务。到目前为止,它们都是 http 服务,因此可以直接按照 istio 的文档进行操作。

但是对于 kafka,我遇到了一些问题。我正在使用bitnami/kafka helm chart 进行 kafka 安装。这是用于它的 values.yaml:

global:
  storageClass: "kafka-sc"

replicaCount: 3
deleteTopicEnable: true

resources:
  requests:
    memory: 1024Mi
    cpu: 500m
  limits:
    memory: 2048Mi
    cpu: 1000m

zookeeper:
  replicaCount: 3
  resources:
    requests:
      memory: 1024Mi
      cpu: 500m
    limits:
      memory: 2048Mi
      cpu: 1000m

此部署在此端点上公开 kafka:my-kafka.kafka.svc.cluster.local:9092

我希望可以使用入口控制器通过 Internet 访问此端点。因此,我应用了以下 Kubernetes 清单 -->

A. kafka-ingress-gateway.yaml

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: kafka-ingress-gateway
  namespace: kafka
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 9092
      name: tcp
      protocol: TCP
    hosts:
    - "kafka.<public_domain>"

B. kafka-ingress-virtualservice.yaml

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: kafka-ingress-virtualservice
  namespace: kafka
spec:
  hosts:
  - "kafka.<public_domain>"
  gateways:
  - kafka/kafka-ingress-gateway
  tcp:
  - match:
    - port: 9092
    route:
    - destination:
        host: my-kafka.kafka.svc.cluster.local
        port:
          number: 9092

为了验证这是否有效,我使用以下方法:

  1. 创建一个 kafka-client pod 并在两个不同的终端中登录它
  2. 在第一个终端中,我使用以下命令在名为test 的主题中生成:kafka-console-producer.sh --broker-list my-kafka-0.my-kafka-headless.kafka.svc.cluster.local:9092 --topic test
  3. 在第二个终端中,我使用此命令在 test 主题中消费。

在这里,这有效:kafka-console-consumer.sh --bootstrap-server my-kafka.kafka.svc.cluster.local:9092 --topic test --from-beginning

这不起作用:kafka-console-consumer.sh --bootstrap-server kafka.&lt;public_domain&gt;:9092 --topic test --from-beginning

我收到此错误:WARN [Consumer clientId=consumer-console-consumer-89304-1, groupId=console-consumer-89304] Bootstrap broker kafka.&lt;public_domain&gt;:9092 (id: -1 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)

我是 kafka 的新手,所以不确定公开消费者端点还需要什么。从关于 stackoverflow 的类似问题中,我注意到我们应该使用 define "advertisedListeners" in kafka config,但不确定应该放什么值。

如果我在这里遗漏任何细节,请告诉我。

【问题讨论】:

  • 您是如何配置集群的?它是本地还是云托管?您使用的是什么版本的 Kuberentes 和 Istio?
  • 它在 AWS EKS 上。 Kubernetes 版本:1.17,Istio 版本:1.7.1
  • @Grimlock 你找到解决方案了吗?当通过 Istio 虚拟服务暴露 kafka 代理的无头服务时,我也遇到了同样的问题。
  • 不,很遗憾我没有。 @角斗士

标签: kubernetes apache-kafka kubernetes-helm kubernetes-ingress istio


【解决方案1】:

编辑您的 istio-ingressgateway 并为 tcp 端口添加 9092

kubectl edit svc -nistio-system istio-ingressgateway

添加

- name: kafka-broker
  port: 9092
  protocol: TCP
  targetPort: 9092

【讨论】:

    猜你喜欢
    • 2019-03-09
    • 2022-07-11
    • 1970-01-01
    • 2022-01-16
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    相关资源
    最近更新 更多