Saltar al contenido principal
Esta guía describe cómo configurar los clústeres de ClickHouse y Keeper mediante el operador.

Configuración de ClickHouseCluster

Configuración básica

Réplicas y segmentos

  • Réplicas: Número de instancias de ClickHouse por segmento (para alta disponibilidad)
  • Segmentos: Número de particiones horizontales (para el escalado)
Un clúster con replicas: 3 y shards: 2 creará 6 pods de ClickHouse en total.

Integración de Keeper

Cada clúster de ClickHouse debe hacer referencia a un KeeperCluster para coordinarse:
Cuando se establece keeperClusterRef.namespace, el operador debe observar ambos espacios de nombres. Si WATCH_NAMESPACE está configurado, incluya los espacios de nombres de ClickHouse y Keeper en esa lista.

Configuración de KeeperCluster

Configuración de almacenamiento

Configure el almacenamiento persistente con dataVolumeClaimSpec, un PersistentVolumeClaimSpec estándar de Kubernetes. El operador lo convierte en un PersistentVolumeClaim por réplica montado en la ruta de datos /var/lib/clickhouse:
El operador solo puede modificar un PVC existente si la clase de almacenamiento asociada admite la expansión de volúmenes.
La adición de discos adicionales en una configuración de varios discos (JBOD), la ejecución sin un volumen persistente, la ampliación de la capacidad, las políticas de almacenamiento personalizadas y las reglas sobre lo que no puede cambiar después de la creación se tratan en la guía de almacenamiento y volúmenes.

Dominio del clúster

spec.clusterDomain establece el sufijo DNS de Kubernetes que usa el operador al generar los nombres de host completos de los pods de Kubernetes que escribe en la configuración de servidor ClickHouse. Su valor predeterminado es cluster.local y está disponible tanto en ClickHouseCluster como en KeeperCluster.
El operador se dirige a cada pod de Kubernetes a través del Service headless como <pod>.<headless-service>.<namespace>.svc.<clusterDomain>. Ese sufijo se usa en dos partes de la configuración generada:
  • En un ClickHouseCluster, su valor se usa para los nombres del host de las réplicas en remote_servers (consultas entre réplicas y consultas Distributed).
  • En un KeeperCluster, su valor se usa para construir los nombres del host de los nodos de Keeper que ClickHouse utiliza para la coordinación.
Sobrescriba esto solo cuando el agente kubelet de su clúster se ejecute con un --cluster-domain distinto de cluster.local. Si el valor no coincide con el dominio real del clúster, ClickHouse no podrá resolver los nombres del host de Keeper ni de las réplicas, y la coordinación y las consultas Distributed fallarán con errores de resolución de DNS. Establezca el mismo valor en el ClickHouseCluster y en el KeeperCluster al que hace referencia.

Almacenamiento multidisco (JBOD)

additionalVolumeClaimTemplates agrega discos adicionales a cada réplica de ClickHouse, además del dataVolumeClaimSpec principal, que es necesario para poder usarlos. Cada entrada es una plantilla de PVC: un metadata.name y una spec de PVC. Los discos se reconcilian exactamente igual que el disco de datos principal, como volumeClaimTemplates de StatefulSet, por lo que el controlador de StatefulSet crea y conserva un PVC por réplica, con el nombre <name>-<statefulset>-0.
El operador monta cada volumen adicional en /var/lib/clickhouse/disks/<name> y lo añade a una configuración de almacenamiento de ClickHouse generada automáticamente. Los guiones de un nombre se convierten en guiones bajos en el identificador del disco de ClickHouse; la ruta de montaje conserva el nombre original. El disco de datos principal y todos los discos adicionales se colocan en un único volumen de la política de almacenamiento default, por lo que ClickHouse distribuye las nuevas partes de datos entre todos ellos con un esquema round-robin. La capacidad utilizable es la suma de todos los discos, y toda tabla que no defina su propia storage_policy (incluidas las tablas system.*) usa el conjunto combinado.
Los nombres de los PVC deben coincidir con ^[a-z]([-a-z0-9]*[a-z0-9])?$ y no deben entrar en conflicto con el nombre del volumen de datos principal. Al igual que el disco de datos principal, el conjunto de discos adicionales queda fijado en el momento de la creación: cualquier intento de añadir, eliminar o renombrar entradas después de la creación se rechaza. Los PVC adicionales se conservan cuando se elimina el clúster, igual que el disco de datos principal. El tamaño de almacenamiento de una entrada existente puede ampliarse si la clase de almacenamiento admite la expansión.

