Skip to main content
Este guia explica como configurar clusters do ClickHouse e do Keeper usando o operador.

Configuração do ClickHouseCluster

Configuração básica

Réplicas e shards

  • Réplicas: Número de instâncias do ClickHouse em cada shard (para alta disponibilidade)
  • Shards: Número de partições horizontais (para escalabilidade)
Um cluster com replicas: 3 e shards: 2 criará 6 pods do ClickHouse ao todo.

Integração com o Keeper

Todo cluster do ClickHouse deve fazer referência a um KeeperCluster para coordenação:
Quando keeperClusterRef.namespace estiver definido, o operador deverá monitorar ambos os espaços de nomes. Se WATCH_NAMESPACE estiver configurado, inclua os espaços de nomes do ClickHouse e do Keeper nessa lista.

Configuração do KeeperCluster

Configuração de armazenamento

Configure o armazenamento persistente com dataVolumeClaimSpec, um PersistentVolumeClaimSpec padrão do Kubernetes. O operador o transforma em um PersistentVolumeClaim por réplica, montado no caminho de dados /var/lib/clickhouse:
O operador só pode modificar um PVC existente se a StorageClass subjacente oferecer suporte à expansão de volume.
A anexação de discos extras em um layout com vários discos (JBOD), a execução sem um volume persistente, a expansão de capacidade, políticas de armazenamento personalizadas, criptografia em repouso e as regras sobre o que não pode ser alterado após a criação são abordadas no guia dedicado de armazenamento e volumes.

Domínio do cluster

spec.clusterDomain define o sufixo DNS do Kubernetes que o operador usa ao construir os nomes de host totalmente qualificados dos pods do Kubernetes que ele grava na configuração do servidor ClickHouse. O padrão é cluster.local e esse campo existe tanto em ClickHouseCluster quanto em KeeperCluster.
O operador acessa cada pod por meio do headless Service como <pod>.<headless-service>.<namespace>.svc.<clusterDomain>. Esse sufixo é repassado para duas partes da configuração gerada:
  • Em um ClickHouseCluster, seu valor é usado para os nomes de host das réplicas em remote_servers (consultas entre réplicas e consultas Distributed).
  • Em um KeeperCluster, seu valor compõe os nomes de host dos nós do Keeper que o ClickHouse usa para coordenação.
Só substitua esse valor quando o agente de nó do Kubernetes do seu cluster for executado com um --cluster-domain diferente de cluster.local. Se o valor não corresponder ao domínio real do cluster, o ClickHouse não conseguirá resolver os nomes de host do Keeper e das réplicas — a coordenação e as consultas Distributed falharão com erros de resolução de DNS. Defina o mesmo valor no ClickHouseCluster e no KeeperCluster ao qual ele faz referência.

Armazenamento em vários discos (JBOD)

additionalVolumeClaimTemplates anexa discos adicionais a cada réplica do ClickHouse, além do dataVolumeClaimSpec principal, que é necessário para usá-los. Cada entrada é um template de PVC — um metadata.name mais uma spec de PVC. Os discos são reconciliados exatamente como o disco de dados principal — como volumeClaimTemplates de StatefulSet — portanto, o controlador do StatefulSet cria e mantém um PVC por réplica, chamado <name>-<statefulset>-0.
O operador monta cada volume adicional em /var/lib/clickhouse/disks/<name> e o adiciona a uma configuração de armazenamento do ClickHouse gerada automaticamente. Hífens em um nome tornam-se underscores no identificador do disk no ClickHouse; o caminho de montagem mantém o nome original. O disk de dados primário e cada disk adicional são colocados em um único volume da política de armazenamento default, para que o ClickHouse distribua novas partes de dados entre todos eles em esquema round-robin. A capacidade utilizável é a soma de todos os disks, e toda tabela que não define sua própria storage_policy (incluindo as tabelas system.*) usa o conjunto combinado.
Os nomes de PVC devem corresponder a ^[a-z]([-a-z0-9]*[a-z0-9])?$ e não devem entrar em conflito com o nome do volume de dados primário. Assim como o disk de dados primário, o conjunto de disks adicionais é fixo no momento da criação: adicionar, remover ou renomear entradas após a criação é rejeitado. PVCs adicionais são mantidos quando o cluster é excluído, assim como o disk de dados primário. O tamanho de armazenamento de uma entrada existente pode ser expandido se a StorageClass oferecer suporte à expansão.

