Skip to main content
В этом руководстве рассказывается, как настроить кластеры ClickHouse и Keeper с помощью оператора.

Конфигурация ClickHouseCluster

Базовая конфигурация

Реплики и сегменты

  • Реплики: Количество экземпляров ClickHouse в каждом сегменте (для высокой доступности)
  • Сегменты: Количество горизонтальных сегментов (для масштабирования)
Кластер с replicas: 3 и shards: 2 создаст всего 6 подов ClickHouse.

Интеграция с Keeper

Для координации в каждом кластере ClickHouse должен быть указан KeeperCluster:
Когда задан keeperClusterRef.namespace, оператор должен отслеживать оба пространства имен. Если настроена переменная WATCH_NAMESPACE, включите в этот список пространства имен ClickHouse и Keeper.

Конфигурация KeeperCluster

Конфигурация хранилища

Настройте постоянное хранилище с помощью dataVolumeClaimSpec — стандартного Kubernetes PersistentVolumeClaimSpec. Оператор преобразует его в отдельный PersistentVolumeClaim для каждой реплики, смонтированный по пути /var/lib/clickhouse:
Оператор может изменять существующий PVC, только если используемый класс хранилища поддерживает расширение томов.
Подключение дополнительных дисков в конфигурации с несколькими дисками (JBOD), работа без постоянного тома, увеличение емкости, пользовательские политики хранения и правила, определяющие, что нельзя изменить после создания, рассматриваются в отдельном руководстве по хранилищу и томам.

Домен кластера

spec.clusterDomain задаёт DNS-суффикс Kubernetes, который оператор использует при формировании полных доменных имён подов, записываемых в конфигурацию сервера ClickHouse. По умолчанию используется cluster.local; этот параметр есть как в ClickHouseCluster, так и в KeeperCluster.
Оператор обращается к каждому поду через headless Service по адресу <pod>.<headless-service>.<namespace>.svc.<clusterDomain>. Этот суффикс используется в двух частях сгенерированной конфигурации:
  • В ClickHouseCluster его значение используется для имен хостов реплик в remote_servers (межрепличные запросы и запросы Distributed).
  • В KeeperCluster его значение формирует имена хостов узлов Keeper, которые ClickHouse использует для координации.
Переопределяйте это только в том случае, если kubelet в вашем кластере запущен с параметром --cluster-domain, отличным от cluster.local. Если значение не совпадает с фактическим доменом кластера, ClickHouse не сможет разрешить имена хостов Keeper и реплик — координация и запросы Distributed будут завершаться ошибками DNS resolution. Установите одно и то же значение в ClickHouseCluster и в KeeperCluster, на который он ссылается.

Многодисковое (JBOD) хранилище

additionalVolumeClaimTemplates подключает дополнительные диски к каждой реплике ClickHouse в дополнение к основному dataVolumeClaimSpec, который обязателен для их использования. Каждая запись представляет собой шаблон PVC — metadata.name и PVC spec. Эти диски обрабатываются точно так же, как и основной диск данных, — как volumeClaimTemplates в StatefulSet, — поэтому контроллер StatefulSet создает и сохраняет по одному PVC для каждой реплики с именем <name>-<statefulset>-0.
Оператор монтирует каждый дополнительный том в /var/lib/clickhouse/disks/<name> и добавляет его в автоматически сгенерированную конфигурацию хранилища ClickHouse. Дефисы в имени заменяются на символы подчёркивания в идентификаторе диска ClickHouse; путь монтирования сохраняет исходное имя. Основной диск данных и все дополнительные диски помещаются в один том политики хранилища default, поэтому ClickHouse распределяет новые части данных между ними по циклу round-robin. Полезная ёмкость равна сумме ёмкостей всех дисков, и каждая таблица, для которой не задана собственная storage_policy (включая таблицы system.*), использует этот объединённый набор.
Имена PVC должны соответствовать шаблону ^[a-z]([-a-z0-9]*[a-z0-9])?$ и не должны совпадать с именем основного тома данных. Как и в случае с основным диском данных, набор дополнительных дисков фиксируется при создании: добавление, удаление или переименование записей после создания не допускается. Дополнительные PVC сохраняются при удалении кластера, как и основной диск данных. Размер хранилища для существующей записи можно увеличить, если класс хранилища поддерживает расширение.

