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)
replicas: 3 y shards: 2 creará 6 pods de ClickHouse en total.
Integración de Keeper
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
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.
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.
<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 enremote_servers(consultas entre réplicas y consultasDistributed). - 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.
/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.
<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 enremote_servers(consultas entre réplicas y consultasDistributed). - 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
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
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
Valores predeterminados
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
spec.podDisruptionBudget para sobrescribir minAvailable o maxUnavailable (exactamente uno):
maxUnavailable, con un porcentaje:
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:
Desactivación a nivel de clúster
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.
Configuración del contenedor
Imagen personalizada
Recursos de los contenedores
Variables de entorno
Montajes de volúmenes
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
Formato del Secret del certificado SSL
tls.crt- certificado del server codificado en PEMtls.key- private key codificada en PEM
Este formato es compatible con los certificados generados por cert-manager.
Comunicación de ClickHouse-Keeper mediante TLS
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
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
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.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
ExternalSecretValid en ClickHouseCluster.status.conditions. Revísala cuando parezca que la reconciliación está atascada:
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
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:
containerPorts del pod de Kubernetes y al Service headless. El ejemplo completo se encuentra en examples/custom_protocols.yaml.
Ejemplo completo: MySQL wire protocol
9004:
Restricciones de los campos
Puertos y nombres reservados
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
- Informe de versión — para
ClickHouseCluster, unJobde Kubernetes ejecuta la imagen de contenedor una vez para detectar la versión de ClickHouse en ejecución; paraKeeperCluster, 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.versiony se utiliza en otros pasos de reconciliación (por ejemplo, la clave de named collections deExternal Secretsolo es necesaria a partir de ClickHouse25.12). - 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 estadoVersionUpgraded. 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.
^(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
Inspecciónalas con:
Sobrescritura del Job de la sonda de versión
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:
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
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:
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
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.Uso de un ConfigMap
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
Sincronización de la base de datos
Registro del servidor
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:
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
extraConfig:
Enlaces útiles:
Configuración integrada de usuarios adicionales
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í.