Domínio do cluster

spec.clusterDomain define o sufixo DNS do Kubernetes que o operador usa ao construir os nomes de host totalmente qualificados dos pods do Kubernetes que ele grava na configuração do servidor ClickHouse. O padrão é cluster.local e esse campo existe tanto em ClickHouseCluster quanto em KeeperCluster.
O operador acessa cada pod por meio do headless Service como <pod>.<headless-service>.<namespace>.svc.<clusterDomain>. Esse sufixo é repassado para duas partes da configuração gerada:
  • Em um ClickHouseCluster, seu valor é usado para os nomes de host das réplicas em remote_servers (consultas entre réplicas e consultas Distributed).
  • Em um KeeperCluster, seu valor compõe os nomes de host dos nós do Keeper que o ClickHouse usa para coordenação.
Só substitua esse valor quando o agente de nó do Kubernetes do seu cluster for executado com um --cluster-domain diferente de cluster.local. Se o valor não corresponder ao domínio real do cluster, o ClickHouse não conseguirá resolver os nomes de host do Keeper e das réplicas — a coordenação e as consultas Distributed falharão com erros de resolução de DNS. Defina o mesmo valor no ClickHouseCluster e no KeeperCluster ao qual ele faz referência.

Configuração do pod do Kubernetes

Distribuição automática por topologia e afinidade

Distribua os pods entre zonas de disponibilidade:
Garanta que seu cluster do Kubernetes tenha nós suficientes em zonas diferentes para atender às restrições de distribuição.

Configuração manual

É possível especificar regras arbitrárias de afinidade/anti-afinidade entre pods do Kubernetes e restrições de distribuição de topologia.

Consulte a Referência da API para ver todas as opções de template de pod do Kubernetes compatíveis.

Orçamentos de interrupção de pods

O operador cria um PodDisruptionBudget (PDB) para cada cluster, para que interrupções voluntárias — drenagens de nós, atualizações graduais e evicções do autoscaler — não possam derrubar pods suficientes a ponto de causar perda de quórum ou comprometer a disponibilidade. Para clusters do ClickHouse com mais de um shard, é criado um PDB por shard para que uma interrupção em um shard não seja contabilizada contra outro.

Valores padrão

O operador escolhe valores padrão seguros com base no tamanho do cluster para que um novo apply já proteja contra perda acidental de quórum. Para um ClickHouseCluster com 3 shards e replicas: 3, o operador cria três PDBs, um por shard, cada um com minAvailable: 1.

Substituindo os padrões

Use spec.podDisruptionBudget para substituir minAvailable ou maxUnavailable (exatamente um):
Ou no formato maxUnavailable, com uma porcentagem:
Definir minAvailable e maxUnavailable ao mesmo tempo é rejeitado pelo webhook de validação. Escolha um deles — o próprio Kubernetes também não permite os dois.
Você também pode passar o campo unhealthyPodEvictionPolicy para o PDB gerado — útil quando precisar permitir a evicção de pods que ainda estão em NotReady:

Políticas

spec.podDisruptionBudget.policy permite escolher com que nível de rigor o operador gerencia os PDBs: Exemplo — desative completamente o gerenciamento de PDBs em um cluster de desenvolvimento:
Exemplo — mantenha seu PDB criado manualmente junto ao cluster e impeça que o operador interfira nele:

Desativação em nível de cluster

