Я успешно развернул Kafka в Kubernetes на локальном Docker (gcp & minikube), используя Yolean / kubernetes-kafka & Диаграмма руля
и успешно протестировал создание темы из кластера с помощью этого сценария 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 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>
Локальный док-узел не имеет поля externalIP:
kubectl describe node docker-for-desktop | grep IP
InternalIP: 192.168.65.3
Я следовал инструкциям снаружи Readme т.е.
- добавить hostPort к порту 50kafka statefullset 9094
- добавить обнаружение порта узла в 10broker-config
и обнаружил, что локальный док-узел не имеет поля externalIP
Как я могу подключиться к кафке снаружи кластера на докере?
Это работает на GKE или других развертываниях?