Skip to main content
Ce guide explique comment configurer des clusters ClickHouse et Keeper à l’aide du ClickHouse Operator.

Configuration de ClickHouseCluster

Configuration de base

Répliques et shards

  • Répliques : nombre d’instances ClickHouse par shard (pour la haute disponibilité)
  • Shards : nombre de partitions horizontales (pour la mise à l’échelle)
Un cluster avec replicas: 3 et shards: 2 créera au total 6 pods ClickHouse.

Intégration de Keeper

Chaque cluster ClickHouse doit faire référence à un KeeperCluster pour la coordination :
Lorsque keeperClusterRef.namespace est défini, l’opérateur doit surveiller les deux espaces de noms. Si WATCH_NAMESPACE est configuré, incluez les espaces de noms de ClickHouse et de Keeper dans cette liste.

Configuration de KeeperCluster

Configuration du stockage

Configurez le stockage persistant avec dataVolumeClaimSpec, un PersistentVolumeClaimSpec Kubernetes standard. L’opérateur le convertit en un PersistentVolumeClaim par réplique, monté sur le chemin des données /var/lib/clickhouse :
L’opérateur ne peut modifier un PVC existant que si la StorageClass sous-jacente prend en charge l’extension des volumes.
L’ajout de disques supplémentaires dans une configuration multi-disques (JBOD), l’exécution sans volume persistant, l’augmentation de capacité, les politiques de stockage personnalisées ainsi que les règles relatives à ce qui ne peut pas être modifié après la création sont traités dans le guide dédié au stockage et aux volumes.

Domaine du cluster

spec.clusterDomain définit le suffixe DNS Kubernetes que l’opérateur utilise lorsqu’il génère les noms d’hôte complets des pods qu’il inscrit dans la configuration du serveur ClickHouse. La valeur par défaut est cluster.local, et ce champ existe à la fois dans ClickHouseCluster et KeeperCluster.
L’opérateur contacte chaque pod via le Service headless sous la forme <pod>.<headless-service>.<namespace>.svc.<clusterDomain>. Ce suffixe est utilisé dans deux parties de la configuration générée :
  • Dans un ClickHouseCluster, sa valeur est utilisée pour les noms d’hôte des répliques dans remote_servers (requêtes entre répliques et requêtes Distributed).
  • Dans un KeeperCluster, sa valeur sert à construire les noms d’hôte des nœuds Keeper que ClickHouse utilise pour la coordination.
Ne remplacez cette valeur que si le kubelet de votre cluster s’exécute avec un --cluster-domain différent de cluster.local. Si la valeur ne correspond pas au véritable domaine du cluster, ClickHouse ne peut pas résoudre les noms d’hôte de Keeper ni ceux des répliques — la coordination et les requêtes Distributed échouent avec des erreurs de résolution DNS. Définissez la même valeur sur le ClickHouseCluster et le KeeperCluster auquel il fait référence.

Stockage multi-disques (JBOD)

additionalVolumeClaimTemplates ajoute des disques supplémentaires à chaque réplique ClickHouse, en plus du dataVolumeClaimSpec principal, nécessaire pour pouvoir les utiliser. Chaque entrée correspond à un modèle de PVC — un metadata.name et une spec de PVC. Les disques sont réconciliés exactement comme le disque de données principal — sous forme de volumeClaimTemplates du StatefulSet —, de sorte que le contrôleur du StatefulSet crée et conserve un PVC par réplique, nommé <name>-<statefulset>-0.
L’opérateur monte chaque volume supplémentaire dans /var/lib/clickhouse/disks/<name> et l’ajoute à une configuration de stockage ClickHouse générée. Les tirets d’un nom deviennent des traits de soulignement dans l’identifiant du disque ClickHouse ; le chemin de montage conserve le nom d’origine. Le disque de données principal et chaque disque supplémentaire sont placés dans un volume unique de la politique de stockage default, de sorte que ClickHouse répartit les nouvelles parties de données entre eux selon un mécanisme de round-robin. La capacité utilisable correspond à la somme de tous les disques, et chaque table qui ne définit pas sa propre storage_policy (y compris les tables system.*) utilise cet ensemble combiné.
Les noms de PVC doivent correspondre à ^[a-z]([-a-z0-9]*[a-z0-9])?$ et ne doivent pas entrer en conflit avec le nom du volume de données principal. Comme pour le disque de données principal, l’ensemble des disques supplémentaires est figé lors de la création : l’ajout, la suppression ou le renommage d’entrées après la création est refusé. Les PVC supplémentaires sont conservés lorsque le cluster est supprimé, comme le disque de données principal. La taille de stockage d’une entrée existante peut être augmentée si la StorageClass prend en charge l’extension.

