Конфигурация ClickHouseCluster
Базовая конфигурация
Реплики и сегменты
- Реплики: Количество экземпляров ClickHouse в каждом сегменте (для высокой доступности)
- Сегменты: Количество горизонтальных сегментов (для масштабирования)
replicas: 3 и shards: 2 создаст всего 6 подов ClickHouse.
Интеграция с Keeper
keeperClusterRef.namespace, оператор должен отслеживать оба пространства имен. Если настроена переменная WATCH_NAMESPACE, включите в этот список пространства имен ClickHouse и Keeper.
Конфигурация KeeperCluster
Конфигурация хранилища
dataVolumeClaimSpec — стандартного Kubernetes
PersistentVolumeClaimSpec. Оператор преобразует его в отдельный PersistentVolumeClaim для каждой реплики,
смонтированный по пути /var/lib/clickhouse:
Оператор может изменять существующий PVC, только если используемый класс хранилища поддерживает расширение томов.
Домен кластера
spec.clusterDomain задаёт DNS-суффикс Kubernetes, который оператор использует при формировании
полных доменных имён подов, записываемых в конфигурацию
сервера ClickHouse. По умолчанию используется cluster.local; этот параметр есть как в
ClickHouseCluster, так и в KeeperCluster.
<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.
<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 достаточно узлов в разных зонах, чтобы выполнить требования к распределению.
Ручная конфигурация
Все поддерживаемые параметры шаблона пода см. в справочнике по API.
Бюджеты сбоев подов
Значения по умолчанию
apply защитить его от случайной потери кворума.
Для ClickHouseCluster с 3 сегментами и
replicas: 3 оператор создаёт три PDB — по одному на каждый сегмент, каждый с minAvailable: 1.
Переопределение значений по умолчанию
spec.podDisruptionBudget, чтобы переопределить либо minAvailable, либо maxUnavailable (ровно одно из них):
maxUnavailable с указанием в процентах:
unhealthyPodEvictionPolicy в сгенерированный PDB — это полезно, если нужно разрешить вытеснение подов, которые всё ещё находятся в состоянии NotReady:
Политики
spec.podDisruptionBudget.policy позволяет выбрать, насколько активно оператор управляет PDB:
Пример — полностью отключить управление PDB в кластере разработки:
Отключение на уровне всего кластера
ENABLE_PDB. При ENABLE_PDB=false оператор пропускает шаг сверки PDB для всех ClickHouseCluster и KeeperCluster независимо от их spec.podDisruptionBudget.policy и вообще не отслеживает ресурсы PodDisruptionBudget. Поэтому ServiceAccount оператора не нужны разрешения RBAC на poddisruptionbudgets.policy/v1, что полезно, если оператор запускается с ограниченным ServiceAccount, в котором эти разрешения намеренно отсутствуют.
Настройка контейнера
Собственный образ
Ресурсы контейнеров
Переменные окружения
Подключение томов
Допускается указывать несколько подключений томов к одному и тому же
mountPath.
Оператор создаст projected volume со всеми указанными подключениями.Все поддерживаемые параметры шаблона контейнера см. в справочнике по API.
Конфигурация TLS/SSL
Настройка защищённых конечных точек
Формат Secret с SSL-сертификатом
tls.crt- серверный сертификат в PEM-форматеtls.key- приватный ключ в PEM-формате
Этот формат совместим с сертификатами, созданными cert-manager.
Взаимодействие ClickHouse-Keeper по TLS
caBundle.
Чтобы доверять частному CA (например, самоподписанному или внутреннему CA), укажите ссылку на пользовательский набор CA:
External Secret
spec.externalSecret:
Указанный Secret должен находиться в том же пространстве имен, что и ClickHouseCluster. Оператор никогда не удаляет 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.Дополнительные порты
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.
Полный пример: протокол MySQL
9004:
Ограничения для полей
Зарезервированные порты и имена
additionalPorts, которые пересекаются с портами, используемыми самим оператором. Все порты, связанные с TLS, зарезервированы безусловно, чтобы последующее включение spec.settings.tls.enabled не нарушило работу ранее корректного кластера.
Следующие имена также отклоняются — это внутренние идентификаторы типов протоколов оператора (а не человекочитаемые псевдонимы):
Отклонённый запрос приводит к ошибке вида:
Проверка версии и канал обновления
- Проверка версии — для
ClickHouseClusterKubernetesзадачаоднократно запускает контейнерный образ, чтобы определить запущенную версию ClickHouse; дляKeeperClusterоператор считывает версию, сообщаемую сервером, с работающих реплик. Определённая версия записывается в.status.versionи используется другими этапами реконсиляции (например, ключ named-collections дляExternal Secretтребуется только начиная с ClickHouse25.12). - Канал обновления — периодическая проверка публичной ленты релизов ClickHouse (
https://clickhouse.com/data/version_date.tsv). Оператор сообщает о наличии более новой версии через условие состоянияVersionUpgraded. Самостоятельно кластер он никогда не обновляет — тег образа контролирует пользователь.
Выбор канала обновления
spec.upgradeChannel задаёт, с каким набором апстримных релизов сверяется оператор. Такое же поле есть и в ClickHouseCluster, и в KeeperCluster.
^(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
При
passwordType: password клиент ClickHouse внутри пода настраивается с
этим паролем, что удобно для отладки.Использование ConfigMap
password_sha256_hex:
Не храните пароль в открытом виде в ConfigMap. Для любого значения в открытом виде
(
passwordType: password) используйте Secret.Дополнительные пользователи в конфигурации
Синхронизация базы данных
Логирование сервера
spec.settings.logger. Все поля необязательны и имеют безопасные значения по умолчанию, поэтому даже кластер, который вы ни разу не изменяли, уже пишет журналы уровня trace и в консоль контейнера, и в ротируемый файл на диске.
Оператор всегда оставляет логирование в консоль включённым, чтобы работал
kubectl logs, а при logToFile со значением true дополнительно включает файловый журнал. В кластере с настройками по умолчанию получается такой блок logger:
spec.settings.logger применяется и к KeeperCluster; в этом случае оператор записывает файлы в каталог /var/log/clickhouse-keeper/.
Вывод в консоль остается включенным независимо от
logToFile, поэтому kubectl logs продолжает работать, даже если вы отключите логирование в файл. Установите jsonLogs: true, если отправляете журналы в систему хранения структурированных журналов, которая разбирает JSON.Пользовательская конфигурация
Встроенная дополнительная конфигурация
extraConfig:
Полезные ссылки:
Встроенная конфигурация дополнительных пользователей
extraUsersConfig. Это удобно, если нужно определить пользователей, профили, квоты и привилегии прямо в спецификации кластера.
extraUsersConfig хранится в объекте ConfigMap в k8s. Не храните там секретные данные в открытом виде.