首页 > 解决方案 > 如何在外部连接到 Kubernetes 上的 Kafka

问题描述

我使用Yolean/kubernetes-kafkaHelm 图表成功地将 Kafka 部署到本地 Docker(gcp 和 minikube)上的 Kubernetes

并使用此 python 脚本在集群内成功测试了主题生产:

#!/usr/bin/env python

from kafka import KafkaConsumer, KafkaProducer

KAFKA_TOPIC = 'demo'
# KAFKA_BROKERS = 'localhost:32400' # see step 1

# from inside the cluster in a different namespace
# KAFKA_BROKERS = 'bootstrap.kafka.svc.cluster.local:9092'

KAFKA_BROKERS = 'kafka.kafka.svc.cluster.local:9092'

print('KAFKA_BROKERS: ' + KAFKA_BROKERS)

producer = KafkaProducer(bootstrap_servers=KAFKA_BROKERS)


messages = [b'hello kafka', b'Falanga', b'3 test messages']


for m in messages:
    print(f"sending: {m}")
    producer.send(KAFKA_TOPIC, m)

producer.flush()

在 helm 我使用这个选项来启用外部使用:

helm install --name kafka --set external.enabled=true --namespace kafka incubator/kafka

在我使用的原始仓库中:

kubectl apply -f ./outside-0.yml

生成的服务具有端点和节点端口,但脚本在集群外部不起作用。

这是原始服务(分支主)

➜  ~ kubectl describe svc outside-0 --namespace kafka
Name:                     outside-0
Namespace:                kafka
Labels:                   <none>
Annotations:              kubectl.kubernetes.io/last-applied-        configuration={"apiVersion":"v1","kind":"Service","metadata":    {"annotations":{},"name":"outside-0","namespace":"kafka"},"spec":{"ports":    [{"nodePort":32400,"port":3240...
Selector:                 app=kafka,kafka-broker-id=0
Type:                     NodePort
IP:                       10.99.171.133
LoadBalancer Ingress:     localhost
Port:                     <unset>  32400/TCP
TargetPort:               9094/TCP
NodePort:                 <unset>  32400/TCP
Endpoints:                10.1.3.63:9094
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

这是掌舵服务描述:

Name:                     kafka-0-external
Namespace:                kafka
Labels:                   app=kafka
                          chart=kafka-0.9.2
                          heritage=Tiller
                          pod=kafka-0
                          release=kafka
Annotations:                  dns.alpha.kubernetes.io/internal=kafka.cluster.local
                      external-    dns.alpha.kubernetes.io/hostname=kafka.cluster.local
Selector:                 app=kafka,pod=kafka-0,release=kafka
Type:                     NodePort
IP:                       10.103.70.223
LoadBalancer Ingress:     localhost
Port:                     external-broker  19092/TCP
TargetPort:               31090/TCP
NodePort:                 external-broker  31090/TCP
Endpoints:                10.1.2.231:31090
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

本地 docker 节点没有 externalIP 字段:

kubectl describe node docker-for-desktop | grep IP
InternalIP:  192.168.65.3

我按照外部自述文件的说明进行操作,即

  1. 将 hostPort 添加到 50kafka statefullset 9094 端口
  2. 在 10broker-config 中添加节点端口发现

& 发现本地 docker 节点没有 externalIP 字段

如何从 docker 上的集群外部连接到 kafka?这适用于 GKE 或其他部署吗?

标签: kubernetesapache-kafkakubernetes-helm

解决方案


该服务将 pod 暴露给内部 Kubernetes 网络。为了将服务(暴露 pod)暴露给互联网,您需要设置一个指向该服务的 Ingress。

Ingress 基本上相当于 Kubernetes 的 Apache/Nginx。您可以在以下 URL 阅读有关如何执行此操作的信息:

https://kubernetes.io/docs/concepts/services-networking/ingress/

service type或者,您可以通过将 定义为 aNodePort并将您的特定端口分配给它来在节点网络上公开一个 pod 。它应该类似于以下内容:

apiVersion: v1 kind: Service metadata: name: nginx labels: name: nginx spec: type: NodePort ports: - port: 80 nodePort: 31090 name: http


推荐阅读