У меня есть кластер kafka, работающий в интеграционном кластере Kubernetes с 3 брокерами Kafka и 3 Zookeeper, каждый компонент работает в наборе состояний.
Руководящая диаграмма, которую я использую для развертывания кластера, является пользовательской, так как мне нужен внешний доступ к кластеру через BigIp F5, и я не нашел руководящей диаграммы для этого.
Образ Кафки — это confluentinc/cp-кафка: 5.4.0 и смотритель зоопарка confluentinc/cp-zookeeper:5.4.0
/var/lib/zookeeper/данные
и /var/lib/zookeeper/журнал
для Zookeeper сопоставляются с постоянными томами.
То же самое для /var/lib/кафка
о Кафке
Я использую hlebalbau/kafka-manager:stable для просмотра состояния кластера.
Я ставлю по три раздела на топик, и коэффициент репликации тоже равен трем.
Недавно я понял, что если я перезапущу все три брокера kafka одновременно (с kubectl удалить модуль
) все содержимое темы было потеряно:
- размер журнала падает до нуля для каждой темы
- список тем остался прежним
- список потребителей остается прежним, но текущее смещение каждого потребителя падает до отрицательного значения (если потребитель был со смещением 10000 для темы сообщения 10000, тогда размер темы падает до нуля, а смещение потребителя до -10000 )
Я никогда не сталкивался с какими-либо проблемами при перезапуске одного брокера kafka за раз и ожидании его запуска перед перезапуском другого.
Я знаю, что кластер kafka не предназначен для остановки или перезапуска таким образом. Но такого поведения я не ожидал.
Это ожидаемое поведение? Или я пропустил что-то очевидное?
Вот мой шаблон Yaml для брокера kafka. Как видно из его названия, ждать-zookeeper.sh
скрипт "просто" ждет запуска зоопарков.
---
apiVersion: приложения/v1
вид: StatefulSet
метаданные:
имя: кафка-контроллер-1
спецификация:
реплики: 1
селектор:
метки соответствия:
приложение: кафка-1
serviceName: kafka1-безголовый
шаблон:
метаданные:
этикетки:
приложение: кафка-1
кластер: кафка
спецификация:
initContainers:
- имя: init-wait-zookeeper
изображение: bash: последний
команда: ["/usr/local/bin/bash", "-c", "cp /wait-zookeeper-configmap/wait-zookeeper.sh /wait-zookeeper-emptydir/ && chmod 755 /wait-zookeeper-emptydir/ ожидание-zookeeper.sh && /wait-zookeeper-emptydir/wait-zookeeper.sh"]
томМаунты:
- имя: ожидание-зоокипер-configmap
путь монтирования: /wait-zookeeper-configmap
- имя: ожидание-zookeeper-emptydir
путь монтирования: /wait-zookeeper-emptydir
сходство:
подантиаффинити:
предпочтительныйDuringSchedulingIgnoredDuringExecution:
- вес: 100
podAffinityTerm:
селектор меток:
matchExpressions:
- ключ: приложение
оператор: В
ценности:
- кафка-2
- кафка-3
{{- если gt .Values.workerNodesNumber 5.0 }}
- зоозащитник-1
- зоозащитник-2
- зоозащитник-3
{{- конец }}
topologyKey: "kubernetes.io/hostname"
контейнеры:
- имя: кафка1
изображение: confluentinc/cp-kafka:5.4.0
Ресурсы:
Запросы:
память: "512Ми"
пределы:
память: "{{.Values.jvmMaxHeapSizeGb}}Gi"
порты:
- контейнерПорт: 9092
среда:
- имя: HOST_IP
значениеОт:
fieldRef:
путь к полю: status.hostIP
- имя: KAFKA_LISTENERS
значение: "ОБЫЧНЫЙТЕКСТ://0.0.0.0:9092"
- имя: KAFKA_ADVERTISED_LISTENERS
значение: "PLAINTEXT://$(HOST_IP):{{ добавить .Values.startingNodePort 0 }}"
- имя: KAFKA_BROKER_ID
значение: "10"
- имя: KAFKA_ZOOKEEPER_CONNECT
значение: "zookeeper-controller-1-0.zoo1-headless:2181,zookeeper-controller-2-0.zoo2-headless:2181,zookeeper-controller-3-0.zoo3-headless:2181"
- имя: KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR
значение: "3"
- имя: KAFKA_DELETE_TOPIC_ENABLE
значение: "истина"
- имя: KAFKA_DEFAULT_REPLICATION_FACTOR
значение: "3"
- имя: KAFKA_NUM_PARTITIONS
значение: "{{.Values.defaultPartitionsNumber}}"
- имя: KAFKA_LOG_RETENTION_HOURS
значение: "{{.Values.retentionTimeHours}}"
- имя: KAFKA_OFFSETS_RETENTION_MINUTES
значение: "{{.Values.retentionTimeHours | mul 60 }}"
- имя: JMX_PORT
значение: "{{ добавить .Values.startingNodePort 3 }}"
- имя: KAFKA_JMX_HOSTNAME
значение: "кафка-сервис-1"
- имя: KAFKA_HEAP_OPTS
значение: "-Xms512m -Xmx{{.Values.jvmMaxHeapSizeGb}}G"
живостьзонд:
исполнитель:
команда:
- /бин/баш
- -с
- "отключить JMX_PORT && kafka-broker-api-versions --bootstrap-server=localhost:9092"
начальные секунды задержки: 60
периодСекунды: 20
томМаунты:
- название: "кафка-журналы"
mountPath: "/var/lib/kafka"
тома:
- имя: "подожди-зоокипер-configmap"
карта конфигурации:
имя: "кафка-инициализатор"
Предметы:
- ключ: "wait-zookeeper.sh"
путь: "wait-zookeeper.sh"
- имя: "wait-zookeeper-emptydir"
пустойКаталог: {}
шаблоны VolumeClaim:
- метаданные:
имя: кафка-журналы
спецификация:
storageClassName: {{.Values.storageClassName}}
режимы доступа: ["ReadWriteOnce"]
Ресурсы:
Запросы:
хранилище: {{.Values.storageSizeGb}}Gi