Kubernetes sa stal de facto štandardom pre nasadzovanie kontajnerizovaných aplikácií a analytické platformy nie sú výnimkou. Prevádzka ClickHouse, Matomo, Plausible a súvisiacich nástrojov na Kubernetes poskytuje škálovateľnosť, odolnosť a prevádzkovú efektivitu, ktorú je ťažké dosiahnuť s tradičnými nasadeniami.

Tento sprievodca pokrýva všetko, čo potrebujete vedieť o nasadzovaní a prevádzkovaní analytických workloadov na Kubernetes, od Helm chartov po produkčné best practices.

Dôležité upozornenie: PostHog oficiálne ukončil podporu Kubernetes v máji 2023. Ak chcete nasadiť PostHog, použite ich cloudovú ponuku alebo Docker Compose "hobby" nasadenie. Tento sprievodca bol aktualizovaný so zameraním na ClickHouse a ďalšie analytické nástroje, ktoré aktívne podporujú Kubernetes nasadenia.

Prečo Kubernetes pre analytiku?

Pred tým, ako sa ponoríme do implementácie, pochopme, prečo je Kubernetes vhodný pre analytické workloady:

  • Elastické škálovanie: Zvládnite nárazový traffic počas launch produktov alebo marketingových kampaní
  • Self-healing: Automatické reštarty podov a rescheduling pri zlyhaniach
  • Efektivita zdrojov: Bin-packing optimalizuje využitie hardvéru
  • Deklaratívna konfigurácia: Verzované, reprodukovateľné nasadenia
  • Bohatý ekosystém: Operátory, service mesh a observability nástroje

Možnosti analytických platforiem pre Kubernetes

Niekoľko open-source analytických platforiem aktívne podporuje Kubernetes nasadenia:

  • ClickHouse: Vysoko výkonná stĺpcová databáza ideálna pre real-time analytiku (plne podporovaná cez Altinity Operator)
  • Matomo: Plnohodnotná alternatíva k Google Analytics s podporou self-hostingu
  • Plausible: Ľahká, na súkromie zameraná webová analytika
  • Metabase: Business intelligence a platforma pre vizualizáciu dát
  • Apache Superset: Moderná platforma pre prieskum a vizualizáciu dát

Prerekvizity

Pred nasadením analytických workloadov na Kubernetes sa uistite, že máte:

  • Kubernetes cluster (1.28+) s minimálne 4 nodmi — aktuálne podporované verzie sú 1.33, 1.34 a 1.35
  • Nainštalované kubectl a Helm 3
  • Storage class podporujúca dynamické provisioning
  • Ingress controller (nginx, traefik alebo cloud provider)
  • Minimálne 8GB RAM na node pre ClickHouse workloady

ClickHouse na Kubernetes

ClickHouse je chrbtovou kosťou mnohých analytických platforiem a vyžaduje špeciálnu pozornosť kvôli svojej stavovej povahe a požiadavkám na výkon.

Použitie Altinity ClickHouse Operátora

Altinity ClickHouse Operator (aktuálne v0.25.6) je najpopulárnejší a odporúčaný spôsob prevádzky ClickHouse v Kubernetes. Od verzie 0.24.0 zahŕňa natívnu podporu pre ClickHouse Keeper, eliminujúc potrebu externých ZooKeeper inštalácií.

# Inštalácia operátora cez Helm (odporúčané)
helm repo add clickhouse-operator https://docs.altinity.com/clickhouse-operator
helm repo update

# Inštalácia operátora
helm upgrade --install --create-namespace \
  --namespace clickhouse \
  clickhouse-operator \
  clickhouse-operator/altinity-clickhouse-operator

# Overenie inštalácie
kubectl get pods -n clickhouse

ClickHouse Cluster s ClickHouse Keeper

Moderné nasadenia by mali používať ClickHouse Keeper namiesto ZooKeeper pre koordináciu:

# clickhouse-keeper.yaml
apiVersion: clickhouse-keeper.altinity.com/v1
kind: ClickHouseKeeperInstallation
metadata:
  name: keeper-analytics
  namespace: analytics
spec:
  configuration:
    clusters:
      - name: keeper
        layout:
          replicasCount: 3
  templates:
    podTemplates:
      - name: keeper-pod
        spec:
          containers:
            - name: clickhouse-keeper
              resources:
                requests:
                  cpu: "500m"
                  memory: 1Gi
                limits:
                  cpu: "1"
                  memory: 2Gi
    volumeClaimTemplates:
      - name: keeper-storage
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 10Gi
          storageClassName: fast-ssd
# clickhouse-cluster.yaml
apiVersion: clickhouse.altinity.com/v1
kind: ClickHouseInstallation
metadata:
  name: analytics-clickhouse
  namespace: analytics
