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

问题描述 投票:0回答:2

我跟随这个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服务?

kubernetes apache-kafka
2个回答
1
投票

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
投票

你必须做两件事:

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

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

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

希望有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.