O gerenciamento de PDB também pode ser desativado em nível de cluster por meio da variável de ambiente ENABLE_PDB do operator. Com ENABLE_PDB=false, o operator ignora a etapa de reconciliação de PDB para todos os ClickHouseCluster e KeeperCluster, independentemente de spec.podDisruptionBudget.policy, e não monitora recursos PodDisruptionBudget de forma alguma. Portanto, o ServiceAccount do operator não precisa de permissões de RBAC em poddisruptionbudgets.policy/v1, o que é útil ao executar o operator com um ServiceAccount restrito que omite essas permissões intencionalmente.
Isto se destina a ambientes que implementam suas próprias políticas de interrupção (por exemplo, por meio do Gatekeeper / Kyverno) e querem deixar o operator totalmente fora desse processo.

Configuração do contêiner

Imagem personalizada

Use uma imagem específica do ClickHouse:

Recursos de contêiner

Configure CPU e memória para os contêineres do ClickHouse:

Variáveis de ambiente

Adicione variáveis de ambiente personalizadas:

Montagem de volumes

Adicione montagens adicionais de volumes:
É permitido especificar várias montagens de volume no mesmo mountPath. O Operator criará um volume projetado com todas as montagens especificadas.

Consulte a Referência da API para ver todas as opções de template de contêiner suportadas.

Configuração de TLS/SSL

Configure endpoints seguros

Passe uma referência a um Secret do Kubernetes que contenha certificados TLS para ativar endpoints seguros

Formato do Secret de certificado SSL

Espera-se que o Secret contenha o par de chaves do servidor:
  • tls.crt - certificado do servidor codificado em PEM
  • tls.key - chave privada codificada em PEM
Esse formato é compatível com certificados gerados pelo cert-manager.

Comunicação entre ClickHouse e Keeper via TLS

Se o KeeperCluster tiver TLS habilitado, o ClickHouseCluster usará automaticamente uma conexão segura com os nós do Keeper. O ClickHouseCluster verifica os certificados dos nós do Keeper usando o repositório de confiança do sistema, além de qualquer caBundle que você configurar. Para confiar em uma CA privada (por exemplo, uma CA autoassinada ou interna), forneça uma referência para um bundle de CA personalizado:

Secret externo

Por padrão, o operador cria e controla um Secret que contém as credenciais internas do cluster (senha entre servidores, senha de gerenciamento, identidade do Keeper, Secret do cluster, chave de named-collections). O Secret recebe o nome do cluster e fica no espaço de nomes do cluster. Se você quiser gerenciar essas credenciais por conta própria — por exemplo, obtendo-as do HashiCorp Vault, AWS Secrets Manager ou External Secrets Operator — aponte o operador para um Secret pré-existente usando spec.externalSecret:
O Secret referenciado deve estar no mesmo espaço de nomes que o ClickHouseCluster. O operador nunca exclui um Secret que não criou.

Chaves obrigatórias

O Secret deve conter as seguintes chaves: Um Secret completo fica assim:

Política: Observe vs Manage

spec.externalSecret.policy controla como o operador lida com chaves obrigatórias ausentes:
Mesmo com policy: Manage, o Secret já deve existir no espaço de nomes — o operador nunca cria o próprio Secret; ele apenas grava chaves geradas em um Secret existente. Se o Secret referenciado estiver ausente, a reconciliação será bloqueada com o motivo ExternalSecretNotFound, independentemente da política.
Escolha Observe quando um sistema externo (Vault, ESO, sealed-secrets, GitOps) for a fonte de verdade e você quiser que o operador falhe claramente em caso de configuração incorreta. Escolha Manage quando quiser um bootstrap autossuficiente, mas ainda quiser manter a propriedade do próprio objeto Secret (por exemplo, para fazer backup dele).

Condição de status e solução de problemas

O operador expõe a condição ExternalSecretValid em ClickHouseCluster.status.conditions. Verifique-a quando a reconciliação parecer travada:
Possíveis motivos: O operador coloca a reconciliação de volta na fila enquanto o Secret é inválido, então, assim que você adicionar as chaves ausentes, a próxima reconciliação as detectará automaticamente — não é necessário reiniciar os pods.
O conjunto de chaves obrigatórias depende da versão do ClickHouse em execução. named-collections-key só é validada quando a sonda de versão do operador detecta o ClickHouse 25.12 ou mais recente. Em versões anteriores, a chave pode não estar presente no Secret. disk-encryption-key é obrigatória somente quando spec.settings.encryption está definido.