Домен кластера

spec.clusterDomain задаёт DNS-суффикс Kubernetes, который оператор использует при формировании полных доменных имён подов, записываемых в конфигурацию сервера ClickHouse. По умолчанию используется cluster.local; этот параметр доступен как в ClickHouseCluster, так и в KeeperCluster.
Оператор обращается к каждому поду через headless Service по адресу <pod>.<headless-service>.<namespace>.svc.<clusterDomain>. Этот суффикс используется в двух частях сгенерированной конфигурации:
  • В ClickHouseCluster его значение используется для имён хостов реплик в remote_servers (для межрепликового взаимодействия и запросов Distributed).
  • В KeeperCluster его значение используется для формирования имён хостов узлов Keeper, которые ClickHouse применяет для координации.
Переопределяйте это значение только в том случае, если kubelet вашего кластера запущен с --cluster-domain, отличным от cluster.local. Если значение не совпадает с фактическим доменом кластера, ClickHouse не сможет разрешить имена хостов Keeper и реплик — координация и запросы Distributed будут завершаться ошибками DNS resolution. Укажите одно и то же значение в ClickHouseCluster и в связанном с ним KeeperCluster.

Настройка пода

Автоматическое топологическое распределение и аффинность

Распределите поды по зонам доступности:
Убедитесь, что в вашем кластере Kubernetes достаточно узлов в разных зонах, чтобы выполнить требования к распределению.

Ручная конфигурация

Можно указать произвольные правила affinity/anti-affinity для подов и ограничения на распределение по топологии.

Все поддерживаемые параметры шаблона пода см. в справочнике по API.

Бюджеты сбоев подов

Оператор создает PodDisruptionBudget (PDB) для каждого кластера, чтобы плановые нарушения работы — дренирование узлов, поэтапные обновления, вытеснение автоскейлером — не могли вывести из строя достаточно подов, чтобы потерять кворум или нарушить доступность. Для кластеров ClickHouse с более чем одним сегментом создается один PDB на каждый сегмент, чтобы сбой в одном сегменте не учитывался в другом.

Значения по умолчанию

Оператор выбирает безопасные значения по умолчанию с учётом размера кластера, чтобы уже после первого apply защитить его от случайной потери кворума. Для ClickHouseCluster с 3 сегментами и replicas: 3 оператор создаёт три PDB — по одному на каждый сегмент, каждый с minAvailable: 1.

Переопределение значений по умолчанию

Используйте spec.podDisruptionBudget, чтобы переопределить либо minAvailable, либо maxUnavailable (ровно одно из них):
Или вариант maxUnavailable с указанием в процентах:
Одновременная установка minAvailable и maxUnavailable отклоняется валидирующим вебхуком. Выберите что-то одно — сам Kubernetes тоже не разрешает задавать оба параметра одновременно.
Вы также можете передать поле unhealthyPodEvictionPolicy в сгенерированный PDB — это полезно, если нужно разрешить вытеснение подов, которые всё ещё находятся в состоянии NotReady:

Политики

spec.podDisruptionBudget.policy позволяет выбрать, насколько активно оператор управляет PDB: Пример — полностью отключить управление PDB в кластере разработки:
Пример — оставьте созданный вручную PDB рядом с кластером и не позволяйте оператору его затрагивать:

Отключение на уровне всего кластера