Dominio del clúster

spec.clusterDomain establece el sufijo DNS de Kubernetes que el operador usa al generar los nombres de host completos de los pods de Kubernetes que escribe en la configuración del servidor ClickHouse. Su valor predeterminado es cluster.local y existe tanto en ClickHouseCluster como en KeeperCluster.
El operador accede a cada pod de Kubernetes a través del Service headless como <pod>.<headless-service>.<namespace>.svc.<clusterDomain>. Ese sufijo se refleja en dos partes de la configuración generada:
  • En un ClickHouseCluster, su valor se utiliza para los nombres del host de las réplicas en remote_servers (consultas entre réplicas y consultas Distributed).
  • En un KeeperCluster, su valor se usa para construir los nombres del host de los nodos de Keeper que ClickHouse utiliza para la coordinación.
Solo sobrescriba esto cuando el agente kubelet de su clúster se ejecute con un --cluster-domain distinto de cluster.local. Si el valor no coincide con el dominio real del clúster, ClickHouse no podrá resolver los nombres del host de Keeper ni de las réplicas, y la coordinación y las consultas Distributed fallarán con errores de resolución de DNS. Establezca el mismo valor en el ClickHouseCluster y en el KeeperCluster al que hace referencia.

Configuración del pod de Kubernetes

Dispersión de topología y afinidad automáticas

Distribuya los pods entre las zonas de disponibilidad:
Asegúrese de que su clúster de Kubernetes tenga suficientes nodos en distintas zonas para cumplir las restricciones de distribución.

Configuración manual

Se pueden especificar reglas arbitrarias de afinidad/antiafinidad de pod de Kubernetes y restricciones de distribución topológica.

Consulta la Referencia de la API para ver todas las opciones compatibles de la plantilla de pod de Kubernetes.

Presupuestos de interrupción de pods

El operador crea un PodDisruptionBudget (PDB) para cada clúster, de modo que las interrupciones voluntarias — drenado de nodos, actualizaciones progresivas y desalojos del autoscaler — no puedan dejar fuera de servicio suficientes pods como para perder el quórum o comprometer la disponibilidad. En los clústeres de ClickHouse con más de un segmento, se crea un PDB por segmento para que una interrupción en un segmento no se impute a otro.

Valores predeterminados

El operador elige valores predeterminados seguros según el tamaño del clúster, de modo que un apply inicial ya proteja frente a una pérdida accidental de quorum. Para un ClickHouseCluster de 3 segmentos con replicas: 3, el operador crea tres PDB, uno por segmento, cada uno con minAvailable: 1.

Sobrescribir los valores predeterminados

Usa spec.podDisruptionBudget para sobrescribir minAvailable o maxUnavailable (exactamente uno):
O bien la forma maxUnavailable, con un porcentaje:
El webhook de validación rechaza configurar a la vez minAvailable y maxUnavailable. Elige uno: Kubernetes tampoco permite ambos.
También puedes pasar el campo unhealthyPodEvictionPolicy al PDB generado, lo que resulta útil cuando necesitas permitir la expulsión de pods que aún siguen en NotReady:

Políticas

spec.podDisruptionBudget.policy te permite elegir con qué nivel de agresividad el operador gestiona los PDB: Ejemplo — deshabilita por completo la gestión de PDB en un clúster de desarrollo:
Ejemplo — mantén tu PDB definido manualmente junto al clúster y evita que el operador lo toque:

Desactivación a nivel de clúster