Domaine du cluster

spec.clusterDomain définit le suffixe DNS Kubernetes que l’opérateur utilise pour construire les noms d’hôte complets des pods qu’il écrit dans la configuration du serveur ClickHouse. Par défaut, sa valeur est cluster.local, et ce champ est présent à la fois dans ClickHouseCluster et KeeperCluster.
L’opérateur contacte chaque pod via le Service headless à l’adresse <pod>.<headless-service>.<namespace>.svc.<clusterDomain>. Ce suffixe se retrouve dans deux parties de la configuration générée :
  • Dans un ClickHouseCluster, sa valeur est utilisée pour les noms d’hôte des répliques dans remote_servers (requêtes entre répliques et requêtes Distributed).
  • Dans un KeeperCluster, sa valeur sert à construire les noms d’hôte des nœuds Keeper que ClickHouse utilise pour la coordination.
Ne remplacez cette valeur que si le kubelet de votre cluster s’exécute avec un --cluster-domain différent de cluster.local. Si la valeur ne correspond pas au domaine réel du cluster, ClickHouse ne pourra pas résoudre les noms d’hôte de Keeper ni ceux des répliques — la coordination et les requêtes Distributed échoueront avec des erreurs de résolution DNS. Définissez la même valeur sur le ClickHouseCluster et le KeeperCluster auquel il fait référence.

Configuration du pod

Répartition topologique et affinité automatiques

Répartissez les pods sur plusieurs zones de disponibilité :
Assurez-vous que votre cluster Kubernetes dispose d’un nombre suffisant de nœuds répartis sur différentes zones pour respecter les contraintes de répartition.

Configuration manuelle

Il est possible de définir des règles personnalisées d’affinité/anti-affinité de pods ainsi que des contraintes de répartition topologique.

Consultez la Référence de l’API pour voir toutes les options de modèle de pod prises en charge.

Budgets de perturbation des pods

L’opérateur crée un PodDisruptionBudget (PDB) pour chaque cluster afin que les perturbations volontaires — drainage de nœuds, mises à niveau progressives, évictions de l’autoscaler — ne puissent pas mettre hors service suffisamment de pods au point de perdre le quorum ou de compromettre la disponibilité. Pour les clusters ClickHouse comportant plusieurs shards, un PDB est créé par shard afin qu’une perturbation sur un shard ne soit pas comptabilisée sur un autre.

Valeurs par défaut

L’opérateur choisit des valeurs par défaut sûres en fonction de la taille du cluster, de sorte qu’un apply initial protège déjà contre une perte accidentelle de quorum. Pour un ClickHouseCluster de 3 shards avec replicas: 3, l’opérateur crée trois PDB, un par shard, chacun avec minAvailable: 1.

Surcharger les valeurs par défaut

Utilisez spec.podDisruptionBudget pour surcharger minAvailable ou maxUnavailable (un seul) :
Ou encore la forme maxUnavailable, avec un pourcentage :
Définir à la fois minAvailable et maxUnavailable est refusé par le webhook de validation. Choisissez-en un seul — Kubernetes lui-même n’autorise pas non plus les deux.
Vous pouvez également transmettre le champ unhealthyPodEvictionPolicy au PDB généré — ce qui est utile lorsque vous devez autoriser l’éviction de pods encore en état NotReady :

Politiques

spec.podDisruptionBudget.policy vous permet de choisir avec quel degré d’intervention l’opérateur gère les PDB : Exemple — désactiver complètement la gestion des PDB sur un cluster de développement :
Exemple — conservez votre PDB défini manuellement à côté du cluster et empêchez l’opérateur d’y toucher :

Désactivation à l’échelle du cluster

