Оператор записывает события Kubernetes в объекты ClickHouseCluster и
KeeperCluster, которыми он управляет. Эти события показывают, что оператор делал
во время реконсиляции: где не удалось применить изменения ресурсов, когда кластер стал
готов, почему было заблокировано масштабирование, — а также помогают выявить сбои, которые обычно не попадают в журналы, которые просматривает пользователь. Они дополняют метрики,
добавляя человекочитаемую историю непосредственно в пользовательский ресурс.
clickhouse-controller сообщает о событиях для объектов ClickHouseCluster, а
keeper-controller — для объектов KeeperCluster. События, связанные со сбоями
жизненного цикла ресурсов, также содержат ссылку на соответствующий управляемый объект
(StatefulSet, Service, ConfigMap, Secret, PodDisruptionBudget,
PersistentVolumeClaim или задачу version-probe); остальные события относятся только к
самому кластеру.
Просмотр событий
Быстрее всего просмотреть их с помощью kubectl describe для пользовательского ресурса: внизу будет список
последних событий:
NS=<your-namespace>
kubectl -n $NS describe clickhousecluster <name>
kubectl -n $NS describe keepercluster <name>Чтобы вывести события напрямую — например, чтобы отслеживать их в реальном времени или отфильтровать только сбои, —
выполните запрос к ресурсу events и отфильтруйте результаты по связанному объекту или по типу:
# All events for one cluster, newest last
kubectl -n $NS get events \
--field-selector involvedObject.name=<name> \
--sort-by=.lastTimestamp
# Only warnings across the namespace
kubectl -n $NS get events --field-selector type=Warning
# Follow events as they arrive
kubectl -n $NS get events --watchВ источнике события отображается контроллер, создавший его, поэтому вы можете
отличить событие ClickHouseCluster (clickhouse-controller) от события KeeperCluster
(keeper-controller).
Справочник по причинам событий
Оператор формирует фиксированный набор причин, сгруппированных по тому, что они описывают. События Normal
обозначают штатный ход выполнения; события Warning сообщают о сбое или состоянии,
требующем вмешательства пользователя.
Жизненный цикл ресурсов
Возникает как для ClickHouseCluster, так и для KeeperCluster, когда оператору не удаётся
применить принадлежащий ему ресурс в ходе реконсиляции.
| Причина | Тип | Значение |
|---|---|---|
FailedCreate |
Warning | Оператору не удалось создать принадлежащий ему ресурс (например, StatefulSet, Service, ConfigMap, Secret, PodDisruptionBudget или задача). |
FailedUpdate |
Warning | Оператору не удалось обновить ресурс. |
FailedDelete |
Warning | Оператору не удалось удалить принадлежащий ему ресурс в ходе реконсиляции или уменьшения масштаба. |
Готовность кластера
Генерируется для обоих типов, когда кластер переходит через порог готовности.
| Причина | Тип | Значение |
|---|---|---|
ClusterReady |
Normal | Кластер стал готов: у каждого сегмента ClickHouse есть как минимум одна готовая реплика, либо кворум Keeper имеет лидера и достаточное количество ведомых узлов (или его единственная автономная реплика работает). |
ClusterNotReady |
Warning | Кластер вышел из состояния готовности — у сегмента ClickHouse не осталось ни одной готовой реплики, либо кворум Keeper потерял лидера или слишком много ведомых узлов. |
Масштабирование
Создаётся для KeeperCluster, когда оператор изменяет количество реплик.
| Причина | Тип | Значение |
|---|---|---|
HorizontalScaleStarted |
Normal | Оператор начал добавлять или удалять реплики. |
HorizontalScaleCompleted |
Normal | Операция масштабирования завершена. |
ReplicaCreated |
Normal | Оператор добавил реплику в кластер. |
ReplicaDeleted |
Normal | Оператор удалил реплику при уменьшении числа реплик. |
HorizontalScaleBlocked |
Warning | Оператор отказался выполнять масштабирование, потому что текущее состояние Keeper пока не позволяет сделать это безопасно. |
External secret
Генерируется для ClickHouseCluster, когда кластер ссылается на внешний Secret,
который оператор не может использовать. См. описание возможности External Secret в
руководстве по настройке.
| Причина | Тип | Значение |
|---|---|---|
ExternalSecretNotFound |
Warning | Указанный Secret не существует в пространстве имен кластера. |
ExternalSecretInvalid |
Warning | Secret существует, но в нем отсутствуют обязательные ключи (сообщается только при политике Observe). |
Проверки версий
Генерируются проверками версий для ClickHouseCluster и KeeperCluster.
VersionProbeFailed относится только к задаче version-probe для ClickHouse.
| Причина | Тип | Значение |
|---|---|---|
VersionProbeFailed |
Warning | задача version-probe не смог определить версию запущенного ClickHouse. |
VersionDiverge |
Warning | Обнаруженная версия реплики отличается от версии, которую оператор определил для кластера. Не выводится во время rolling updates. |
VersionUpgradeAvailable |
Warning | В настроенном канале обновления доступна более новая версия, запущенная версия отсутствует в этом канале или больше не поддерживается. Оператор никогда не выполняет обновление самостоятельно — это событие только информирует. |
Предупреждения сервера ClickHouse
| Причина | Тип | Значение |
|---|---|---|
ClickHouseWarning |
Warning | Предупреждение, о котором сообщает сам сервер ClickHouse и которое повторно публикуется из system.warnings. |
Эта последняя причина отличается: она не описывает действия самого оператора. На
каждой готовой реплике оператор периодически запрашивает таблицу
system.warnings на сервере и
повторно публикует каждую строку как событие Warning в кластере, добавляя префикс
с именем реплики, из которой она получена. Так собственные предупреждения ClickHouse
о конфигурации и среде выполнения — устаревшие настройки, слишком низкие лимиты, небезопасные параметры — превращаются в события, которые можно увидеть
с помощью kubectl, не открывая сеанс clickhouse-client для каждой реплики.
kubectl -n $NS get events \
--field-selector reason=ClickHouseWarning,involvedObject.name=<name>События, метрики и состояния
Оператор предоставляет три уровня обсервабилити; используйте каждый по его основному назначению:
- События (это руководство) — недавние, человекочитаемые, привязанные к объекту. Лучше всего
подходят для ответа на вопрос «что только что произошло с этим кластером» и для интерактивного поиска неисправностей с помощью
kubectl describe. Со временем они удаляются. status.conditionsв пользовательском ресурсе — актуальное, сохраняемое состояние (готовность, валидность External Secret, допустимость масштабирования, синхронизация версий). Лучше всего подходят для скриптов и проверок работоспособности в GitOps. Читайте их с помощьюkubectl get clickhousecluster <name> -o jsonpath='{.status.conditions}'.- Метрики — долговечные и числовые. Лучше всего подходят для панелей мониторинга и для оповещений при устойчивом уровне ошибок reconcile.
Событие Warning и условие False часто описывают одну и ту же проблему с двух
сторон: событие фиксирует момент и сообщение, а условие отражает
состояние, пока проблема не будет устранена.
Устранение неполадок по событиям
Несколько распространённых сигналов и то, на что они указывают:
FailedCreate/FailedUpdateповторяются — оператор не может применить ресурс. В сообщении события приводится ошибка API (отклонение на этапе допуска, квота, недопустимая спецификация). Реконсиляция выполняет повторные попытки, поэтому временная причина устранится сама; если проблема сохраняется, нужно исправить спецификацию или кластер.ClusterNotReadyбез соответствующегоClusterReady— кластер не восстанавливается. В сообщении события указаны неготовые сегменты или проблема с кворумом; проверьте соответствующие поды.HorizontalScaleBlocked— запланированное масштабирование приостановлено из соображений безопасности. Прочитайте сообщение, чтобы понять точное ограничение, прежде чем что-либо форсировать.ExternalSecretNotFound/ExternalSecretInvalid— исправьте имя Secret или его ключи; соответствующее условиеExternalSecretValidпримет значениеTrue, как только оператор сможет его использовать.ClickHouseWarning— проблема внутри ClickHouse, а не в операторе. Относитесь к этому сообщению так же, как к строке изsystem.warnings.
- Мониторинг оператора — метрики и проверки состояния, более устойчивый аналог событий.
- Масштабирование — что защищает
HorizontalScaleBlockedи как кворум Keeper ограничивает масштабирование. - Конфигурация — возможность External Secret, стоящая за событиями external-secret.