Как подключиться к Кафке на Куберне внешне - PullRequest
0 голосов
/ 04 сентября 2018

Я успешно развернул 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 т.е.

  1. добавить hostPort к порту 50kafka statefullset 9094
  2. добавить обнаружение порта узла в 10broker-config

и обнаружил, что локальный док-узел не имеет поля externalIP

Как я могу подключиться к кафке снаружи кластера на докере? Это работает на GKE или других развертываниях?

1 Ответ

0 голосов
/ 04 сентября 2018

Сервис выставляет модуль во внутреннюю сеть Kubernetes. Чтобы открыть службу (которая предоставляет модуль) Интернету, необходимо настроить вход, который указывает на службу.

Ингрессы в основном эквивалентны Apache / Nginx для Kubernetes. Вы можете прочитать о том, как это сделать, по следующему адресу:

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

В качестве альтернативы, вы можете выставить модуль в сети узла, определив service type как NodePort и назначив ему свой конкретный порт. Это должно быть что-то вроде следующего:

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

...