Слушатели Кафки ошибаются в настройке confluenti c kubernetes - PullRequest
0 голосов
/ 16 апреля 2020

Я не могу подключиться к своему кластеру kafka снаружи. Кажется, есть проблема со слушателями и рекламируемыми слушателями.

Любые предложения?

Когда я пытаюсь подключиться извне через порт 30092, тогда я всегда получаю ссылку назад to kafka-sv c: 9092

  • Имя кластера: dev- docker -x02
  • Как я тестирую: kafka по умолчанию для windows:. \ bin \ windows \ kafka-themes.bat --list - bootstrap -server dev- docker -x02: 30092
  • Требование: использовать confluentinc / cp-kafka: 5.4.0-1-ubi8

Моя настройка:

enter image description here

Моя конфигурация посредника (Кажется, проблема в (объявленных) слушателях.

kind: Deployment
metadata:
  name: kafka-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
        app: kafka-pod
  template:
    metadata:
      labels:
        app: kafka-pod
    spec:
      containers:
      - name: kafka-ctr         # Container name
        image: confluentinc/cp-kafka:5.4.0-1-ubi8
        ports:
        - containerPort: 9092   # Port exposed by the container
        env:
        - name: KAFKA_BROKER_ID
          value: "0"
        - name: KAFKA_ZOOKEEPER_CONNECT
          value: zookeeper-svc:2181
        - name: KAFKA_LISTENERS
          value: "LISTENER_INTERNAL://:9092,LISTENER_EXTERNAL://:30092"
        - name: KAFKA_ADVERTISED_LISTENERS
          value: "LISTENER_INTERNAL://kafka-svc:9092,LISTENER_EXTERNAL://dev-kube-x02:30092"
        - name: KAFKA_LISTENER_SECURITY_PROTOCOL_MAP
          value: "LISTENER_INTERNAL:PLAINTEXT,LISTENER_EXTERNAL:PLAINTEXT"
        - name: KAFKA_INTER_BROKER_LISTENER_NAME
          value: "LISTENER_EXTERNAL"
        - name: KAFKA_AUTO_CREATE_TOPICS_ENABLE
          value: "false"
        - name: KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR
          value: "1"
        - name: KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS
          value: "100"

Ответы [ 2 ]

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

Kafka имеет множество компонентов, таких как Headless Services, Statefulsets , и каждый из них играет особую роль. По этой причине я бы также предложил использовать Kafka Confluenti c Диаграмма руля .

Это руководство основано на диаграмме руля, так как вы упомянули, что будете использовать его в комментариях но приведенные здесь концепции могут быть распространены на любое приложение, которое использует службы безголового доступа и нуждается во внешнем доступе.

В отношении того, что вы предоставили, я полагаю, что вы столкнулись с некоторыми трудностями, поскольку вы ссылаетесь на внешнюю службу без ссылки, которая не будет работать поскольку служба безголового доступа не имеет внутреннего операционного IP.

служба безголового оператора создается вместе с 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
  • Это то, что заставляет эти сервисы соединяться друг с другом внутри кластера.

  • Поэтому вы не можете выставить cp-kafka:9092, который является безголовый сервис, также используется только для внутреннего использования, как я объяснил выше.

  • Чтобы получить внешний доступ , необходимо установить параметры nodeport.enabled на true, как указано здесь : Параметры внешнего доступа .
  • Он добавляет один сервис к каждому модулю kafka-N во время развертывания диаграммы.
  • Обратите внимание, что созданный сервис имеет селектор statefulset.kubernetes.io/pod-name: demo-cp-kafka-0, это как служба определяет модуль, к которому она предназначена.

Воспроизведение:

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
  • Мой узел работает по IP 35.226.189.123, и я подключусь к службе demo-cp-kafka-0-nodeport nodeport, которая находится на порту 31090, Теперь давайте попробуем подключиться снаружи кластера. Для этого я подключусь к другой виртуальной машине, где у меня есть мини-куб, поэтому я могу использовать 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 извне.

  • Используя этот метод, диаграмма управления создаст 1 внешнюю службу для каждой заданной вами реплики.
  • Если вам нужен внешний доступ к Zookeeper, он не предоставляется автоматически, как kafka агент, но я оставлю для вас модель сервиса:

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
  • Протестируйте его со своим внешним 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

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

0 голосов
/ 17 апреля 2020

Если вы использовали Confluent Helm Charts и читали там документы, то вы можете настроить различные функциональные параметры для удаленных слушателей.

Кроме того, я бы предложил использовать Operator вместо простого развертывания https://operatorhub.io/?keyword=kafka

В качестве альтернативы используйте Docker Compose, если вы работаете только на одной машине

...