La gestión de PDB también puede deshabilitarse a nivel de clúster mediante la variable de entorno ENABLE_PDB del operador. Con ENABLE_PDB=false, el operador omite el paso de reconciliación de PDB para todos los ClickHouseCluster y KeeperCluster, independientemente de su spec.podDisruptionBudget.policy, y no observa en absoluto los recursos PodDisruptionBudget. Por lo tanto, el ServiceAccount del operador no necesita permisos de RBAC sobre poddisruptionbudgets.policy/v1, lo cual resulta útil cuando el operador se ejecuta con un ServiceAccount restringido que omite intencionadamente esos permisos.
Esto está pensado para entornos que incorporan sus propias políticas de interrupción (p. ej., mediante Gatekeeper / Kyverno) y quieren que el operador quede completamente fuera del proceso.

Configuración del contenedor

Imagen personalizada

Usa una imagen concreta de ClickHouse:

Recursos de los contenedores

Configure la CPU y la memoria de los contenedores de ClickHouse:

Variables de entorno

Añada variables de entorno personalizadas:

Montajes de volúmenes

Agregue montajes de volúmenes adicionales:
Se permite especificar varios montajes de volúmenes en el mismo mountPath. El operador creará un volumen proyectado con todos los montajes especificados.

Consulta la referencia de la API para ver todas las opciones compatibles de la plantilla de contenedor.

Configuración de TLS/SSL

Configurar endpoints seguros

Pasa una referencia a un Secret de Kubernetes con certificados TLS para habilitar endpoints seguros

Formato del Secret del certificado SSL

Se espera que el Secret contenga el par de claves del server:
  • tls.crt - certificado del server codificado en PEM
  • tls.key - private key codificada en PEM
Este formato es compatible con los certificados generados por cert-manager.

Comunicación de ClickHouse-Keeper mediante TLS

Si KeeperCluster tiene TLS habilitado, ClickHouseCluster usará automáticamente una conexión segura a los nodos de Keeper. ClickHouseCluster verifica los certificados de los nodos de Keeper con el almacén de confianza del sistema, además de cualquier caBundle que configure. Para confiar en una CA privada (por ejemplo, una CA autofirmada o interna), proporcione una referencia a un bundle de CA personalizado:

Secret externo

De forma predeterminada, el operador crea y controla un Secret que contiene las credenciales internas del clúster (contraseña entre servidores, contraseña de administración, identidad de Keeper, secreto del clúster y clave de colecciones con nombre). El Secret toma el nombre del clúster y reside en el espacio de nombres del clúster. Si quiere gestionar estas credenciales usted mismo —por ejemplo, obteniéndolas de HashiCorp Vault, AWS Secrets Manager o External Secrets Operator—, haga que el operador apunte a un Secret ya existente mediante spec.externalSecret:
El Secret referenciado debe estar en el mismo espacio de nombres que el ClickHouseCluster. El operador nunca elimina un Secret que no haya creado.

Claves requeridas

El Secret debe contener las siguientes claves: Un Secret completo tiene este aspecto:

Política: Observe vs Manage

spec.externalSecret.policy controla cómo el operador maneja las claves requeridas que faltan:
Incluso con policy: Manage, el Secret ya debe existir en el espacio de nombres: el operador nunca crea el Secret por sí mismo; solo escribe las claves generadas en uno ya existente. Si el Secret referenciado no existe, la reconciliación se bloquea con el motivo ExternalSecretNotFound, independientemente de la política.
Elige Observe cuando un sistema externo (Vault, ESO, sealed-secrets, GitOps) sea la fuente de referencia y quieras que el operador falle claramente ante una configuración incorrecta. Elige Manage cuando quieras un aprovisionamiento inicial autosuficiente, pero también conservar la propiedad del propio objeto Secret (por ejemplo, para hacer una copia de seguridad).

Condición de estado y solución de problemas

El operador expone una condición ExternalSecretValid en ClickHouseCluster.status.conditions. Revísala cuando parezca que la reconciliación está atascada:
Posibles razones: El operador vuelve a encolar la reconciliación mientras el Secret no sea válido, así que, en cuanto agregues las claves faltantes, la siguiente reconciliación las detectará automáticamente; no hace falta reiniciar los pods.
El conjunto de claves requeridas depende de la versión de ClickHouse en ejecución. named-collections-key solo se valida una vez que la sonda de versión del operador ha detectado ClickHouse 25.12 o una versión posterior. En versiones anteriores, la clave puede no estar presente en el Secret.

