0005 - ClickHouse Stack: Installation Plan

Reference

  • Specification: 0005-clickhouse-stack.md
  • Repository: repos/k8s-lab
  • Target Directory: repos/k8s-lab/components/clickhouse/

Overview

This plan implements a single-node ClickHouse installation on k8s-lab using the Bitnami Helm chart. The implementation follows existing k8s-lab component patterns (Kustomize + Helm) and integrates with local-path storage and Traefik ingress.


Phase 1: Component Directory Structure

Objective: Create the clickhouse component directory with namespace and kustomization configuration.

Tasks

  1. Create directory repos/k8s-lab/components/clickhouse/
  2. Create namespace.yaml with clickhouse namespace
  3. Create kustomization.yaml with Bitnami Helm chart reference (pinned version)
  4. Create empty values.yaml placeholder

Files to Create

FilePurpose
components/clickhouse/namespace.yamlNamespace definition
components/clickhouse/kustomization.yamlKustomize with Helm chart
components/clickhouse/values.yamlHelm values (placeholder)

Success Criteria

  • Directory structure exists
  • kubectl kustomize repos/k8s-lab/components/clickhouse/ generates valid YAML (namespace only at this stage)
  • Helm chart version is explicitly pinned

Dependencies

None (first phase)


Phase 2: Helm Values Configuration

Objective: Configure ClickHouse Helm values for single-node deployment with local-path storage.

Tasks

  1. Configure persistence with local-path StorageClass (50Gi initial size)
  2. Set resource limits (2 CPU / 4Gi memory limits, 500m / 1Gi requests)
  3. Configure authentication with static password (for initial deployment)
  4. Disable ClickHouse Keeper (not needed for single node)
  5. Disable sharding/replication (single node deployment)
  6. Set memory and thread limits in ClickHouse configuration
  7. Expose HTTP (8123) and native (9000) ports

Files to Modify

FileChanges
components/clickhouse/values.yamlFull Helm values configuration

Success Criteria

  • kubectl kustomize repos/k8s-lab/components/clickhouse/ generates complete ClickHouse deployment
  • Generated YAML includes PVC with local-path StorageClass
  • Resource limits are present in generated YAML
  • Service exposes ports 8123 and 9000

Dependencies

  • Phase 1 (directory structure)

Phase 3: External Secrets Integration

Objective: Configure ClickHouse authentication via central-secret-store using External Secrets Operator.

Tasks

  1. Create ClusterExternalSecret for ClickHouse credentials in central-secret-store/external-secrets/
  2. Add namespace label for secret selector (secrets/clickhouse-credentials: "true")
  3. Update ClickHouse values.yaml to reference the synced secret
  4. Document manual secret creation in central-secret-store namespace

Files to Create/Modify

FileChanges
components/central-secret-store/external-secrets/clickhouse-credentials.yamlClusterExternalSecret definition
components/central-secret-store/kustomization.yamlAdd new external secret resource
components/clickhouse/namespace.yamlAdd secret selector label
components/clickhouse/values.yamlReference existingSecret

Success Criteria

  • ClusterExternalSecret syncs password to clickhouse namespace
  • ClickHouse deployment references the external secret
  • kubectl kustomize repos/k8s-lab/components/central-secret-store/ includes new secret

Dependencies

  • Phase 2 (Helm values)

Phase 4: Ingress Configuration

Objective: Expose ClickHouse HTTP interface via Traefik IngressRoute with TLS.

Tasks

  1. Add ClickHouse ingress entry to components/ingress/kustomization.yaml
  2. Configure hostname: clickhouse.lab.local.ctoaas.co
  3. Enable TLS with LetsEncrypt issuer
  4. Set access pattern to internal (consistent with other lab services)

Files to Modify

FileChanges
components/ingress/kustomization.yamlAdd ClickHouse ingress configuration

Success Criteria

  • kubectl kustomize repos/k8s-lab/components/ingress/ includes ClickHouse IngressRoute
  • TLS secret name configured
  • Ingress routes to ClickHouse HTTP port (8123)

Dependencies

  • Phase 2 (ClickHouse service must exist)

Phase 5: Component Registration

Objective: Register clickhouse component in the main components kustomization.

Tasks

  1. Add - clickhouse/ to components/kustomization.yaml resources list
  2. Position after existing database/storage components