La gestion des PDB peut également être désactivée à l’échelle du cluster via la variable d’environnement ENABLE_PDB de l’opérateur. Avec ENABLE_PDB=false, l’opérateur ignore l’étape de réconciliation des PDB pour chaque ClickHouseCluster et KeeperCluster, quelle que soit la valeur de leur spec.podDisruptionBudget.policy, et ne surveille pas du tout les ressources PodDisruptionBudget. Le ServiceAccount de l’opérateur n’a donc pas besoin d’autorisations RBAC sur poddisruptionbudgets.policy/v1, ce qui est utile lorsque l’opérateur s’exécute avec un ServiceAccount restreint qui exclut volontairement ces autorisations.
Ceci est destiné aux environnements qui définissent leurs propres politiques de perturbation (par exemple via Gatekeeper / Kyverno) et qui ne veulent pas que l’opérateur intervienne du tout.

Configuration du conteneur

Image personnalisée

Utilisez une image ClickHouse spécifique :

Ressources des conteneurs

Configurez le CPU et la mémoire des conteneurs ClickHouse :

Variables d’environnement

Ajoutez des variables d’environnement personnalisées :

Points de montage de volumes

Ajoutez des points de montage de volumes supplémentaires :
Il est possible de spécifier plusieurs montages de volume sur le même mountPath. L’opérateur créera un volume projeté regroupant tous les montages spécifiés.

Voir la Référence de l’API pour toutes les options prises en charge des modèles de conteneur.

Configuration du TLS/SSL

Configurer des endpoints sécurisés

Fournissez une référence à un Secret Kubernetes contenant des certificats TLS pour activer des endpoints sécurisés

Format du Secret pour le certificat SSL

Le Secret doit contenir la paire de clés du serveur :
  • tls.crt - certificat serveur encodé en PEM
  • tls.key - clé privée encodée en PEM
Ce format est compatible avec les certificats générés par cert-manager.

Communication de ClickHouse Keeper via TLS

Si TLS est activé pour KeeperCluster, ClickHouseCluster utilisera automatiquement une connexion sécurisée vers les nœuds Keeper. ClickHouseCluster vérifie les certificats des nœuds Keeper à l’aide du trust store du système, ainsi que de tout caBundle que vous configurez. Pour faire confiance à une CA privée (par exemple, une CA auto-signée ou interne), fournissez une référence vers un CA bundle personnalisé :

External Secret

Par défaut, l’opérateur crée et gère un Secret contenant les identifiants internes du cluster (mot de passe interserver, mot de passe d’administration, identité Keeper, secret du cluster, clé named-collections). Le Secret porte le nom du cluster et se trouve dans l’espace de noms du cluster. Si vous souhaitez gérer ces identifiants vous-même — par exemple en les récupérant depuis HashiCorp Vault, AWS Secrets Manager ou External Secrets Operator — configurez l’opérateur pour qu’il utilise un Secret préexistant via spec.externalSecret :
Le Secret référencé doit se trouver dans le même espace de noms que le ClickHouseCluster. L’opérateur ne supprime jamais un Secret qu’il n’a pas créé.

Clés requises

Le Secret doit contenir les clés suivantes : Voici à quoi ressemble un Secret complet :

Politique : Observe ou Manage

spec.externalSecret.policy contrôle la façon dont l’opérateur gère les clés requises manquantes :
Même avec policy: Manage, le secret doit déjà exister dans l’espace de noms — l’opérateur ne crée jamais lui-même le secret, il écrit seulement les clés générées dans un secret existant. Si le secret référencé est absent, la réconciliation est bloquée avec la raison ExternalSecretNotFound, quelle que soit la politique.
Choisissez Observe lorsqu’un système externe (Vault, ESO, sealed-secrets, GitOps) fait office de source de vérité et que vous voulez que l’opérateur échoue clairement en cas de mauvaise configuration. Choisissez Manage si vous voulez une initialisation autonome tout en conservant la maîtrise de l’objet secret lui-même (par exemple, pour le sauvegarder).

Condition d’état et dépannage

L’opérateur expose la condition ExternalSecretValid dans ClickHouseCluster.status.conditions. Consultez-la lorsque la réconciliation semble bloquée :
Raisons possibles : L’opérateur remet la réconciliation en file d’attente tant que le Secret est invalide. Ainsi, dès que vous ajoutez les clés manquantes, la réconciliation suivante les prend automatiquement en compte : inutile de redémarrer les pods.
L’ensemble des clés requises dépend de la version de ClickHouse utilisée. named-collections-key n’est validée qu’une fois que la sonde de version de l’opérateur a détecté ClickHouse 25.12 ou une version plus récente. Sur les versions antérieures, la clé peut être absente du Secret.

Ports supplémentaires

