Лидер раздела Kafka -1 ТОЛЬКО через SSL

avatar
Amos Shapira
9 августа 2021 в 00:47
97
1
1

Я работаю над переносом всего нашего трафика Kafka через SSL. У нас есть два кластера в каждом регионе.

Использование Kafka версии 2.7.0.

Все регионы и все кластеры нормально работают через SSL, кроме одного кластера.

Среди других инструментов я использую kafkacat для исследования кластера.

Когда kafkacat -L выполняется для этого кластера через открытое текстовое соединение, он перечисляет все брокеры, темы и разделы и показывает лидера каждого раздела:

# kafkacat -b kafka-cluster1-kafka-brokers.domain.com:9092 -L | head
Metadata for all topics (from broker -1: kafka-cluster1-kafka-brokers.domain.com:9092/bootstrap):
 4 brokers:
  broker 1 at kafka-cluster1-kafka-1.domain.com:9092 (controller)
  broker 4 at kafka-cluster1-kafka-4.domain.com:9092
  broker 2 at kafka-cluster1-kafka-2.domain.com:9092
  broker 3 at kafka-cluster1-kafka-3.domain.com:9092
 49 topics:
  topic "topic.name" with 4 partitions:
    partition 0, leader 3, replicas: 3,2,1, isrs: 1,2,3
    partition 1, leader 1, replicas: 1,3,4, isrs: 1,3,4

При выполнении той же команды через SSL kafkacat находит:

  1. 0 брокеров
  2. Список тем и разделов, но без лидеров
# kafkacat -b kafka-cluster1-kafka-brokers.domain.com:9093 -X security.protocol=SSL -X ssl.endpoint.identification.algorithm=none -X enable.ssl.certificate.verification=false -L | head
Metadata for all topics (from broker -1: ssl://kafka-cluster1-kafka-brokers.domain.com:9093/bootstrap):
 0 brokers:
 49 topics:
  topic "topic_name" with 4 partitions:
    partition 0, leader -1, replicas: 3,2,1, isrs: 1,2,3, Broker: Leader not available
    partition 1, leader -1, replicas: 1,3,4, isrs: 1,3,4, Broker: Leader not available
    partition 2, leader -1, replicas: 4,1,2, isrs: 1,2,4, Broker: Leader not available
    partition 3, leader -1, replicas: 2,4,3, isrs: 2,3,4, Broker: Leader not available

Те же команды для другого кластера в регионе, как по открытому тексту, так и по SSL, работают отлично.

inter.broker.protocol и связь с кластером Zookeeper — PLAINTEXT. SSL на данный момент используется только для общения с клиентами Kafka. Аутентификация еще не используется, и клиенты не проверяют сертификат сервера.

Кластеры создаются с использованием Packer для AMI и Terraform для развертывания, все это происходит автоматически. Я трижды проверил, что конфигурация этого кластера ничем не отличается от других.

Используемые сертификаты выпущены Let's Encrypt. Я даже пробовал копировать сертификаты из другого кластера в регионе, все работает нормально, но все равно получаю тот же результат.

За исключением имен хостов, конфигурация кластера, работающего с SSL, и кластера, не поддерживающего SSL, идентична.

Что еще может быть причиной такого странного поведения?

РЕДАКТИРОВАТЬ: дополнительное исследование показывает, что записи Zookeeper для брокеров Kafka в этом кластере пропускают сопоставления SSL:

{"features":{},"listener_security_protocol_map":{"PLAINTEXT":"PLAINTEXT"},"endpoints":["PLAINTEXT://kafka-cluster1-kafka-1.domain.com:9092"],"rack":"ap-southeast-2a","jmx_port":9999,"port":9092,"host":"kafka-cluster1-kafka-1.domain.com","version":5,"timestamp":"1628554957052"}

В отличие от "здорового" кластера:

{"features":{},"listener_security_protocol_map":{"PLAINTEXT":"PLAINTEXT","SSL":"SSL"},"endpoints":["PLAINTEXT://kafka-cluster2-kafka-1.domain.com:9092","SSL://kafka-cluster2-kafka-1.domain.com:9093"],"rack":"ap-southeast-2a","jmx_port":9999,"port":9092,"host":"kafka-cluster2-kafka-1.domain.com","version":5,"timestamp":"1626842428002"}

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

В файле брокера server.properties раньше НЕ было строки listener.security.protocol, потому что мы хотим использовать значение по умолчанию, но даже раскомментирование не имело значения:

listener.security.protocol.map=PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL

Теперь вопрос в том, откуда Kafka получает информацию, которую он помещает в запись Zookeeper?

Источник

Ответы (1)

avatar
Amos Shapira
10 августа 2021 в 00:57
1

Проблема оказалась в том, что динамическая конфигурация Kafka была установлена ​​в этом кластере и перезаписала "статическую" конфигурацию, заданную в текстовых файлах.

# /opt/kafka/bin/kafka-configs.sh --bootstrap-server $(hostname):9092 --entity-type brokers --entity-name 1 --describe
Dynamic configs for broker 1 are:
  advertised.listeners=PLAINTEXT://kafka-cluster1-kafka-1.domain.com:9092 sensitive=false synonyms={DYNAMIC_BROKER_CONFIG:advertised.listeners=PLAINTEXT://kafka-cluster1-kafka-1.domain.com:9092, STATIC_BROKER_CONFIG:advertised.listeners=PLAINTEXT://kafka-cluster1-kafka-1.domain.com:9092,SSL://kafka-cluster1-kafka-1.domain.com:9093}

В других кластерах, в которых не было этой проблемы, эта запись была пустой. Удаление if для плохого кластера устранило проблему, и kafkacat начал работать через SSL так же, как и для PLAINTEXT.

Команда для удаления:

/opt/kafka/bin/kafka-configs.sh --bootstrap-server $(hostname):9092 --entity-type brokers --entity-name x --alter --delete-config advertised.listeners

Где x — это каждый broker.id в кластере.