Portas adicionais

O operador expõe um conjunto fixo de portas em cada pod do Kubernetes do ClickHouse e em seu Service headless: 8123 HTTP, 9000 native, 9009 interserver, 9001 management, 9363 métricas do Prometheus e as variantes TLS 8443/9440 quando o TLS estiver habilitado. Para fazer o ClickHouse aceitar conexões em protocolos adicionais — MySQL, PostgreSQL, gRPC ou qualquer porta personalizada — declare-as em spec.additionalPorts:
O operador adiciona essas portas às containerPorts do pod do Kubernetes e ao Service headless. O exemplo completo está em examples/custom_protocols.yaml.
additionalPorts apenas abre as portas no lado do Kubernetes. Isso não configura o servidor ClickHouse para escutar nessas portas. Você também precisa habilitar o protocolo correspondente em spec.settings.extraConfig.protocols. Sem isso, a porta fica aberta no Service, mas nada dentro do pod do Kubernetes está respondendo.

Exemplo completo: MySQL wire protocol

Para expor o ClickHouse pelo MySQL wire protocol na porta 9004:
Depois de aplicar, verifique de dentro do cluster:

Restrições de campo

Portas e nomes reservados

O webhook de validação rejeita entradas de additionalPorts que entrariam em conflito com portas usadas pelo próprio operator. Todas as portas relacionadas a TLS são reservadas incondicionalmente para que habilitar spec.settings.tls.enabled mais tarde não possa invalidar um cluster que antes era válido. Os nomes a seguir também são rejeitados — eles são os identificadores internos do operator para tipos de protocolo (não os aliases legíveis por pessoas): Uma solicitação rejeitada gera um erro como:

Sonda de versão e canal de upgrade

