Раскрытие кластера Kafka в Kubernetes с помощью службы LoadBalancer

#kubernetes #apache-kafka

#kubernetes #apache-kafka

Вопрос:

Предположим, что у меня настроен кластер Kafka с 3 узлами. Тогда как мне предоставить его вне облака с помощью службы балансировки нагрузки? Я прочитал справочный материал, но у меня есть несколько сомнений.

Скажем, например, ниже приведен сервис для брокера

 apiVersion: v1 
  kind: Service metadata: 
  name: kafka-0 
  annotations: dns.alpha.kubernetes.io/external: kafka-0.kafka.my.company.com 
  spec: 
    externalTrafficPolicy: Local 
    type: LoadBalancer 
    ports: 
      - port: 9092 
      name: outside 
      targetPort: 9092 
    selector: app: kafka kafka-pod-id: "0"
  
  1. Что такое port и targetPort?
  2. Должен ли я настраивать службу LoadBalancer для каждого из брокеров?
  3. Сопоставляются ли эти несколько брокеров с одним общедоступным IP-адресом cloud LB?
  4. Как служба за пределами k8s / cloud получает доступ к отдельному брокеру? С помощью public-ip:port ? или с помощью kafka-<pod-id>.kafka.my.company.com:port ?. Также какой порт здесь используется? port или targetPort ?
  5. Как мне указать эту конфигурацию в Advertised.listeners свойстве Kafka broker? Поскольку порт может отличаться для служб внутри кластера k8s и за его пределами.

Пожалуйста, помогите.

Ответ №1:

Основываясь на предоставленной вами информации, я постараюсь дать вам несколько ответов, в конечном итоге дать несколько советов.

1) port: — номер порта, который делает службу видимой для других служб, работающих в том же кластере K8s. Другими словами, в случае, если служба захочет вызвать другую службу, запущенную в том же кластере Kubernetes, она сможет сделать это, используя порт, указанный против port в файле спецификации службы.

targetPort: это порт, на POD котором запущена служба. Ваше приложение должно прослушивать сетевые запросы на этом порту, чтобы служба работала.

2/3) Каждый брокер должен быть представлен как LoadBalancer и настроен как безголовый сервис для внутренней связи. Должно быть одно дополнение LoadBalancer с внешним ip для внешнего подключения.

Пример службы

 apiVersion: v1
kind: Service
metadata:
  name: kafka-0
  annotations: dns.alpha.kubernetes.io/external: kafka-0.kafka.my.company.com
spec:
  ports:
  - port: 9092
    name: kafka-port
    protocol: TCP
  selector:
    pod-name: kafka-0
  type: LoadBalancer
  

4) Вы должны использовать kafka-<pod-id>.kafka.my.company.com:port

5) Для него должен быть установлен внешний адрес, чтобы клиенты могли подключаться к нему. Эта статья может помочь с пониманием.

Аналогичный случай был на Github, это также может вам помочь — https://github.com/kow3ns/kubernetes-kafka/issues/3

Кроме того, вы также могли бы подумать о Ingress — https://tothepoint.group/blog/accessing-kafka-on-google-kubernetes-engine-from-the-outside-world /