Cluster de stockage garage

TeDomum déploie la solution Garage développée principalement par Deuxfleurs pour héberger ses objets au sens S3 : https://garagehq.deuxfleurs.fr.

Pourquoi garage

Le stockage sur un cluster distribué géographiquement est une problématique complexe, qui nécessite des mécanismes essentiellement asynchrones.

A cela la plupart des solutions de réplication sont convergentes à terme, qu’il s’agisse d’une réplication principal-secondaire ou d’un cluster de pairs. La complexité en convergence à terme peut être soit portée par l’application, soit par le stockage essentiellement par des mécanismes d’élection de leader, seul apte à écrire.

Les systèmes à leader sont principalement répandus sur les bases relationnelles et sont peu adaptés à un déploiement en cluster sur des liens coûteux : le risque est fort que le trafic traverse plusieurs fois le WAN (client-proxy-application-stockage-réplication). On leut préfère partout où c’est possible un déport de la complexité dans l’architecture applicative.

C’est la proposition de S3 : un protocole de stockage très simple avec une sémantique native de convergence à terme. Les applications doivent gérer cette complexité (quoique le niveau de prise en compte est variable). Garage implémente notamment S3, sur fond de CRDT et de tables de Merkle pour assurer la cohérence à terme de l’ensemble des données. C’est la seule implémentation libre à date qui respecte la sémantique S3 (Minio par exemple est fortement cohérent en synchrone et se réplique mal en géographique). Cela en fait un très bon candidat de stockage, en plus d’être mis en oeuvre par des proches et d’être très bien soutenu à ce titre !

Topologie du cluster

Le cluster s’appuie sur plusieurs noeuds de Kity. La réplication est configurée à 3 avec une tolérance en lecture lorsque le quorum de 2 noeuds disponibles n’est pas atteint (mode 3-degraded de garage).

Région Noeud Capacité
fr-orl-1 americancurl 4To
fr-kai-1 cyprus 4To
fr-kai-1 chartreux 4To
fr-kai-2 dwelf 4To
fr-kai-2 bambino 4To
fr-cyr-1 levkoy 4To

La capacité totale du cluster dépend de la répartition précise des partitions dans garage, mais elle avoisine donc les 7To.

Commandes utiles

Pour lancer une commande garage en employant kubectl sur Kity :

alias garage='kubectl -n storage-object exec svc/garage -- ./garage'

Actions sur les buckets

Obtenir de l’aide

garage bucket --help

Créer un bucket

garage bucket create <bucket_name>

Lister les buckets

garage bucket list

Infos d’un bucket

garage bucket info <bucket_name>

Supprimer un bucket

garage bucket delete <bucket_name> --yes

Actions sur les clés

Obtenir de l’aide

garage key --help

Créer une clé

garage key new --name <key_name>

Donner les droits de lecture et écriture à la clé

garage bucket allow <bucket_name> --read --write --key <key_name>

Lister les clés

garage key list

Supprimer une clé

garage key delete <key_name> --yes

Créer un PVC kubernetes sur garage avec la csi-s3

Utilisation

TL;DR: utiliser dans les valeurs de configuration de la chart helm la storageClass, kity-s3.

Détails

Pour les cas où une application déployée dans kubernetes (kity) n’est pas capable d’utiliser nativement le protocol de stockage S3, il y a la possibilité de créer un PVC utilisant la storageClass kity-s3.

Cette storageClass va monter un répertoire via un des logiciels fuse disponible dans la CSI-s3 disponible ici. L’operateur csi-s3 est configuré ici.

Voici un example de configuration de PVC créé par la csi-s3, ici pour le projet libretranslate.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    pv.kubernetes.io/bind-completed: "yes"
    pv.kubernetes.io/bound-by-controller: "yes"
    volume.beta.kubernetes.io/storage-provisioner: ch.ctrox.csi.s3-driver
    volume.kubernetes.io/storage-provisioner: ch.ctrox.csi.s3-driver
  labels:
    app.kubernetes.io/component: app
    app.kubernetes.io/instance: tedomum-apps_translate
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: libretranslate
    helm.sh/chart: libretranslate-1.0.8
  name: libretranslate-files-translate
  namespace: tedomum-translate
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 3Gi
  storageClassName: kity-s3
  volumeName: pvc-1a2a14e0-574d-4ff8-ae47-5c5ee8bb029f

La configuration actuelle de cette storageClass kity-s3 va stocker ces données dans le bucket storage-csi-s3 du garage objects.tedomum.net. Un sous-dossier avec l’identifiant unique du PVC est créé dans ce bucket, dans l’example précédent: pvc-1a2a14e0-574d-4ff8-ae47-5c5ee8bb029f.