Управление PDB также можно отключить на уровне всего кластера через переменную окружения оператора ENABLE_PDB. При ENABLE_PDB=false оператор пропускает шаг сверки PDB для всех ClickHouseCluster и KeeperCluster независимо от их spec.podDisruptionBudget.policy и вообще не отслеживает ресурсы PodDisruptionBudget. Поэтому ServiceAccount оператора не нужны разрешения RBAC на poddisruptionbudgets.policy/v1, что полезно, если оператор запускается с ограниченным ServiceAccount, в котором эти разрешения намеренно отсутствуют.
Это предназначено для сред, где используются собственные политики disruption (например, через Gatekeeper / Kyverno) и где оператор должен быть полностью исключён из процесса.

Настройка контейнера

Собственный образ

Используйте конкретный образ ClickHouse:

Ресурсы контейнеров

Настройте CPU и память для контейнеров ClickHouse:

Переменные окружения

Добавьте пользовательские переменные окружения:

Подключение томов

Добавьте дополнительные точки монтирования томов:
Допускается указывать несколько подключений томов к одному и тому же mountPath. Оператор создаст projected volume со всеми указанными подключениями.

Все поддерживаемые параметры шаблона контейнера см. в справочнике по API.

Конфигурация TLS/SSL

Настройка защищённых конечных точек

Укажите ссылку на Secret Kubernetes с TLS-сертификатами, чтобы включить защищённые конечные точки

Формат Secret с SSL-сертификатом

Предполагается, что Secret содержит серверную пару ключей:
  • tls.crt - серверный сертификат в PEM-формате
  • tls.key - приватный ключ в PEM-формате
Этот формат совместим с сертификатами, созданными cert-manager.

Взаимодействие ClickHouse-Keeper по TLS

Если в KeeperCluster включен TLS, ClickHouseCluster будет автоматически использовать защищенное соединение с узлами Keeper. ClickHouseCluster проверяет сертификаты узлов Keeper по системному хранилищу доверенных сертификатов, а также по любому настроенному вами caBundle. Чтобы доверять частному CA (например, самоподписанному или внутреннему CA), укажите ссылку на пользовательский набор CA:

External Secret

По умолчанию оператор создает Secret с внутренними учетными данными кластера и управляет им (межсерверный пароль, пароль управления, идентификатор Keeper, секрет кластера, ключ named-collections). Secret получает имя кластера и находится в его пространстве имен. Если вы хотите управлять этими учетными данными самостоятельно — например, получать их из HashiCorp Vault, AWS Secrets Manager или External Secrets Operator — укажите оператору уже существующий Secret с помощью spec.externalSecret:
Указанный Secret должен находиться в том же пространстве имен, что и ClickHouseCluster. Оператор никогда не удаляет Secret, если не создавал его сам.

Обязательные ключи

Secret должен содержать следующие ключи: Полный Secret выглядит так:

Политика: Observe или Manage

spec.externalSecret.policy определяет, как оператор обрабатывает отсутствие обязательных ключей:
Даже при policy: Manage Secret уже должен существовать в пространстве имен — оператор никогда не создает сам Secret, а только записывает сгенерированные ключи в уже существующий. Если указанный Secret отсутствует, реконсиляция блокируется с причиной ExternalSecretNotFound независимо от политики.
Выбирайте Observe, если внешний источник (Vault, ESO, sealed-secrets, GitOps) является источником истины и вы хотите, чтобы оператор явно сигнализировал об ошибке конфигурации. Выбирайте Manage, если вам нужна самодостаточная начальная инициализация, но при этом вы хотите сохранить контроль над самим объектом Secret (например, чтобы делать его резервную копию).

Условие состояния и устранение неполадок

Оператор выставляет условие ExternalSecretValid в ClickHouseCluster.status.conditions. Проверьте его, если кажется, что реконсиляция зависла:
Возможные причины: Пока Secret недействителен, оператор повторно ставит реконсиляцию в очередь, поэтому после добавления отсутствующих ключей следующая реконсиляция автоматически их подхватит — перезапускать поды не нужно.
Набор обязательных ключей зависит от запущенной версии ClickHouse. named-collections-key проверяется только после того, как проверка версии оператора обнаружит ClickHouse 25.12 или новее. В более старых версиях этот ключ может отсутствовать в Secret.

