在kubernetes上构建kafka集群后,如何公开kafka供外部访问?

时间:2018-12-11 10:27:05

标签: kubernetes apache-kafka

我遵循此公会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服务?

2 个答案:

答案 0 :(得分: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)

您必须做两件事:

1)创建NodePort类型的服务资源(如您一样)或Ingress资源。

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

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

希望有帮助!