Datalake — Object Store
Datalake — Object Store
Object store Ceph compatible S3, exposé via RGW (Rados Gateway). Sert de datalake pour les sources de données ingérées par le cluster.
⚠️ Comportement destructif :
preservePoolsOnDelete: false(cf.datalake-ec.yaml:21) signifie que supprimer leCephObjectStoredétruit aussi les poolsdatalake.rgw.buckets.dataetdatalake.rgw.buckets.index— donc toutes les données et buckets S3. Décision assumée pour ce datalake de recherche (ré-ingestible depuis les sources upstream). Pour conserver les pools, passer àpreservePoolsOnDelete: trueavant toute suppression.🔑 Ordre de suppression : supprimer les OBC/buckets AVANT le
CephObjectStore, sinon deadlock de finalizers (le store attend les buckets, l’OBC ne peut plus se deprovisionner). Procédure complète et déblocage :../../RUNBOOK.md§ Désinstallation › Object store.
Installation
kubectl apply -f datalake-ec.yamlkubectl apply -f storage-class.yamlLe service rook-ceph-rgw-datalake créé automatiquement reste accessible depuis
l’intérieur du cluster (rook-ceph-rgw-datalake.rook-ceph:80). Pour y accéder
depuis un poste autorisé à parler à l’API K8s :
kubectl -n rook-ceph port-forward svc/rook-ceph-rgw-datalake 8080:80.
Créer une bucket
Créer un fichier de claim (voir
object-bucket-claim-example.yaml
pour un exemple générique), puis l’appliquer.
Récupérer les credentials (le Secret porte le nom de la bucket) :
BUCKET=example-sourcekubectl get secret "${BUCKET}" -o jsonpath='{.data.AWS_ACCESS_KEY_ID}' | base64 --decodeechokubectl get secret "${BUCKET}" -o jsonpath='{.data.AWS_SECRET_ACCESS_KEY}' | base64 --decodeechoSmoke-test end-to-end
smoke-test.sh
déroule un test fonctionnel complet :
- Applique
user-smoke.yaml(unCephObjectStoreUser smoke+ unObjectBucketClaim smokedédié au test, séparés des utilisateurs métier). - Attend que le
Secretde credentials soit posé par le provisioner Rook. - Récupère
AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY. - PUT un fichier dans le bucket, LIST le bucket, GET le fichier, DIFF : vérifie que le contenu lu est identique.
- Cleanup automatique (à désactiver via
KEEP=1).
Outil S3 utilisé : mc (MinIO client, prioritaire) ou aws (CLI v2).
Depuis le poste de contrôle (port-forward automatique)
Pré-requis : un client S3 sur le PATH — mc (brew install minio-mc) ou
aws (CLI v2). Le DNS interne *.svc n’étant pas résolvable depuis le poste,
le script ouvre lui-même un kubectl port-forward vers le service RGW et le
referme en sortie. Aucun terminal séparé ni ENDPOINT à fournir :
bash storage/ceph/storageClass/datalake/smoke-test.shPour pointer un endpoint externe (NodePort…), surcharger
ENDPOINT=http://… bash …smoke-test.sh (court-circuite le port-forward).
Depuis un pod du cluster (sans port-forward)
kubectl -n rook-ceph run smoke --rm -it --image=minio/mc -- sh -c " apk add --no-cache bash curl # … copier smoke-test.sh + user-smoke.yaml dans le pod, puis : ENDPOINT=http://rook-ceph-rgw-datalake.rook-ceph:80 \ bash smoke-test.sh"(En pratique on lance ça sur le poste de contrôle — le port-forward automatique rend cette variante intra-pod rarement nécessaire.)
Lecture attendue
[14:02:00] Apply storage/ceph/storageClass/datalake/user-smoke.yaml …[14:02:01] Attendre le CephObjectStore datalake Ready (timeout 240s)…[14:02:02] Attendre qu'un pod RGW soit Ready (timeout 240s)…[14:02:06] Attendre que le Secret de l'OBC soit créé (timeout 120s)…[14:02:07] DNS interne non résolvable d'ici → port-forward svc/rook-ceph-rgw-datalake 38080→80[14:02:08] Endpoint : http://127.0.0.1:38080 | Bucket : smoke | KeyID : ABCD…[14:02:08] Outil : mc (MinIO client)[14:02:08] PUT → smoke/smoke/upload.txt[14:02:08] LIST → smoke/smoke[2026-05-28 14:02:08 UTC] 58B upload.txt[14:02:08] GET ← smoke/smoke/upload.txt[14:02:08] ✓ Contenu lu identique au contenu écrit.[14:02:08] Stat du bucket :…[14:02:08] ✓ Smoke-test datalake : OK[14:02:08] Cleanup : vide le bucket et supprime OBC + user…Si l’OBC ne converge pas (Secret smoke pas créé), inspecter :
kubectl -n rook-ceph describe obc smokekubectl -n rook-ceph logs -l app=rook-ceph-rgw,rook_object_store=datalakeUtilisateur global
Après création d’un utilisateur (voir
user.yaml
ou
user-datalake.yaml),
celui-ci accède à tout l’object store :
USER=rook-ceph-object-user-datalake-adminkubectl -n rook-ceph get secret "${USER}" -o jsonpath='{.data.AccessKey}' | base64 --decodeechokubectl -n rook-ceph get secret "${USER}" -o jsonpath='{.data.SecretKey}' | base64 --decodeecho