Puertos adicionales

El operador expone un conjunto fijo de puertos en cada pod de Kubernetes de ClickHouse y en su Service headless: 8123 para HTTP, 9000 nativo, 9009 entre servidores, 9001 de administración, 9363 para métricas de Prometheus, y las variantes TLS 8443/9440 cuando TLS está habilitado. Para que ClickHouse escuche en protocolos adicionales —MySQL, PostgreSQL, gRPC o cualquier puerto personalizado—, declárelos en spec.additionalPorts:
El operador añade esos puertos a containerPorts del pod de Kubernetes y al Service headless. El ejemplo completo se encuentra en examples/custom_protocols.yaml.
additionalPorts solo abre los puertos del lado de Kubernetes. No configura el ClickHouse server para que escuche en ellos. También tienes que habilitar el protocolo correspondiente en spec.settings.extraConfig.protocols. De lo contrario, el puerto está abierto en el Service, pero nada dentro del pod de Kubernetes responde.

Ejemplo completo: MySQL wire protocol

Para exponer ClickHouse mediante el MySQL wire protocol en el puerto 9004:
Una vez aplicado, verifique desde dentro del clúster:

Restricciones de los campos

Puertos y nombres reservados

El webhook de validación rechaza las entradas de additionalPorts que entrarían en conflicto con los puertos en los que el propio operador escucha. Todos los puertos relacionados con TLS están reservados incondicionalmente para que habilitar spec.settings.tls.enabled más adelante no invalide un clúster que antes era válido. Los siguientes nombres también se rechazan: son los identificadores internos del operador para tipos de protocolo (no los alias legibles para humanos): Una solicitud rechazada produce un error como:

Sonda de versión y canal de actualización