O operador faz duas coisas independentes com as versões do cluster:
  1. Relatório de versão — para ClickHouseCluster, um Job do Kubernetes executa a imagem de contêiner uma vez para detectar a versão do ClickHouse em execução; para KeeperCluster, o operador lê a versão informada pelo servidor a partir das réplicas em execução. A versão detectada é registrada em .status.version e usada por outras etapas de reconciliação (por exemplo, a chave de named-collections do Secret externo só é exigida a partir do ClickHouse 25.12).
  2. Canal de upgrade — uma verificação periódica no feed público de lançamentos do ClickHouse (https://clickhouse.com/data/version_date.tsv). O operador informa se há uma versão mais recente disponível por meio da condição de status VersionUpgraded. Ele nunca faz upgrade do cluster por conta própria — o usuário controla a tag da imagem.

Escolhendo um canal de lançamento

spec.upgradeChannel seleciona com qual conjunto de lançamentos upstream o operador faz a comparação. O mesmo campo existe tanto em ClickHouseCluster quanto em KeeperCluster.
Valores permitidos (validados pelo CRD com o padrão ^(lts|stable|\d+\.\d+)?$): Para produção, em geral é preferível fixar o canal em um <major>.<minor> explícito (por exemplo, 25.8). Isso mantém o cluster na linha de lançamento principal pretendida e permite que o operador exiba um aviso WrongReleaseChannel se alguma réplica, por algum motivo, acabar em uma major diferente — o que é especialmente importante quando a imagem é referenciada por um digest (@sha256:...) em vez de por uma tag legível por humanos. O padrão vazio é adequado para clusters de desenvolvimento em que saltos de versão principal não são uma preocupação.

Condições de status

Duas condições mostram o resultado da sonda e da verificação de atualização: Inspecione-as com:

Sobrescrevendo o Job da sonda de versão

Isso se aplica somente a ClickHouseCluster. KeeperCluster não executa mais um Job de sonda de versão — sua versão é lida diretamente das réplicas em execução do Keeper — portanto, spec.versionProbeTemplate está obsoleto e não tem efeito nesse caso. A sonda é implementada como um Job padrão do Kubernetes. Se o seu cluster tiver políticas de admissão que exijam Tolerations específicas, seletores de nó, contextos de segurança ou se você quiser limitar por quanto tempo os Jobs de sonda concluídos permanecem, sobrescreva o template por meio de spec.versionProbeTemplate:
O nome do contêiner version-probe é o nome padrão usado pelo operador — a entrada em containers: corresponde a ele pelo nome, então o operador faz um merge profundo dos campos fornecidos pelo usuário sobre os valores padrão.

Controles gerais do operador

Duas flags no gerenciador do operador controlam globalmente o loop de verificação de upgrade: Defina --disable-version-update-checks=true em ambientes isolados da internet ou quando a saída para clickhouse.com não for permitida.

Configurações do ClickHouse

Senha do usuário default

spec.settings.defaultUserPassword define a senha do usuário default integrado. Forneça o valor de uma chave em um Secret (recomendado) ou em um ConfigMap que você criar, em vez de inseri-lo diretamente no CR:
Forneça exatamente um entre secret e configMap, cada opção com name (o objeto) e key (a entrada que contém a senha).

Tipos de senha

passwordType informa ao ClickHouse como interpretar o valor. O padrão é password (texto simples); as alternativas são formas com hash, como password_sha256_hex e password_double_sha1_hex. Prefira um tipo com hash para que a senha em texto simples nunca seja armazenada. Consulte as configurações do usuário do ClickHouse para ver a lista completa.

Exemplo completo com um Secret

Crie o Secret e, em seguida, faça referência à sua chave:
Com passwordType: password, o clickhouse-client no pod do Kubernetes é configurado com essa senha, o que é útil para depuração.
Para uma senha com hash, armazene o hash em vez da senha em texto simples:

Usando um ConfigMap

Um ConfigMap funciona da mesma forma, mas seu conteúdo não é protegido como o de um Secret. Use-o apenas para valores não sensíveis ou já hasheados, como um digest password_sha256_hex:
Não coloque uma senha em texto simples em um ConfigMap. Use um Secret para qualquer valor em texto simples (passwordType: password).

Usuários personalizados na configuração

Configure usuários adicionais em arquivos de configuração. Crie um ConfigMap e um Secret para o usuário:
Adicione uma configuração personalizada ao ClickHouseCluster:

Sincronização do banco de dados

Ative a sincronização automática do banco de dados para novas réplicas:
Quando ativado, o operator sincroniza as tabelas Replicated e de integração para novas réplicas.

Logging do servidor

Configure o log do servidor ClickHouse por meio de spec.settings.logger. Todos os campos são opcionais e têm um padrão seguro, então mesmo um cluster sem nenhuma alteração já registra em trace tanto no console do contêiner quanto em um arquivo em disco com rotação.
O operador sempre mantém o log no console ativado para que kubectl logs funcione, e também adiciona o log em arquivo quando logToFile é true. Um cluster com os valores padrão gera este bloco logger:
O mesmo bloco spec.settings.logger também se aplica a um KeeperCluster; nesse caso, o operador grava seus arquivos em /var/log/clickhouse-keeper/.
O logging no console permanece ativado independentemente de logToFile, então kubectl logs continua funcionando mesmo quando você desativa o logging em arquivo. Defina jsonLogs: true quando enviar logs para um sistema de armazenamento de logs estruturados que processa JSON.

Configuração personalizada

Configuração adicional embutida

Em vez de montar arquivos de configuração personalizados, você pode especificar diretamente opções adicionais de configuração do ClickHouse. Adicione uma configuração personalizada do ClickHouse usando extraConfig:

Configuração embutida de usuários adicionais

Você também pode especificar uma configuração adicional de usuários do ClickHouse usando extraUsersConfig. Isso é útil para definir usuários, perfis, quotas e permissões diretamente na especificação do cluster.
O extraUsersConfig é armazenado em um objeto ConfigMap do k8s. Evite armazenar segredos em texto puro nele.

Consulte a documentação para ver todas as opções de configuração de usuários do ClickHouse suportadas.

Exemplo de configuração

Exemplo completo de configuração:
Última modificação em 23 de julho de 2026