L’opérateur expose un ensemble fixe de ports sur chaque pod ClickHouse et sur son Service headless : 8123 HTTP, 9000 natif, 9009 inter-serveur, 9001 gestion, 9363 métriques Prometheus, ainsi que les variantes TLS 8443/9440 lorsque TLS est activé. Pour que ClickHouse écoute sur des protocoles supplémentaires — MySQL, PostgreSQL, gRPC ou tout autre port personnalisé — déclarez-les dans spec.additionalPorts :
L’opérateur ajoute ces ports aux containerPorts du pod ainsi qu’au Service headless. L’exemple complet se trouve dans examples/custom_protocols.yaml.
additionalPorts ouvre uniquement les ports côté Kubernetes. Cela ne configure pas le serveur ClickHouse pour écouter sur ces ports. Vous devez également activer le protocole correspondant dans spec.settings.extraConfig.protocols. Sans cela, le port est ouvert sur le Service, mais rien ne répond à l’intérieur du pod.

Exemple complet : protocole MySQL wire

Pour exposer ClickHouse via le protocole MySQL wire sur le port 9004 :
Une fois appliqué, vérifiez depuis l’intérieur du cluster :

Contraintes sur les champs

Ports et noms réservés

Le webhook de validation rejette les entrées additionalPorts qui entreraient en conflit avec des ports que l’opérateur utilise lui-même. Tous les ports liés à TLS sont réservés systématiquement afin que l’activation ultérieure de spec.settings.tls.enabled ne puisse pas invalider un cluster auparavant valide. Les noms suivants sont également rejetés — il s’agit des identifiants internes de type de protocole de l’opérateur (et non des alias lisibles par l’humain) : Une requête rejetée produit une erreur du type :

Sonde de version et canal de mise à niveau

