Не удается подключиться к брокерам Kafka - PullRequest
1 голос
/ 08 апреля 2020

Я развернул https://github.com/confluentinc/cp-helm-charts/tree/master/charts/cp-kafka на своем кластере на Prem K8S. Я пытаюсь выставить его, используя TCP-контроллер с nginx.

Мой конфигурационный файл TCP nginx выглядит как

data:
  "<zookeper-tcp-port>": <namespace>/cp-zookeeper:2181
  "<kafka-tcp-port>": <namespace>/cp-kafka:9092

И я сделал соответствующую запись в моем nginx контроллер входа

  - name: <zookeper-tcp-port>-tcp
    port: <zookeper-tcp-port>
    protocol: TCP
    targetPort: <zookeper-tcp-port>-tcp
  - name: <kafka-tcp-port>-tcp
    port: <kafka-tcp-port>
    protocol: TCP
    targetPort: <kafka-tcp-port>-tcp

Теперь я пытаюсь подключиться к своему экземпляру kafka. Когда я просто пытаюсь подключиться к IP и порту с помощью инструментов kafka, я получаю сообщение об ошибке

Unable to determine broker endpoints from Zookeeper.
One or more brokers have multiple endpoints for protocol PLAIN...
Please proved bootstrap.servers value in advanced settings
[<cp-broker-address-0>.cp-kafka-headless.<namespace>:<port>][<ip>]

Когда я вхожу, я предполагаю, что это правильные адреса брокера (я пробовал их все .. Я получаю время. Нет никаких журналов, поступающих от контроллера nginx, кроме

[08/Apr/2020:15:51:12 +0000]TCP200000.000
[08/Apr/2020:15:51:12 +0000]TCP200000.000
[08/Apr/2020:15:51:14 +0000]TCP200000.001

Из модуля kafka-zookeeper-0 Я получаю грузы

[2020-04-08 15:52:02,415] INFO Accepted socket connection from /<ip:port> (org.apache.zookeeper.server.NIOServerCnxnFactory)
[2020-04-08 15:52:02,415] WARN Unable to read additional data from client sessionid 0x0, likely client has closed socket (org.apache.zookeeper.server.NIOServerCnxn)
[2020-04-08 15:52:02,415] INFO Closed socket connection for client /<ip:port>  (no session established for client) (org.apache.zookeeper.server.NIOServerCnxn)

Хотя я не уверен, что они имеют что-нибудь с этим делать?

Есть идеи, что я делаю не так? Заранее спасибо.

1 Ответ

1 голос
/ 16 апреля 2020

TL; DR:

  • Измените значение nodeport.enabled на true внутри cp-kafka/values.yaml перед развертыванием.
  • Измените имя службы и порты в вас TCP NGINX Configmap и Ingress object.
  • Установите bootstrap-server в ваших инструментах kafka на <Cluster_External_IP>:31090

Объяснение:

Безголовая служба была создана вместе с StatefulSet. Созданный сервис не получит clusterIP, но вместо этого будет просто включать список Endpoints. Затем эти Endpoints используются для генерации специфичных для экземпляра c DNS-записей в виде: <StatefulSet>-<Ordinal>.<Service>.<Namespace>.svc.cluster.local

. Он создает DNS-имя для каждого модуля, например:

[ root@curl:/ ]$ nslookup my-confluent-cp-kafka-headless
Server:    10.0.0.10
Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local

Name:      my-confluent-cp-kafka-headless
Address 1: 10.8.0.23 my-confluent-cp-kafka-1.my-confluent-cp-kafka-headless.default.svc.cluster.local
Address 2: 10.8.1.21 my-confluent-cp-kafka-0.my-confluent-cp-kafka-headless.default.svc.cluster.local
Address 3: 10.8.3.7 my-confluent-cp-kafka-2.my-confluent-cp-kafka-headless.default.svc.cluster.local
  • Это то, что заставляет эти сервисы соединяться друг с другом внутри кластера.

Я прошел много проб и ошибок, пока не понял, как это происходит. должен был работать. На основании вашего TCP Nginx Configmap, я полагаю, вы столкнулись с той же проблемой.

  • Nginx ConfigMap запрашивает: <PortToExpose>: "<Namespace>/<Service>:<InternallyExposedPort>".
  • Я понял что вам не нужно выставлять Zookeeper, поскольку он является внутренним сервисом и обрабатывается брокерами kafka.
  • Я также понял, что вы пытаетесь выставить cp-kafka:9092, который является сервисом без заголовка, также используется только для внутреннего использования. , как я объяснил выше.
  • Чтобы получить внешний доступ , необходимо установить параметры nodeport.enabled на true, как указано здесь: Параметры внешнего доступа .
  • Он добавляет один сервис к каждому модулю kafka-N во время развертывания диаграммы.
  • Затем вы изменяете свой файл конфигурации для сопоставления с одним из них:
data:
"31090": default/demo-cp-kafka-0-nodeport:31090

Обратите внимание, что созданный сервис имеет селектор statefulset.kubernetes.io/pod-name: demo-cp-kafka-0. Так сервис идентифицирует модуль, к которому он предназначен для подключения.

  • Редактирование nginx -ingress-controller:
- containerPort: 31090
  hostPort: 31090
  protocol: TCP
  • Установите для инструментов kafka значение <Cluster_External_IP>:31090
* 1 082 *

Воспроизведение: - фрагмент, отредактированный в cp-kafka/values.yaml:

nodeport:
  enabled: true
  servicePort: 19092
  firstListenerPort: 31090
  • Развертывание диаграммы:
$ helm install demo cp-helm-charts
$ kubectl get pods
NAME                                       READY   STATUS    RESTARTS   AGE
demo-cp-control-center-6d79ddd776-ktggw    1/1     Running   3          113s
demo-cp-kafka-0                            2/2     Running   1          113s
demo-cp-kafka-1                            2/2     Running   0          94s
demo-cp-kafka-2                            2/2     Running   0          84s
demo-cp-kafka-connect-79689c5c6c-947c4     2/2     Running   2          113s
demo-cp-kafka-rest-56dfdd8d94-79kpx        2/2     Running   1          113s
demo-cp-ksql-server-c498c9755-jc6bt        2/2     Running   2          113s
demo-cp-schema-registry-5f45c498c4-dh965   2/2     Running   3          113s
demo-cp-zookeeper-0                        2/2     Running   0          112s
demo-cp-zookeeper-1                        2/2     Running   0          93s
demo-cp-zookeeper-2                        2/2     Running   0          74s

$ kubectl get svc
NAME                         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)             AGE
demo-cp-control-center       ClusterIP   10.0.13.134   <none>        9021/TCP            50m
demo-cp-kafka                ClusterIP   10.0.15.71    <none>        9092/TCP            50m
demo-cp-kafka-0-nodeport     NodePort    10.0.7.101    <none>        19092:31090/TCP     50m
demo-cp-kafka-1-nodeport     NodePort    10.0.4.234    <none>        19092:31091/TCP     50m
demo-cp-kafka-2-nodeport     NodePort    10.0.3.194    <none>        19092:31092/TCP     50m
demo-cp-kafka-connect        ClusterIP   10.0.3.217    <none>        8083/TCP            50m
demo-cp-kafka-headless       ClusterIP   None          <none>        9092/TCP            50m
demo-cp-kafka-rest           ClusterIP   10.0.14.27    <none>        8082/TCP            50m
demo-cp-ksql-server          ClusterIP   10.0.7.150    <none>        8088/TCP            50m
demo-cp-schema-registry      ClusterIP   10.0.7.84     <none>        8081/TCP            50m
demo-cp-zookeeper            ClusterIP   10.0.9.119    <none>        2181/TCP            50m
demo-cp-zookeeper-headless   ClusterIP   None          <none>        2888/TCP,3888/TCP   50m
  • Создание конфигурации TCP:
