Introduction

Nous allons voir comment configurer une datasource de type ClickHouse dansGrafana.

Historiquement développé par la société russe Yandex et publié sous license libre depuis 2016, ClickHouse est une base de données conçue pour la haute performance qui permet l’analyse de données mises à jour en temps réel. ClickHouse est notamment utilisé par Cloudflare pour stocker et traiter les logs provenant de ses serveurs DNS.

Gestion de l’accès à Clickhouse

Pour accéder à la base Clickhouse qui est un service managé externe au cluster Kubernetes nous avons besoin de créer les ressources suivantes dans le cluster.

Un Service sans Selector pour accéder au serveur Clickhouse depuis l’intérieur du cluster Kubernetes en utilisant le nom DNS clickhouse :

clickhouse.service.yaml ouvrir

---
apiVersion: v1
kind: Service
metadata:
  name: clickhouse
spec:
  ports:
    - protocol: TCP
      port: 9000
      targetPort: 9440

Un EndpointSlice pour indiquer l’adresse IP et le port d’écoute réel du serveur Clickhouse à l’extérieur du cluster Kubernetes :

clickhouse.endpointslice.yaml ouvrir

---
apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
  name: clickhouse
  labels:
    kubernetes.io/service-name: clickhouse
addressType: IPv4
ports:
  - name: '' # empty because port 9440 is not assigned as a well-known
             # port (by IANA)
    appProtocol: http
    protocol: TCP
    port: 9440
endpoints:
  - addresses:
      - "1.2.3.4"

Un Secret pour stocker les crédentiels nécessaires pour la connexion à la base de données CLickhouse :

clickhouse.secret.yaml ouvrir

---
apiVersion: v1
kind: Secret
metadata:
  name: clickhouse
stringData:
  CLICKHOUSE_DB: database
  CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: "1"
  CLICKHOUSE_PASSWORD: "Mon super password ultra sécurisé !"
  CLICKHOUSE_USER: grafana

Configuration de Grafana

Clickhouse ne fait pas partie des Datasources proposées par défaut dans Grafana, nous devons donc passer par l’installation du plugin ClickHouse.

Pour charger automatiquement ce plugin dans notre instance Grafana, nous pouvons configurer le fichier de valeurs de notre chart Helm Grafana comme suit :

grafana.values.yaml ouvrir

---
datasources:
  datasources.yaml:
    apiVersion: 1
    datasources:
      - name: ClickHouse
        type: grafana-clickhouse-datasource
        jsonData:
          defaultDatabase: $__file{/etc/secrets/clickhouse/CLICKHOUSE_DB}
          port: 9000
          server: clickhouse
          username: $__file{/etc/secrets/clickhouse/CLICKHOUSE_USER}
          tlsSkipVerify: false
          secure: true
        secureJsonData:
          password: $__file{/etc/secrets/clickhouse/CLICKHOUSE_PASSWORD}

extraSecretMounts:
  - name: clickhouse-secret-mount
    secretName: clickhouse
    defaultMode: 0440
    mountPath: /etc/secrets/clickhouse
    readOnly: true

grafana.ini:
    analytics:
      check_for_updates: true
    grafana_net:
      url: https://grafana.net
    log:
      mode: console
      level: debug
    paths:
      data: /var/lib/grafana/
      logs: /var/log/grafana
      plugins: /var/lib/grafana/plugins
      provisioning: /etc/grafana/provisioning
    server:
      domain: ''
      root_url: https://mon-grafana.example.com/

persistence:
  enabled: true
  type: pvc
  size: 100Mi
  storageClassName: default
  accessModes: ["ReadWriteMany"]

plugins:
  - grafana-clickhouse-datasource

rbac:
  namespaced: true

service:
  type: ClusterIP

serviceAccount:
  create: false

testFramework:
  enabled: false

Puis nous déployons Grafana via le Chart Helm officiel :

helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install mon-grafana grafana/grafana \
  --namespace mon-namespace
  --values grafana.values.yaml \
  --set rbac.create=false

Après connexion sur l’IHM de Grafana, la datasource devrait être directement fonctionnelle.