kubernetes - 如何在外部连接到 Kubernetes 上的 Kafka
问题描述
我使用Yolean/kubernetes-kafka和Helm 图表成功地将 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
我按照外部自述文件的说明进行操作,即
- 将 hostPort 添加到 50kafka statefullset 9094 端口
- 在 10broker-config 中添加节点端口发现
& 发现本地 docker 节点没有 externalIP 字段
如何从 docker 上的集群外部连接到 kafka?这适用于 GKE 或其他部署吗?
解决方案
该服务将 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
推荐阅读
- javascript - Aws polly 在客户端解码 json 音频流
- c# - ASP.NET MVC 项目,从视图到控制器,NULL 模型
- go - 使用自定义对象(结构)更新文档
- java - 搜索具有外键的 JPA 实体的约定是什么?
- android - 数据绑定在 Android Studio 中不起作用
- javascript - 在函数式编程中操纵状态
- react-native - 如何将令牌从 SecureStore 传递到 axiosInstance 标头:React-native 中的授权?
- spring - 如何在spring集成dsl中处理子流
- javascript - 无效的钩子调用错误 react-redux 钩子
- python - Django 中的成就