如何在kubernetes上构建kafka集群后公开kafka以进行外部访问?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在kubernetes上构建kafka集群后公开kafka以进行外部访问?相关的知识,希望对你有一定的参考价值。

我跟随这个guilde https://github.com/kubernetes/contrib/tree/master/statefulsets/kafka在kubernetes上建立了kafka集群,它适用于从kubernetes发送/生成消息。当我尝试使用NodePort公开kafka集群时,如下所示,kafka客户端尝试使用地址10.xx.xx.xx消费/生成消息:30092

将失败:

apiVersion: v1
kind: Service
metadata:
  name: kafka-nodeport
  labels:
    app: kafka
spec:
  type: NodePort
  ports:
  - port: 9092
    nodePort: 30092
    name: server
  selector:
    app: kafka

为什么会发生这种情况以及如何揭露kafka服务?

答案

Kafka Statefulsets需要无头服务才能访问经纪人。您可以将无头服务更改为Type = NodePort并设置externalTrafficPolicy=Local。这会绕过服务的内部负载平衡,并且只有当Kafka pod位于该节点上时,指向该节点端口上的特定节点的流量才会起作用。

apiVersion: v1
kind: Service
metadata:
  name: kafka-nodeport
  labels:
    app: kafka
spec:
  externaTrafficPolicy: Local
  type: NodePort
  ports:
  - port: 9092
    nodePort: 30092
    name: server
  selector:
    app: kafka    

例如,我们有两个节点nodeA和nodeB,nodeB正在运行一个kafka pod。 nodeA:30092将无法连接,但nodeB:30092将连接到nodeB上运行的kafka pod。

希望这可以帮助。

另一答案

你必须做两件事:

1)创建NodePort类型的服务资源(就像你做的那样)或Ingress资源。

2)在Kafka中设置以下两个属性:ADVERTISED_HOSTADVERTISED_PORT

Kafka将使用节点的ip地址向Zookeeper注册,在容器网络内部,它是它使用的内部ip地址,因此我们必须设置thoses属性以告诉Kafka注册它们。

希望有所帮助!

以上是关于如何在kubernetes上构建kafka集群后公开kafka以进行外部访问?的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes 集群上的 Kafka 与 Istio

如何为在 kubernetes 集群上运行的 Kafka Connect 配置 MongoDB 官方源连接器

这是在 Kubernetes 上运行 Kafka 的好方法吗?

使用 SSL 的 Kubernetes 上的 Kafka

Kubernetes 企业项目实战04基于 K8s 构建 EFK+logstash+kafka 日志平台(中)

通过 AWS 上的 ELB 在 Kubernetes 上公开单个 Kafka 代理