Дополнительные порты

Оператор предоставляет фиксированный набор портов на каждом поде ClickHouse и в его headless Service: 8123 HTTP, 9000 native, 9009 interserver, 9001 management, 9363 метрики Prometheus, а также варианты с TLS 8443/9440, если TLS включен. Чтобы ClickHouse прослушивал дополнительные протоколы — MySQL, PostgreSQL, gRPC — или любой пользовательский порт, объявите их в spec.additionalPorts:
Оператор добавляет эти порты в containerPorts пода и в headless Service. Полный пример приведён в examples/custom_protocols.yaml.
additionalPorts открывает порты только на стороне Kubernetes. Он не настраивает сервер ClickHouse на прослушивание этих портов. Также нужно включить соответствующий протокол в spec.settings.extraConfig.protocols. Иначе порт будет открыт на Service, но внутри пода на нём ничего не будет отвечать.

Полный пример: протокол MySQL

Чтобы предоставить доступ к ClickHouse по протоколу MySQL на порту 9004:
После применения проверьте, находясь внутри кластера:

Ограничения для полей

Зарезервированные порты и имена

Валидирующий вебхук отклоняет записи additionalPorts, которые пересекаются с портами, используемыми самим оператором. Все порты, связанные с TLS, зарезервированы безусловно, чтобы последующее включение spec.settings.tls.enabled не нарушило работу ранее корректного кластера. Следующие имена также отклоняются — это внутренние идентификаторы типов протоколов оператора (а не человекочитаемые псевдонимы): Отклонённый запрос приводит к ошибке вида:

Проверка версии и канал обновления

