我遵循此公会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服务?
答案 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_HOST
和ADVERTISED_PORT
。
Kafka将使用该节点的IP地址向Zookeeper注册,它是容器网络内部使用的内部IP地址,因此我们必须设置这些属性以告诉Kafka进行注册。
希望有帮助!