Files to Modify

FileChanges
components/kustomization.yamlAdd clickhouse resource

Success Criteria

  • kubectl kustomize repos/k8s-lab/components/ includes all ClickHouse resources
  • No kustomize errors when building full components directory

Dependencies

  • Phase 1-4 (all component files must exist)

Phase 6: Documentation

Objective: Create component README with usage instructions.

Tasks

  1. Create README.md with:
    • Component overview
    • Prerequisites (secret creation in central-secret-store)
    • Access instructions (HTTP interface, native protocol)
    • Connection examples (curl, clickhouse-client)
    • Common queries for verification
  2. Create Taskfile.yaml with common operations:
    • task verify - Check pod status and connectivity
    • task shell - Open clickhouse-client shell
    • task logs - Tail pod logs

Files to Create

FilePurpose
components/clickhouse/README.mdUsage documentation
components/clickhouse/Taskfile.yamlCommon task definitions

Success Criteria

  • README includes all required sections
  • Taskfile commands execute successfully
  • Documentation covers secret creation steps

Dependencies

  • Phase 5 (component fully registered)

Phase 7: Deployment Verification

Objective: Deploy and verify ClickHouse is functional.

Tasks

  1. Create ClickHouse password secret in central-secret-store namespace
  2. Apply kustomization: kubectl apply -k repos/k8s-lab/components/
  3. Verify pod reaches Running state
  4. Verify PVC is bound to local-path PV
  5. Test HTTP interface via port-forward
  6. Test external access via ingress URL
  7. Run verification queries:
    • SELECT version()
    • SELECT * FROM system.databases
    • Create test table, insert data, query data, drop table

Files to Create/Modify

None (verification only)

Success Criteria

  • Pod in Running state: kubectl get pod -n clickhouse
  • PVC bound: kubectl get pvc -n clickhouse
  • HTTP responds: curl http://localhost:8123/ping (via port-forward)
  • External access works: curl https://clickhouse.lab.local.ctoaas.co/ping
  • SQL queries execute successfully
  • Logs show no errors: kubectl logs -n clickhouse -l app.kubernetes.io/name=clickhouse

Dependencies

  • Phase 6 (full component ready)

File Summary

New Files

FilePhase
components/clickhouse/namespace.yaml1
components/clickhouse/kustomization.yaml1
components/clickhouse/values.yaml1, 2, 3
components/clickhouse/README.md6
components/clickhouse/Taskfile.yaml6
components/central-secret-store/external-secrets/clickhouse-credentials.yaml3

Modified Files

FilePhase
components/central-secret-store/kustomization.yaml3
components/ingress/kustomization.yaml4
components/kustomization.yaml5

Configuration Reference

Helm Chart

helmCharts:
  - name: clickhouse
    repo: https://charts.bitnami.com/bitnami
    version: 6.2.13  # Pin to specific version
    releaseName: clickhouse
    namespace: clickhouse
    valuesFile: values.yaml

Key Values

# Single node configuration
shards: 1
replicaCount: 1
keeper:
  enabled: false
 
# Storage
persistence:
  enabled: true
  storageClass: local-path
  size: 50Gi
 
# Resources
resources:
  limits:
    cpu: 2000m
    memory: 4Gi
  requests:
    cpu: 500m
    memory: 1Gi
 
# Authentication
auth:
  username: default
  existingSecret: clickhouse-credentials
  existingSecretKey: password

Ingress Entry

- service:
    name: clickhouse
    namespace: clickhouse
    port:
      number: 8123
  ingress:
    name: clickhouse
    accessPattern: internal
  domains:
    name: clickhouse
  tls:
    secretName: clickhouse-ctoaas-tls

Risk Mitigations

RiskMitigation in Plan
Storage performanceUse local-path (not NFS) as specified in spec
Resource contentionExplicit resource limits in Phase 2
Helm chart compatibilityPin specific version in Phase 1
Secret managementExternal Secrets integration in Phase 3

Open Items for Implementation

  1. Helm chart version: Verify latest stable Bitnami ClickHouse version at implementation time
  2. Secret key structure: Confirm central-secret-store secret format during Phase 3
  3. Storage size: 50Gi as proposed; can be adjusted based on usage patterns