У меня есть вопрос о том, как настроить оператора 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.
Спасибо.
Да, я хочу перенаправить трафик от входящего прослушивателя 9094 на сервис с портом 9092 (внутренний kubernetes). Я думал, что вход раздаст доступ к порту 9094 всем внутренним брокерам, так что мне нужен только один и тот же объявленный адрес для всех брокеров. Но моя проблема на самом деле в том, что когда я подключаюсь к начальной загрузке через порт 9093, клиент Kafka пытается подключиться к брокерам, используя их внутренний адрес kubernetes. Вот почему я подумал, что мне нужен рекламируемый адрес, но они сами создадут прослушиватель, что приведет к тому, что вход также не сможет привязаться к этому порту.
Нет, они не создают слушателя сами по себе. Объявленные* поля просто переопределяют настроенное объявленное имя хоста в брокере. Но из вашего комментария я не уверен, что вы понимаете, как работает Кафка. У вас не может быть одного входящего доступа распространение. Вам необходимо предоставить прямой доступ к каждому брокеру. Вот почему рекламируемое имя хоста всегда должно быть другим. Вам нужно иметь my-server-0:9094 для брокера 0, my-server-1:9404 для брокера 1 и т. д. И настроить вход для каждого из них.
Gateway
не является документированным ресурсом, который можно использовать strimzi.io/docs/operators/latest/… Что еще более важно, Kafka не использует протокол HTTP
@Jakub хорошо, я попробую.
@OneCricketeer Gateway — это ресурс Istio.
Да, я знаю, но поддерживает ли он протокол TCP? Потому что protocol: HTTP2
на порту 9094 не будет работать, так как Kafka не является службой HTTP/S. Точно так же http.match.uri
в вашем VirtualService также не имеет смысла для Kafka, и вам не нужен один сервис как для брокера, так и для загрузочного адреса.
@OneCricketeer Да, Istio поддерживает множество протоколов. Я изменил протокол на TCP в Istio. На объекте Gateway слушателем является TLS. Кажется, это работает с Kafka, но у меня все еще могут быть некоторые проблемы с трафиком в Istio, потому что я не могу подключиться к брокерам, даже если я настрою 3 разных брокера в Istio и назначу им их рекламные адреса соответственно. Я разберусь с этим. Спасибо.
Вам нужно будет настроить брокеров так, чтобы они возвращали адреса Istio обратно как advertised.listeners
, что является основной проблемой. Похоже, в прошлом году Стримзи сказал они бы не поддержали Istio, но если у вас все получится, возможно, стоит добавить PR.
Кажется, теперь это работает. Я установил advertised.listeners: SSL://my-server:9093 advertised: my-server listener.security.protocol.map: SSL:SSL inter.broker.listener.name: SSL
и нуждался в DestinationRule на своем Istio для маршрутизации к открытым текстовым сервисам kubernetes через порт 9092. Но сообщения несколько задерживаются.
Я тоже обхожу медлительность сейчас. Проблема заключалась в том, что я использовал службу kubernetes kafka-cluster-01-kafka-brokers
, которую развернул оператор Strimzi, но она работала как балансировщик нагрузки между двумя моими брокерами kafka, поэтому иногда запрашивала неправильный раздел в моей теме, который запрашиваемый брокер не удерживал. После установки выделенного сервиса для каждого модуля брокера я смог полностью получить работающую очередь kafka с Istio впереди.
Мне просто нужно как-то сообщить оператору Stimzi, как развернуть выделенные службы для каждого модуля и соответственно пометить модули.
Я не уверен, что слежу за вопросом. Ваш Kafka CR настраивает прослушиватель на порту 9092 (порт в модулях брокера). Но он настраивается как рекламируемые адреса
my-server:9094
-> поэтому вам нужно настроить Ingress для прослушивания 9094 и пересылки на порт 9092 на модулях. (единственная возможная проблема заключается в том, что у вас один и тот же рекламируемый хост для всех брокеров -> они должны быть разными)