Оператор выполняет две независимые функции, связанные с версиями кластера:
  1. Проверка версии — для ClickHouseCluster Kubernetes задача однократно запускает контейнерный образ, чтобы определить запущенную версию ClickHouse; для KeeperCluster оператор считывает версию, сообщаемую сервером, с работающих реплик. Определённая версия записывается в .status.version и используется другими этапами реконсиляции (например, ключ named-collections для External Secret требуется только начиная с ClickHouse 25.12).
  2. Канал обновления — периодическая проверка публичной ленты релизов ClickHouse (https://clickhouse.com/data/version_date.tsv). Оператор сообщает о наличии более новой версии через условие состояния VersionUpgraded. Самостоятельно кластер он никогда не обновляет — тег образа контролирует пользователь.

Выбор канала обновления

spec.upgradeChannel задаёт, с каким набором апстримных релизов сверяется оператор. Такое же поле есть и в ClickHouseCluster, и в KeeperCluster.
Допустимые значения (проверяются CRD по шаблону ^(lts|stable|\d+\.\d+)?$): Для продакшн обычно предпочтительнее явно закрепить канал на значении <major>.<minor> (например, 25.8). Это фиксирует кластер на нужной ветке мажорных релизов и позволяет оператору выдавать предупреждение WrongReleaseChannel, если какая-либо реплика по какой-то причине перейдёт на другой мажорный релиз, — что особенно важно, когда image указан по дайджесту (@sha256:...), а не по человекочитаемому тегу. Пустое значение по умолчанию подходит для Development-clusters, где переходы между мажорными версиями не критичны.

Условия

Два условия показывают результат проверки версии и проверки обновления: Проверьте их с помощью:

Переопределение задачи проверки версии

Это относится только к ClickHouseCluster. KeeperCluster больше не запускает задачу проверки версии — его версия считывается напрямую с работающих реплик Keeper, — поэтому spec.versionProbeTemplate устарел и там не действует. Проверка реализована как обычная Kubernetes задача. Если в вашем кластере действуют политики допуска, требующие определённых Tolerations, селекторов узлов или контекстов безопасности, либо вы хотите ограничить время, в течение которого завершённые задачи проверки остаются в системе, переопределите шаблон через spec.versionProbeTemplate:
Имя контейнера version-probe задано в операторе по умолчанию — запись в containers: совпадает с ним по имени, поэтому оператор выполняет глубокое слияние пользовательских полей со значениями по умолчанию.

Глобальные настройки оператора

Два флага в менеджере оператора глобально управляют циклом проверки обновлений: Установите --disable-version-update-checks=true в полностью изолированных средах или если исходящий трафик на clickhouse.com не разрешён.

Настройки ClickHouse

Пароль пользователя default

spec.settings.defaultUserPassword задаёт пароль для встроенного пользователя default. Укажите значение из ключа в Secret (рекомендуется) или в ConfigMap, который вы создадите, вместо того чтобы задавать его напрямую в CR:
Укажите ровно одно из secret или configMap; при этом должны быть заданы и name (объект), и key (запись, в которой хранится пароль).

Типы паролей

passwordType указывает ClickHouse, как интерпретировать значение. По умолчанию используется password (plaintext); альтернативные варианты — это хешированные формы, например password_sha256_hex и password_double_sha1_hex. Рекомендуется использовать хешированный тип, чтобы plaintext никогда не хранился. Полный список см. в разделе настроек пользователей ClickHouse.

Полный пример с объектом Secret

Создайте объект Secret, затем укажите его ключ:
При passwordType: password клиент ClickHouse внутри пода настраивается с этим паролем, что удобно для отладки.
Для пароля в виде хеша сохраните хеш вместо незашифрованного текста:

Использование ConfigMap

ConfigMap работает так же, но его содержимое не защищено так, как содержимое Secret. Используйте его только для неконфиденциальных или уже хешированных значений, например дайджеста password_sha256_hex:
Не храните пароль в открытом виде в ConfigMap. Для любого значения в открытом виде (passwordType: password) используйте Secret.

Дополнительные пользователи в конфигурации

Настройте дополнительных пользователей в файлах конфигурации. Создайте ConfigMap и Secret для пользователя:
Добавьте пользовательскую конфигурацию в ClickHouseCluster:

Синхронизация базы данных

Включите автоматическую синхронизацию базы данных для новых реплик:
Когда эта настройка включена, оператор синхронизирует таблицы Replicated и интеграционные таблицы на новые реплики.

Логирование сервера

Настройте логирование сервера ClickHouse через spec.settings.logger. Все поля необязательны и имеют безопасные значения по умолчанию, поэтому даже кластер, который вы ни разу не изменяли, уже пишет журналы уровня trace и в консоль контейнера, и в ротируемый файл на диске.
Оператор всегда оставляет логирование в консоль включённым, чтобы работал kubectl logs, а при logToFile со значением true дополнительно включает файловый журнал. В кластере с настройками по умолчанию получается такой блок logger:
Тот же блок spec.settings.logger применяется и к KeeperCluster; в этом случае оператор записывает файлы в каталог /var/log/clickhouse-keeper/.
Вывод в консоль остается включенным независимо от logToFile, поэтому kubectl logs продолжает работать, даже если вы отключите логирование в файл. Установите jsonLogs: true, если отправляете журналы в систему хранения структурированных журналов, которая разбирает JSON.

Пользовательская конфигурация

Встроенная дополнительная конфигурация

Вместо подключения пользовательских файлов конфигурации можно напрямую указать дополнительные параметры конфигурации ClickHouse. Добавьте пользовательскую конфигурацию ClickHouse с помощью extraConfig:

Встроенная конфигурация дополнительных пользователей

Вы также можете указать дополнительную конфигурацию пользователей ClickHouse с помощью extraUsersConfig. Это удобно, если нужно определить пользователей, профили, квоты и привилегии прямо в спецификации кластера.
extraUsersConfig хранится в объекте ConfigMap в k8s. Не храните там секретные данные в открытом виде.

См. документацию с полным перечнем поддерживаемых параметров конфигурации пользователей ClickHouse.

Пример конфигурации

Полный пример конфигурации:
Последнее изменение 3 июля 2026 г.