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)
replicas: 3 e shards: 2 criará 6 pods do ClickHouse ao todo.
Integração com o Keeper
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
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.
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.
<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 emremote_servers(consultas entre réplicas e consultasDistributed). - 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.
/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.
<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 emremote_servers(consultas entre réplicas e consultasDistributed). - 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
Garanta que seu cluster do Kubernetes tenha nós suficientes em zonas diferentes para atender às restrições de distribuição.
Configuração manual
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
Valores padrão
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
spec.podDisruptionBudget para substituir minAvailable ou maxUnavailable (exatamente um):
maxUnavailable, com uma porcentagem:
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:
Desativação em nível de cluster
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.
Configuração do contêiner
Imagem personalizada
Recursos de contêiner
Variáveis de ambiente
Montagem 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
Formato do Secret de certificado SSL
tls.crt- certificado do servidor codificado em PEMtls.key- chave privada codificada em PEM
Esse formato é compatível com certificados gerados pelo cert-manager.
Comunicação entre ClickHouse e Keeper via TLS
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
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
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.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
ExternalSecretValid em ClickHouseCluster.status.conditions. Verifique-a quando a reconciliação parecer travada:
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
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:
containerPorts do pod do Kubernetes e ao Service headless. O exemplo completo está em examples/custom_protocols.yaml.
Exemplo completo: MySQL wire protocol
9004:
Restrições de campo
Portas e nomes reservados
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
- Relatório de versão — para
ClickHouseCluster, umJobdo Kubernetes executa a imagem de contêiner uma vez para detectar a versão do ClickHouse em execução; paraKeeperCluster, o operador lê a versão informada pelo servidor a partir das réplicas em execução. A versão detectada é registrada em.status.versione usada por outras etapas de reconciliação (por exemplo, a chave de named-collections doSecret externosó é exigida a partir do ClickHouse25.12). - 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 statusVersionUpgraded. 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.
^(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
Inspecione-as com:
Sobrescrevendo o Job da sonda de versão
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:
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
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:
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
Com
passwordType: password, o clickhouse-client no pod do Kubernetes é configurado com
essa senha, o que é útil para depuração.Usando um ConfigMap
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
Sincronização do banco de dados
Logging do servidor
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:
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
extraConfig:
Links úteis:
Configuração embutida de usuários adicionais
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.