El operador realiza dos tareas independientes con las versiones del clúster:
  1. Informe de versión — para ClickHouseCluster, un Job de Kubernetes ejecuta la imagen de contenedor una vez para detectar la versión de ClickHouse en ejecución; para KeeperCluster, el operador lee la versión informada por el servidor desde las réplicas en ejecución. La versión detectada se registra en .status.version y se utiliza en otros pasos de reconciliación (por ejemplo, la clave de named collections de External Secret solo es necesaria a partir de ClickHouse 25.12).
  2. Canal de actualización — una comprobación periódica del feed público de versiones de ClickHouse (https://clickhouse.com/data/version_date.tsv). El operador informa si hay una versión más reciente disponible mediante la condición de estado VersionUpgraded. Nunca actualiza el clúster por sí solo; el usuario controla la etiqueta de la imagen.

Elegir un canal de lanzamientos

spec.upgradeChannel selecciona con qué conjunto de lanzamientos upstream compara el operador. El mismo campo existe tanto en ClickHouseCluster como en KeeperCluster.
Valores permitidos (validados por la CRD con el patrón ^(lts|stable|\d+\.\d+)?$): Para production, en general se prefiere fijar el canal a un <major>.<minor> explícito (por ejemplo, 25.8). Esto fija el cluster en la línea de release mayor prevista y permite que el operador mustre una advertencia WrongReleaseChannel si alguna réplica se desvía de algún modo a una major distinta, algo especialmente importante cuando la image se referencia mediante un digest (@sha256:...) en lugar de un tag legible para humanos. El valor predeterminado vacío es adecuado para clusters de Development en los que los saltos entre versiones major no son una preocupación.

Condiciones de estado

Dos condiciones reflejan el resultado de la sonda y de la comprobación de actualización: Inspecciónalas con:

Sobrescritura del Job de la sonda de versión

Esto se aplica solo a ClickHouseCluster. KeeperCluster ya no ejecuta un Job de sonda de versión; su versión se lee directamente de las réplicas de Keeper en ejecución, por lo que spec.versionProbeTemplate está obsoleto y no tiene efecto allí. La sonda se implementa como un Job estándar de Kubernetes. Si su clúster tiene políticas de admisión que exigen Tolerations específicas, selectores de nodo o contextos de seguridad, o si desea limitar cuánto tiempo permanecen los Jobs de sonda completados, sobrescriba la plantilla mediante spec.versionProbeTemplate:
El nombre del contenedor version-probe es el predeterminado del operador: la entrada en containers: coincide con él por nombre, por lo que el operador aplica una fusión profunda de los campos proporcionados por el usuario sobre los valores predeterminados.

Controles globales del operador

Dos opciones del administrador del operador controlan globalmente el bucle de comprobación de actualizaciones: Establece --disable-version-update-checks=true en entornos aislados de la red o cuando no se permite la salida a clickhouse.com.

Configuración de ClickHouse

Contraseña del usuario default

spec.settings.defaultUserPassword establece la contraseña del usuario default integrado. Proporcione el valor de una clave de un Secret (recomendado) o de un ConfigMap que cree, en lugar de incluirlo directamente en el CR:
Proporcione exactamente uno de secret o configMap, y en ambos casos name (el objeto) y key (la entrada que contiene la contraseña).

Tipos de contraseña

passwordType le indica a ClickHouse cómo interpretar el valor. De forma predeterminada, es password (texto plano); las alternativas son formas con hash, como password_sha256_hex y password_double_sha1_hex. Se recomienda usar un tipo con hash para que la contraseña en texto plano nunca se almacene. Consulte la configuración de usuarios de ClickHouse para ver la lista completa.

Ejemplo completo con un Secret

Crea el Secret y, a continuación, haz referencia a su clave:
Con passwordType: password, el clickhouse-client del pod de Kubernetes se configura con esta contraseña, lo cual resulta práctico para la depuración.
Si usas una contraseña con hash, almacena el hash en lugar del texto plano:

Uso de un ConfigMap

Un ConfigMap funciona de la misma manera, pero su contenido no está protegido como un Secret. Úselo solo para valores no confidenciales o con hash previo, como un resumen password_sha256_hex:
No coloque una contraseña en texto plano en un ConfigMap. Use un Secret para cualquier valor (passwordType: password) en texto plano.

Usuarios personalizados en la configuración

Configure usuarios adicionales en los archivos de configuración. Cree un ConfigMap y un Secret para el usuario:
Añade una configuración personalizada a ClickHouseCluster:

Sincronización de la base de datos

Habilite la sincronización automática de la base de datos para las nuevas réplicas:
Cuando está activado, el operador sincroniza las tablas Replicated y de integración en las nuevas réplicas.

Registro del servidor

Configure el registro del ClickHouse server mediante spec.settings.logger. Todos los campos son opcionales y tienen valores predeterminados seguros, por lo que incluso un clúster que no modifique registrará en trace tanto en la consola del contenedor como en un archivo rotado en disco.
El operador siempre mantiene activado el registro en consola para que kubectl logs funcione, y añade el registro en archivo cuando logToFile es true. Un clúster con los valores predeterminados genera este bloque logger:
El mismo bloque spec.settings.logger se aplica a un KeeperCluster; en ese caso, el operador escribe sus archivos en /var/log/clickhouse-keeper/.
El registro en consola permanece activado independientemente de logToFile, por lo que kubectl logs sigue funcionando incluso cuando desactivas el registro en archivos. Establece jsonLogs: true cuando envíes logs a un almacén de logs estructurados que procesa JSON.

Configuración personalizada

Configuración adicional integrada

En lugar de montar archivos de configuración personalizados, puedes especificar directamente opciones adicionales de configuración de ClickHouse. Agrega una configuración personalizada de ClickHouse con extraConfig:

Configuración integrada de usuarios adicionales

También puedes especificar la configuración adicional de usuarios de ClickHouse mediante extraUsersConfig. Esto es útil para definir usuarios, perfiles, cuotas y privilegios directamente en la especificación del clúster.
La extraUsersConfig se almacena en el objeto ConfigMap de k8s. Evite incluir secretos en texto plano allí.

Consulta la documentación para ver todas las opciones de configuración de usuarios de ClickHouse admitidas.

Ejemplo de configuración

Ejemplo completo de configuración:
Última modificación el 25 de junio de 2026