$ cat nginx-tcp-configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: kube-system
data:
  31090: "default/demo-cp-kafka-0-nodeport:31090"

$ kubectl apply -f nginx-tcp.configmap.yaml
configmap/tcp-services created
  • Редактирование контроллера входа Nginx:
$ kubectl edit deploy nginx-ingress-controller -n kube-system

$kubectl get deploy nginx-ingress-controller -n kube-system -o yaml
{{{suppressed output}}}
        ports:
        - containerPort: 31090
          hostPort: 31090
          protocol: TCP
        - containerPort: 80
          name: http
          protocol: TCP
        - containerPort: 443
          name: https
          protocol: TCP
  • Мой вход на IP 35.226.189.123, теперь попробуем подключиться извне кластера. Для этого я подключусь к другой виртуальной машине, где у меня есть мини-куб, так что я могу использовать kafka-client pod для тестирования:
user@minikube:~$ kubectl get pods
NAME           READY   STATUS    RESTARTS   AGE
kafka-client   1/1     Running   0          17h

user@minikube:~$ kubectl exec kafka-client -it -- bin/bash

root@kafka-client:/# kafka-console-consumer --bootstrap-server 35.226.189.123:31090 --topic demo-topic --from-beginning --timeout-ms 8000 --max-messages 1
Wed Apr 15 18:19:48 UTC 2020
Processed a total of 1 messages
root@kafka-client:/# 

Как видите, я смог получить доступ к kafka извне.

  • Если вам также нужен внешний доступ к Zookeeper, я оставлю вам сервисную модель:

zookeeper-external-0.yaml

apiVersion: v1
kind: Service
metadata:
  labels:
    app: cp-zookeeper
    pod: demo-cp-zookeeper-0
  name: demo-cp-zookeeper-0-nodeport
  namespace: default
spec:
  externalTrafficPolicy: Cluster
  ports:
  - name: external-broker
    nodePort: 31181
    port: 12181
    protocol: TCP
    targetPort: 31181
  selector:
    app: cp-zookeeper
    statefulset.kubernetes.io/pod-name: demo-cp-zookeeper-0
  sessionAffinity: None
  type: NodePort
  • Для него будет создан сервис:
NAME                           TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)             AGE
demo-cp-zookeeper-0-nodeport   NodePort    10.0.5.67     <none>        12181:31181/TCP     2s
  • Патч вашей карты конфигурации:
data:
  "31090": default/demo-cp-kafka-0-nodeport:31090
  "31181": default/demo-cp-zookeeper-0-nodeport:31181
  • Добавить вход правило:
        ports:
        - containerPort: 31181
          hostPort: 31181
          protocol: TCP
  • Протестируйте его со своим внешним IP:
pod/zookeeper-client created
user@minikube:~$ kubectl exec -it zookeeper-client -- /bin/bash
root@zookeeper-client:/# zookeeper-shell 35.226.189.123:31181
Connecting to 35.226.189.123:31181
Welcome to ZooKeeper!
JLine support is disabled

Если у вас есть какие-либо сомнения, дайте мне знать в комментариях!

...