spec:
  configuration:
    clusters:
      - name: analytics
        layout:
          shardsCount: 2
          replicasCount: 2
        templates:
          podTemplate: clickhouse-pod
          volumeClaimTemplate: clickhouse-storage
    zookeeper:
      nodes:
        - host: keeper-keeper-analytics
          port: 2181
    users:
      admin/password_sha256_hex: "your-sha256-password-hash"
      admin/networks/ip:
        - 10.0.0.0/8
      readonly/password: "readonly-password"
      readonly/profile: readonly
    profiles:
      readonly:
        readonly: 1
  templates:
    podTemplates:
      - name: clickhouse-pod
        spec:
          containers:
            - name: clickhouse
              resources:
                requests:
                  cpu: "2"
                  memory: 8Gi
                limits:
                  cpu: "4"
                  memory: 16Gi
    volumeClaimTemplates:
      - name: clickhouse-storage
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 500Gi
          storageClassName: fast-ssd

Matomo na Kubernetes

Matomo je vyspelá, plnohodnotná analytická platforma s komplexnou podporou Kubernetes:

# Pridanie Bitnami Helm repozitára
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

# Vytvorenie namespace
kubectl create namespace matomo

# Inštalácia Matomo
helm install matomo bitnami/matomo \
  --namespace matomo \
  --values matomo-values.yaml
# matomo-values.yaml
replicaCount: 2

resources:
  requests:
    cpu: 250m
    memory: 512Mi
  limits:
    cpu: 1000m
    memory: 1Gi

mariadb:
  enabled: true
  architecture: replication
  auth:
    rootPassword: "secure-root-password"
    database: matomo
  primary:
    persistence:
      size: 50Gi
      storageClass: fast-ssd

ingress:
  enabled: true
  hostname: analytics.example.com
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod
  tls: true

persistence:
  enabled: true
  size: 10Gi
  storageClass: standard

Plausible na Kubernetes

Plausible je ľahká, na súkromie zameraná alternatíva, ktorá sa jednoducho nasadzuje:

# plausible-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: plausible
  namespace: analytics
spec:
  replicas: 2
  selector:
    matchLabels:
      app: plausible
  template:
    metadata:
      labels:
        app: plausible
    spec:
      containers:
        - name: plausible
          image: ghcr.io/plausible/community-edition:v2.1
          ports:
            - containerPort: 8000
          env:
            - name: DATABASE_URL
              valueFrom:
                secretKeyRef:
                  name: plausible-secrets
                  key: database-url
            - name: CLICKHOUSE_DATABASE_URL
              valueFrom:
                secretKeyRef:
                  name: plausible-secrets
                  key: clickhouse-url
            - name: SECRET_KEY_BASE
              valueFrom:
                secretKeyRef:
                  name: plausible-secrets
                  key: secret-key
            - name: BASE_URL
              value: "https://analytics.example.com"
          resources:
            requests:
              cpu: 250m
              memory: 512Mi
            limits:
              cpu: 1000m
              memory: 2Gi

Správa zdrojov

Správna alokácia zdrojov je kritická pre analytické workloady:

Odporúčania pre CPU a pamäť

Komponent CPU Request Memory Request Poznámky
ClickHouse 2000m 8Gi Viac RAM = lepší výkon dotazov
ClickHouse Keeper 500m 1Gi Minimum 3 repliky pre HA
Matomo Web 250m 512Mi Škálujte horizontálne pre traffic
Plausible 250m 512Mi Ľahké, jednoduché na škálovanie
PostgreSQL 1000m 2Gi Závisí od objemu metadát
Redis 250m 1Gi Veľkosť podľa potrieb cache
Kafka 1000m 4Gi Na broker, škálujte brokery pre priepustnosť

Resource Quotas

Chráňte váš cluster pomocou resource quotas:

# resource-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: analytics-quota
  namespace: analytics
spec:
  hard:
    requests.cpu: "32"
    requests.memory: 64Gi
    limits.cpu: "64"
    limits.memory: 128Gi
    persistentvolumeclaims: "20"
    requests.storage: 2Ti

Konfigurácia auto-scaling

Nakonfigurujte Horizontal Pod Autoscaler pre premenlivé workloady:

HPA pre webové služby

# hpa-analytics.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: analytics-web-hpa
  namespace: analytics
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: analytics-web
  minReplicas: 2
  maxReplicas: 20
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 80
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 60
      policies:
        - type: Pods
          value: 4
          periodSeconds: 60
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
        - type: Pods
          value: 2
          periodSeconds: 120

KEDA pre event-driven škálovanie

KEDA (Kubernetes Event-Driven Autoscaling) umožňuje škálovanie na základe externých metrík ako Kafka consumer lag. KEDA je graduated CNCF projekt so 70+ vstavanými scalermi:

# Inštalácia KEDA cez Helm
helm repo add kedacore https://kedacore.github.io/charts
helm repo update

helm install keda kedacore/keda \
  --namespace keda \
  --create-namespace
# keda-scaledobject.yaml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: analytics-worker-scaler
  namespace: analytics
spec:
  scaleTargetRef:
    name: analytics-worker
  minReplicaCount: 2
  maxReplicaCount: 20
  pollingInterval: 30
  cooldownPeriod: 300
  triggers:
    - type: kafka
      metadata:
        bootstrapServers: kafka:9092
        consumerGroup: analytics-workers
        topic: events_ingestion
        lagThreshold: "1000"
    - type: prometheus
      metadata:
        serverAddress: http://prometheus:9090
        metricName: http_requests_total
        query: sum(rate(http_requests_total{job="analytics"}[2m]))
        threshold: "100"

Persistent Storage

Analytické workloady vyžadujú spoľahlivé, výkonné úložisko:

Výber Storage Class

  • ClickHouse: Použite najrýchlejšie dostupné úložisko (gp3/io2 na AWS, pd-ssd na GCP)
  • Kafka: Úložisko s vysokou priepustnosťou a dobrými IOPS
  • PostgreSQL: Štandardné SSD úložisko je zvyčajne postačujúce
# storage-class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-ssd
provisioner: ebs.csi.aws.com
parameters:
  type: gp3
  iops: "10000"
  throughput: "500"
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer

Volume Snapshots pre zálohovanie

# volume-snapshot.yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: clickhouse-backup-daily
  namespace: analytics
spec:
  volumeSnapshotClassName: csi-aws-vsc
  source:
    persistentVolumeClaimName: clickhouse-data-0

Sieťové best practices

Network Policies

Obmedzte traffic medzi komponentmi:

# network-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: clickhouse-network-policy
  namespace: analytics
spec:
  podSelector:
    matchLabels:
      app: clickhouse
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: analytics-web
        - podSelector:
            matchLabels:
              app: clickhouse
      ports:
        - port: 8123
        - port: 9000
  egress:
    - to:
        - podSelector:
            matchLabels:
              app: clickhouse
        - podSelector:
            matchLabels:
              app: clickhouse-keeper
      ports:
        - port: 9000
        - port: 2181

Úvahy o Service Mesh

Ak používate Istio alebo Linkerd:

  • Vylúčte ClickHouse natívny protokol (port 9000) z mTLS na začiatku
  • Nakonfigurujte správne retry politiky pre prechodné zlyhania
  • Nastavte primerané timeouty pre dlhotrvajúce dotazy (ClickHouse dotazy môžu bežať minúty)

Monitoring Stack

Komplexný monitoring je esenciálny pre produkčnú prevádzku:

Prometheus ServiceMonitor

# servicemonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: clickhouse-monitor
  namespace: analytics
spec:
  selector:
    matchLabels:
      app: clickhouse
  endpoints:
    - port: metrics
      interval: 30s
      path: /metrics

Kľúčové metriky na monitorovanie

  • ClickHouse: ClickHouseProfileEvents_Query, ClickHouseMetrics_ReplicasMaxQueueSize, ClickHouseAsyncMetrics_ReplicasSumQueueSize
  • Kafka: kafka_consumer_lag, kafka_messages_in_per_sec
  • Kubernetes: Reštarty podov, využitie zdrojov, využitie PVC
  • Aplikácia: Latencia požiadaviek, miera chýb, priepustnosť ingescie

Grafana Dashboardy

Nasaďte predpripravené dashboardy pre viditeľnosť. Altinity Operator zahŕňa Prometheus alertovacie pravidlá a Grafana dashboardy:

# grafana-dashboard-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: clickhouse-dashboard
  namespace: monitoring
  labels:
    grafana_dashboard: "1"
data:
  clickhouse-overview.json: |
    {
      "title": "ClickHouse Overview",
      "panels": [...]
    }

Produkčné best practices

Pod Disruption Budgets

Zabezpečte dostupnosť počas údržby:

# pdb.yaml
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: clickhouse-pdb
  namespace: analytics
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: clickhouse

Pod Anti-Affinity

Rozložte repliky naprieč nodmi a zónami:

affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchLabels:
            app: clickhouse
        topologyKey: kubernetes.io/hostname
    preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchLabels:
              app: clickhouse
          topologyKey: topology.kubernetes.io/zone

Priority Classes

Zabezpečte, aby kritické komponenty dostali zdroje ako prvé:

# priority-class.yaml
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: analytics-critical
value: 1000000
globalDefault: false
description: "Priority class pre kritické analytické komponenty"