L’opérateur gère deux aspects indépendants des versions du cluster :
  1. Signalement de version — pour ClickHouseCluster, un Job Kubernetes exécute une fois l’image de conteneur afin de détecter la version de ClickHouse en cours d’exécution ; pour KeeperCluster, l’opérateur lit la version signalée par le serveur à partir des répliques en cours d’exécution. La version détectée est enregistrée dans .status.version et utilisée par d’autres étapes de réconciliation (par exemple, la clé named-collections External Secret n’est requise qu’à partir de ClickHouse 25.12).
  2. Canal de mise à niveau — une vérification périodique du flux public des versions de ClickHouse (https://clickhouse.com/data/version_date.tsv). L’opérateur indique si une version plus récente est disponible via la condition d’état VersionUpgraded. Il ne met jamais lui-même le cluster à niveau — l’utilisateur garde le contrôle du tag de l’image.

Choisir un canal de publication

spec.upgradeChannel sélectionne l’ensemble des versions amont avec lesquelles l’opérateur effectue la comparaison. Le même champ existe sur ClickHouseCluster et KeeperCluster.
Valeurs autorisées (validées par la CRD avec le pattern ^(lts|stable|\d+\.\d+)?$) : En production, il est généralement préférable de fixer le canal sur un <major>.<minor> explicite (par ex. 25.8). Cela verrouille le cluster sur la ligne de release majeure prévue et permet à l’opérateur de signaler un avertissement WrongReleaseChannel si une réplique dérive d’une manière ou d’une autre vers une autre version majeure — ce qui est particulièrement important lorsque l’image est référencée par un digest (@sha256:...) plutôt que par un tag lisible par l’humain. La valeur vide par défaut convient aux clusters de développement pour lesquels les sauts de version majeure ne posent pas de problème.

Conditions d’état

Deux conditions reflètent le résultat de la sonde et de la vérification de mise à niveau : Inspectez-les avec :

Redéfinition du Job de sonde de version

Cela s’applique uniquement à ClickHouseCluster. KeeperCluster n’exécute plus de Job de sonde de version — sa version est lue directement à partir des répliques Keeper actives —, donc spec.versionProbeTemplate est déprécié et n’y a aucun effet. La sonde est implémentée sous la forme d’un Job Kubernetes standard. Si votre cluster applique des politiques d’admission qui exigent des Tolerations spécifiques, des sélecteurs de nœuds, des contextes de sécurité, ou si vous souhaitez limiter la durée de présence des Jobs de sonde terminés, redéfinissez le template via spec.versionProbeTemplate:
Le nom du conteneur version-probe est le nom par défaut de l’opérateur — l’entrée sous containers: porte le même nom, donc l’opérateur applique une fusion profonde des champs fournis par l’utilisateur par-dessus les valeurs par défaut.

Contrôles globaux de l’opérateur

Deux options du manager de l’opérateur contrôlent globalement la boucle de vérification des mises à niveau : Définissez --disable-version-update-checks=true dans les environnements isolés du réseau ou lorsque le trafic sortant vers clickhouse.com n’est pas autorisé.

Paramètres de ClickHouse

Mot de passe de l’utilisateur default

spec.settings.defaultUserPassword définit le mot de passe du compte intégré default. Fournissez la valeur à partir d’une clé d’un Secret (recommandé) ou d’une ConfigMap que vous créez, plutôt que de l’indiquer directement dans la CR :
Indiquez exactement l’un de secret ou configMap, chacun avec name (l’objet) et key (l’entrée qui contient le mot de passe).

Types de mot de passe

passwordType indique à ClickHouse comment interpréter la valeur. Par défaut, il est défini sur password (texte en clair) ; les alternatives sont des formes hachées comme password_sha256_hex et password_double_sha1_hex. Préférez un type haché afin que le texte en clair ne soit jamais stocké. Consultez les paramètres utilisateur de ClickHouse pour la liste complète.

Exemple complet avec un Secret

Créez le Secret, puis référencez sa clé :
Avec passwordType: password, le clickhouse-client du pod est configuré avec ce mot de passe, ce qui est pratique pour le débogage.
Pour un mot de passe haché, stockez le hachage au lieu du texte en clair :

Utiliser un ConfigMap

Un ConfigMap fonctionne de la même manière, mais son contenu n’est pas protégé comme celui d’un Secret. Utilisez-le uniquement pour des valeurs non sensibles ou déjà hachées, telles qu’une empreinte password_sha256_hex :
Ne stockez pas de mot de passe en clair dans un ConfigMap. Utilisez un Secret pour toute valeur en clair (passwordType: password).

Utilisateurs personnalisés dans la configuration

Configurez des utilisateurs supplémentaires dans les fichiers de configuration. Créez une ConfigMap et un Secret pour l’utilisateur :
Ajoutez une configuration personnalisée à ClickHouseCluster :

Synchronisation de la base de données

Activez la synchronisation automatique de la base de données pour les nouvelles répliques :
Lorsqu’il est activé, l’opérateur synchronise les tables Replicated ainsi que les tables d’intégration sur les nouvelles répliques.

Journalisation du serveur

Configurez le journal du serveur ClickHouse via spec.settings.logger. Chaque champ est facultatif et possède une valeur par défaut sûre ; ainsi, même si vous n’y touchez jamais, un cluster journalise déjà au niveau trace, à la fois dans la console du conteneur et dans un fichier avec rotation sur disque.
L’opérateur conserve toujours la journalisation vers la console afin que kubectl logs fonctionne, et ajoute par-dessus une journalisation dans des fichiers lorsque logToFile vaut true. Un cluster avec les valeurs par défaut génère ce bloc logger :
Le même bloc spec.settings.logger s’applique à un KeeperCluster ; l’opérateur écrit alors ses fichiers dans /var/log/clickhouse-keeper/.
La journalisation dans la console reste activée независимоamment de logToFile, donc kubectl logs continue de fonctionner même si vous désactivez la journalisation dans un fichier. Définissez jsonLogs: true lorsque vous envoyez des logs vers un système de stockage de logs structurés qui analyse le JSON.

Configuration personnalisée

Configuration supplémentaire intégrée

Au lieu de monter des fichiers de configuration personnalisés, vous pouvez définir directement des options de configuration supplémentaires pour ClickHouse. Ajoutez une configuration ClickHouse personnalisée avec extraConfig :

Configuration intégrée d’utilisateurs supplémentaires

Vous pouvez également spécifier une configuration supplémentaire d’utilisateurs ClickHouse à l’aide de extraUsersConfig. Cela permet de définir directement des utilisateurs, des profils, des quotas et des privilèges dans la spécification du cluster.
extraUsersConfig est stocké dans l’objet ConfigMap k8s. Évitez d’y stocker des secrets en clair.

Consultez la documentation pour connaître toutes les options de configuration prises en charge pour les utilisateurs ClickHouse.

Exemple de configuration

Exemple complet de configuration :
Dernière modification le 3 juillet 2026