Utiliser un PVC comme stockage persistant (S3)
Rôle
Cette fonctionnalité vous permet d'utiliser un bucket S3 comme volume persistant dans votre cluster Kubernetes, accessible depuis un ou plusieurs pods simultanément — y compris sur des nœuds différents.
Concrètement, cela signifie que vous pouvez monter un bucket S3 comme un PersistentVolumeClaim (PVC) de type ReadWriteMany (RWX), exactement comme vous le feriez avec n'importe quel autre volume Kubernetes. Techniquement, c'est GeeseFs (un client FUSE haute performance) qui monte le bucket S3 comme un système de fichiers POSIX sur chaque nœud concerné.
Cas d'usage typiques :
- Partage de fichiers statiques entre plusieurs réplicas d'une application
- Stockage de médias (images, vidéos) accessibles depuis plusieurs pods
- Données partagées entre différents services d'une même application
Activation
Depuis la console Ziosting, rendez-vous sur l'onglet Paramètres de votre service Kubernetes. Vous y trouverez un panneau "Stockage persistant RWX" qui vous permet d'activer ou de désactiver cette option.
L'activation de cette option déclenche le déploiement du driver CSI GeeseFs sur votre cluster. Attendez quelques minutes que les pods se déploient avant de commencer à créer des ressources.
Désactivation
Pour désactiver cette option, vous devez au préalable supprimer du cluster toutes les ressources Kubernetes associées. Sans cela, la désactivation peut être demandée depuis la console mais ne sera pas effective.
Ordre de suppression recommandé :
- Les pods / workloads utilisant les PVC concernés (pour libérer les montages actifs)
- Les
PersistentVolumeClaimcréés avec lesStorageClassGeeseFs - Toutes les
StorageClasscréées pour ce stockage RWX — obligatoire - Les
Secretcontenant les credentials S3 danskube-system(recommandé)
La présence d'au moins une StorageClass utilisant le provisioner ru.yandex.s3.csi bloque la désactivation effective du driver. La suppression des StorageClass est donc obligatoire avant de désactiver l'option sur la console.
Vérification : Pour confirmer que la désactivation est bien effective, attendez quelques minutes après avoir demandé la désactivation côté console, puis vérifiez l'absence du DaemonSet csi-s3 dans le namespace geesefs :
kubectl get daemonset csi-s3 -n geesefs
Si la commande retourne Error from server (NotFound), l'option est bien désactivée.
Utilisation
Une fois l'option activée, suivez les étapes ci-dessous pour utiliser un bucket S3 comme PVC dans vos pods.
Pré-requis
Avant de commencer, assurez-vous de disposer des informations suivantes concernant votre bucket S3 :
- Nom du bucket : le nom du bucket S3 à monter
- Endpoint : l'URL du service S3 (ex:
https://s3.fr-par.scw.cloudpour Scaleway,https://s3.eu-central-1.amazonaws.compour AWS) - Clef d'accès (
accessKeyID) - Secret d'accès (
secretAccessKey)
Étape 1 — Créer le Secret
Déployez un objet Secret dans le namespace kube-system contenant vos credentials S3. Adaptez les valeurs entre < > avec vos propres informations.
apiVersion: v1
kind: Secret
metadata:
namespace: kube-system
name: <nom-donné-au-Secret>
stringData:
accessKeyID: <votre-clef-s3>
secretAccessKey: <votre-secret-s3>
# Pour AWS : "https://s3.<region>.amazonaws.com", ex: https://s3.eu-central-1.amazonaws.com
endpoint: <ex. https://s3.fr-par.scw.cloud pour Scaleway>
# Pour AWS, renseignez également la région :
#region: ""
kubectl apply -f secret-s3.yaml
Étape 2 — Créer la StorageClass
Déployez un objet StorageClass qui référence votre secret et votre bucket S3. Adaptez les valeurs entre < >.
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: <nom-donné-à-la-SC>
provisioner: ru.yandex.s3.csi
parameters:
mounter: geesefs
# Limite recommandée du cache mémoire (en Mo)
options: "--memory-limit 1000"
bucket: <nom-de-votre-bucket>
csi.storage.k8s.io/provisioner-secret-name: <nom-donné-au-Secret>
csi.storage.k8s.io/provisioner-secret-namespace: kube-system
csi.storage.k8s.io/controller-publish-secret-name: <nom-donné-au-Secret>
csi.storage.k8s.io/controller-publish-secret-namespace: kube-system
csi.storage.k8s.io/node-stage-secret-name: <nom-donné-au-Secret>
csi.storage.k8s.io/node-stage-secret-namespace: kube-system
csi.storage.k8s.io/node-publish-secret-name: <nom-donné-au-Secret>
csi.storage.k8s.io/node-publish-secret-namespace: kube-system
kubectl apply -f storageclass-s3.yaml
Étape 3 — Créer le PersistentVolumeClaim
Déployez un PersistentVolumeClaim utilisant la StorageClass créée à l'étape précédente. Adaptez les valeurs entre < >.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: <nom-donné-au-PVC>
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: <nom-donné-à-la-SC>
kubectl apply -f pvc-s3.yaml
La taille indiquée dans storage (ici 5Gi) est indicative pour Kubernetes. Elle ne limite pas réellement l'espace utilisé sur le bucket S3 — c'est la capacité de votre bucket qui fait foi.
Étape 4 — Utiliser le PVC dans un pod
Une fois le PVC créé, vous pouvez le monter dans un pod comme n'importe quel autre volume Kubernetes. Voici un exemple avec un pod nginx :
apiVersion: v1
kind: Pod
metadata:
name: pod-de-test-nginx
namespace: default
spec:
containers:
- name: test
image: nginx
volumeMounts:
- mountPath: /usr/share/nginx/html/s3
name: webroot
volumes:
- name: webroot
persistentVolumeClaim:
claimName: <nom-donné-au-PVC>
readOnly: false
kubectl apply -f pod-nginx.yaml
Le répertoire /usr/share/nginx/html/s3 dans le conteneur sera alors synchronisé avec le contenu de votre bucket S3.
Bonnes pratiques
- Cache mémoire : Limitez le cache mémoire via l'option
--memory-limitdans laStorageClasspour éviter une consommation excessive de RAM sur les nœuds (valeur recommandée :1000pour 1 Go). - Workloads adaptés : GeeseFs est optimisé pour les accès séquentiels (lecture/écriture de fichiers). Évitez de l'utiliser pour des bases de données ou des applications nécessitant des accès aléatoires intensifs.