Bezpečnostné úvahy

Správa secrets

Použite externé secrets operátory pre citlivé údaje:

# external-secret.yaml
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: clickhouse-credentials
  namespace: analytics
spec:
  refreshInterval: 1h
  secretStoreRef:
    name: aws-secrets-manager
    kind: ClusterSecretStore
  target:
    name: clickhouse-credentials
  data:
    - secretKey: admin-password
      remoteRef:
        key: analytics/clickhouse
        property: admin-password

Pod Security Standards

securityContext:
  runAsNonRoot: true
  runAsUser: 101
  fsGroup: 101
  seccompProfile:
    type: RuntimeDefault
containerSecurityContext:
  allowPrivilegeEscalation: false
  readOnlyRootFilesystem: true
  capabilities:
    drop:
      - ALL

Stratégie upgrade

Rolling Updates

Nakonfigurujte bezpečné rolling updates:

strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 1
    maxUnavailable: 0

Blue-Green nasadenia

Pre major version upgrady zvážte blue-green nasadenia:

  1. Nasaďte novú verziu vedľa existujúcej
  2. Spustite obe verzie s rozdelením trafficu
  3. Validujte konzistenciu dát a výkon
  4. Prepnite traffic na novú verziu
  5. Ponechajte starú verziu pre rýchly rollback

Upgrady ClickHouse Operátora

Altinity Operator teraz používa SYSTEM SHUTDOWN namiesto rekreácie podov pri aplikovaní zmien konfigurácie, čo výrazne urýchľuje aktualizácie na nodoch s veľkými volumami.

Riešenie bežných problémov

Pod Evictions

Ak sú pody evicted:

  • Skontrolujte resource limits a requests
  • Preskúmajte resource pressure na nodoch pomocou kubectl describe node
  • Zvážte použitie priority classes
  • Skontrolujte memory leaky v dlho bežiacich dotazoch

Výkon úložiska

Ak sú dotazy pomalé:

  • Overte limity IOPS storage class
  • Skontrolujte throttling u cloud providera
  • Monitorujte metriky využitia disku
  • Zvážte použitie lokálneho NVMe úložiska pre ClickHouse

Sieťové timeouty

Pre problémy s pripojením:

  • Overte, že network policies povoľujú požadovaný traffic
  • Skontrolujte logy service mesh sidecar
  • Preskúmajte DNS resolution s CoreDNS
  • Uistite sa, že ClickHouse Keeper/ZooKeeper je zdravý

ClickHouse CrashLoopBackOff

Ak ClickHouse pody zlyhávajú pri štarte:

  • Skontrolujte konfiguračné šablóny na syntaktické chyby
  • Overte spätnú kompatibilitu pri upgrade verzií
  • Zmeňte entrypoint na debug: upravte pod na použitie sleep infinity pre prístup ku kontajneru
  • Preskúmajte Altinity troubleshooting guide pre špecifické chybové správy

Optimalizácia nákladov

Right-sizing zdrojov

  • Použite Vertical Pod Autoscaler (VPA) v režime odporúčaní na identifikáciu optimálnych resource requests
  • Implementujte KEDA scale-to-zero pre vývojové prostredia
  • Použite spot/preemptible inštancie pre nekritické workloady

Storage Tiering

ClickHouse podporuje vrstvené úložisko — použite cold storage pre historické dáta:

<storage_configuration>
  <disks>
    <hot>
      <path>/var/lib/clickhouse/hot/</path>
    </hot>
    <cold>
      <type>s3</type>
      <endpoint>https://s3.amazonaws.com/bucket/</endpoint>
    </cold>
  </disks>
  <policies>
    <tiered>
      <volumes>
        <hot><disk>hot</disk></hot>
        <cold><disk>cold</disk></cold>
      </volumes>
      <move_factor>0.1</move_factor>
    </tiered>
  </policies>
</storage_configuration>

Ďalšie kroky

Úspešná prevádzka analytiky na Kubernetes vyžaduje kontinuálnu pozornosť:

  1. Začnite s oficiálnymi Helm chartmi a postupne customizujte
  2. Implementujte komplexný monitoring pred produkciou
  3. Dokumentujte runbooky pre bežné prevádzkové úlohy
  4. Pravidelne praktizujte disaster recovery procedúry
  5. Sledujte upstream releasy a bezpečnostné patche
  6. Zvážte spravované služby (Altinity.Cloud, ClickHouse Cloud) ak je prevádzková záťaž príliš vysoká

Dodatočné zdroje

Kubernetes poskytuje silný základ pre škálovateľnú analytickú infraštruktúru, ale vyžaduje investíciu do prevádzkovej expertízy na realizáciu jeho plného potenciálu.