Istio Ingress Gateway для обслуживания Strimzi Apache Kafka в Kubernetes

У меня есть вопрос о том, как настроить оператора Strimzi Kafka с шлюзом Istio Ingress для обслуживания как службы начальной загрузки, так и службы брокера.

Я развернул Istio со следующими шлюзами и виртуальными службами для сервера начальной загрузки и брокеров:

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  annotations:
  name: strimzi-kafka-gw-broker
  namespace: strimzi
spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    - myserver
    port:
      name: https
      number: 9094
      protocol: HTTP2
    tls:
      mode: SIMPLE
      credentialName: myserver-tls
---
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  annotations:
  name: strimzi-kafka-gw-bootstrap
  namespace: strimzi
spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    - myserver
    port:
      name: tls-9093
      number: 9093
      protocol: TLS
    tls:
      mode: SIMPLE
      credentialName: myserver-tls
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  annotations:
  name: strimzi-kafka-vs-broker
  namespace: strimzi
spec:
  gateways:
  - strimzi-kafka-gw-broker
  hosts:
  - my-server
  http:
  - match:
    - uri:
        prefix: /
    route:
    - destination:
        host: kafka-cluster-01-kafka-brokers
        port:
          number: 9092
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  annotations:
  name: strimzi-kafka-vs-bootstrap
  namespace: strimzi
spec:
  gateways:
  - strimzi-kafka-gw-bootstrap
  hosts:
  - my-server
  tcp:
  - match:
    - port: 9093
    route:
    - destination:
        host: kafka-cluster-01-kafka-bootstrap
        port:
          number: 9092

Проблема в том, что когда я развертываю ресурс Kafka через оператора Strimzi Kafka в Kubernetes, мне нужно установить рекламируемый адрес и объявленный порт для брокеров для клиентов kafka, которые будут использоваться через Ingress, он также создаст прослушиватель на том же порту. поскольку Istio не может обслуживать тот же порт.

Стимзи Кафка Ресурс:

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: kafka-cluster-01
spec:
  kafka:
    version: 3.1.0
    replicas: 2
    listeners:
      - name: internal
        port: 9092
        type: internal
        tls: false
        configuration:
          brokers:
          - broker: 0
            advertisedHost: my-server
            advertisedPort: 9094
          - broker: 1
            advertisedHost: my-server
            advertisedPort: 9094
          - broker: 2
            advertisedHost: my-server
            advertisedPort: 9094
    config:
      offsets.topic.replication.factor: 2
      transaction.state.log.replication.factor: 2
      transaction.state.log.min.isr: 2
      default.replication.factor: 2
      min.insync.replicas: 2
      inter.broker.protocol.version: "3.1"
      receive.message.max.bytes: 1513486160
      advertised: my-server
    storage:
      type: jbod
      volumes:
      - id: 0
        type: persistent-claim
        size: 100Gi
        deleteClaim: false
  zookeeper:
    replicas: 1
    storage:
      type: persistent-claim
      size: 100Gi
      deleteClaim: false
  entityOperator:
    topicOperator: {}
    userOperator: {}

Как я могу сказать Kafka (Strimzi) использовать рекламируемый адрес и порт для брокеров, не создавая на нем прослушивателя для использования Ingress (Istio) перед ним?

Я не нашел этого в документации Strimzi.

Спасибо.

Я не уверен, что слежу за вопросом. Ваш Kafka CR настраивает прослушиватель на порту 9092 (порт в модулях брокера). Но он настраивается как рекламируемые адреса my-server:9094 -> поэтому вам нужно настроить Ingress для прослушивания 9094 и пересылки на порт 9092 на модулях. (единственная возможная проблема заключается в том, что у вас один и тот же рекламируемый хост для всех брокеров -> они должны быть разными)

Jakub 05.04.2022 20:22

Да, я хочу перенаправить трафик от входящего прослушивателя 9094 на сервис с портом 9092 (внутренний kubernetes). Я думал, что вход раздаст доступ к порту 9094 всем внутренним брокерам, так что мне нужен только один и тот же объявленный адрес для всех брокеров. Но моя проблема на самом деле в том, что когда я подключаюсь к начальной загрузке через порт 9093, клиент Kafka пытается подключиться к брокерам, используя их внутренний адрес kubernetes. Вот почему я подумал, что мне нужен рекламируемый адрес, но они сами создадут прослушиватель, что приведет к тому, что вход также не сможет привязаться к этому порту.

Ronny Forberger 05.04.2022 21:01

Нет, они не создают слушателя сами по себе. Объявленные* поля просто переопределяют настроенное объявленное имя хоста в брокере. Но из вашего комментария я не уверен, что вы понимаете, как работает Кафка. У вас не может быть одного входящего доступа распространение. Вам необходимо предоставить прямой доступ к каждому брокеру. Вот почему рекламируемое имя хоста всегда должно быть другим. Вам нужно иметь my-server-0:9094 для брокера 0, my-server-1:9404 для брокера 1 и т. д. И настроить вход для каждого из них.

Jakub 05.04.2022 21:50
Gateway не является документированным ресурсом, который можно использовать strimzi.io/docs/operators/latest/… Что еще более важно, Kafka не использует протокол HTTP
OneCricketeer 05.04.2022 23:23

@Jakub хорошо, я попробую.

Ronny Forberger 06.04.2022 08:09

@OneCricketeer Gateway — это ресурс Istio.

Ronny Forberger 06.04.2022 08:09

Да, я знаю, но поддерживает ли он протокол TCP? Потому что protocol: HTTP2 на порту 9094 не будет работать, так как Kafka не является службой HTTP/S. Точно так же http.match.uri в вашем VirtualService также не имеет смысла для Kafka, и вам не нужен один сервис как для брокера, так и для загрузочного адреса.

OneCricketeer 06.04.2022 17:53

@OneCricketeer Да, Istio поддерживает множество протоколов. Я изменил протокол на TCP в Istio. На объекте Gateway слушателем является TLS. Кажется, это работает с Kafka, но у меня все еще могут быть некоторые проблемы с трафиком в Istio, потому что я не могу подключиться к брокерам, даже если я настрою 3 разных брокера в Istio и назначу им их рекламные адреса соответственно. Я разберусь с этим. Спасибо.

Ronny Forberger 07.04.2022 18:04

Вам нужно будет настроить брокеров так, чтобы они возвращали адреса Istio обратно как advertised.listeners, что является основной проблемой. Похоже, в прошлом году Стримзи сказал они бы не поддержали Istio, но если у вас все получится, возможно, стоит добавить PR.

OneCricketeer 07.04.2022 18:56

Кажется, теперь это работает. Я установил advertised.listeners: SSL://my-server:9093 advertised: my-server listener.security.protocol.map: SSL:SSL inter.broker.listener.name: SSL и нуждался в DestinationRule на своем Istio для маршрутизации к открытым текстовым сервисам kubernetes через порт 9092. Но сообщения несколько задерживаются.

Ronny Forberger 08.04.2022 17:49
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
0
10
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я тоже обхожу медлительность сейчас. Проблема заключалась в том, что я использовал службу kubernetes kafka-cluster-01-kafka-brokers, которую развернул оператор Strimzi, но она работала как балансировщик нагрузки между двумя моими брокерами kafka, поэтому иногда запрашивала неправильный раздел в моей теме, который запрашиваемый брокер не удерживал. После установки выделенного сервиса для каждого модуля брокера я смог полностью получить работающую очередь kafka с Istio впереди.

Мне просто нужно как-то сообщить оператору Stimzi, как развернуть выделенные службы для каждого модуля и соответственно пометить модули.

Другие вопросы по теме