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)
replicas: 3 et shards: 2 créera au total 6 pods ClickHouse.
Intégration de Keeper
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
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.
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.
<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 dansremote_servers(requêtes entre répliques et requêtesDistributed). - 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.
/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.
<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 dansremote_servers(requêtes entre répliques et requêtesDistributed). - 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
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
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
Valeurs par défaut
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
spec.podDisruptionBudget pour surcharger minAvailable ou maxUnavailable (un seul) :
maxUnavailable, avec un pourcentage :
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 :
Désactivation à l’échelle du cluster
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.
Configuration du conteneur
Image personnalisée
Ressources des conteneurs
Variables d’environnement
Points de montage de volumes
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
Format du Secret pour le certificat SSL
tls.crt- certificat serveur encodé en PEMtls.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
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
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
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.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
ExternalSecretValid dans ClickHouseCluster.status.conditions. Consultez-la lorsque la réconciliation semble bloquée :
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
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 :
containerPorts du pod ainsi qu’au Service headless. L’exemple complet se trouve dans examples/custom_protocols.yaml.
Exemple complet : protocole MySQL wire
9004 :
Contraintes sur les champs
Ports et noms réservés
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
- Signalement de version — pour
ClickHouseCluster, unJobKubernetes exécute une fois l’image de conteneur afin de détecter la version de ClickHouse en cours d’exécution ; pourKeeperCluster, 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.versionet utilisée par d’autres étapes de réconciliation (par exemple, la clé named-collectionsExternal Secretn’est requise qu’à partir de ClickHouse25.12). - 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’étatVersionUpgraded. 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.
^(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
Inspectez-les avec :
Redéfinition du Job de sonde de version
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:
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
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 :
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
Avec
passwordType: password, le clickhouse-client du pod est configuré avec
ce mot de passe, ce qui est pratique pour le débogage.Utiliser un ConfigMap
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
Synchronisation de la base de données
Journalisation du serveur
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 :
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
extraConfig :
Liens utiles :
Configuration intégrée d’utilisateurs supplémentaires
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.