Utiliser des disques persistants préexistants en tant que PersistentVolumes

Cette page explique comment créer un objet PersistentVolume à l'aide d'un disque persistant Compute Engine existant contenant des données et l'utiliser ensuite dans un pod.

Créer les objets PersistentVolume et PersistentVolumeClaim

Si vous disposez déjà d'un disque persistant de 500 Go nommé pd-name, le fichier manifeste suivant (nommé existing-pd.yaml) décrit un objet PersistentVolume et un objet PersistentVolumeClaim correspondants.

Il existe plusieurs façons de lier un objet PersistentVolumeClaim à un objet PersistentVolume spécifique. Cet exemple utilise un objet claimRef qui garantit que l'objet PersistentVolume ne peut être lié qu'à l'objet PersistentVolumeClaim que vous spécifiez.

Pour qu'un PersistentVolume soit liés à une PersistentVolumeClaim, le storageClassName des deux ressources doit correspondre, ainsi que les objets capacity, accessModes et volumeMode. Vous pouvez fournir un nom vide, mais vous devez explicitement utiliser "" pour empêcher l'utilisation de la StorageClass par défaut du cluster.

Le fichier storageClassName n'a pas besoin de faire référence à un objet StorageClass existant. Vous pouvez utiliser un nom arbitraire si tout ce dont vous avez besoin est de lier la revendication à un volume. Si vous avez besoin de fonctionnalités supplémentaires configurées par une StorageClass, par exemple redimensionner le volume, storageClassName doit faire référence à un objet StorageClass existant.

Pour en savoir plus, consultez la documentation Kubernetes sur les PersistentVolumes.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-demo
spec:
  storageClassName: "example-storageclass"
  capacity:
    storage: 500G
  accessModes:
    - ReadWriteOnce
  claimRef:
    namespace: default
    name: pv-claim-demo
  gcePersistentDisk:
    pdName: pd-name
    fsType: ext4
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-claim-demo
spec:
  storageClassName: "example-storageclass"
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500G

Utilisez la commande kubectl apply -f existing-pd.yaml pour créer les objets PersistentVolume et PersistentVolumeClaim.

Utiliser l'objet PersistentVolume dans un pod

Une fois que les objets PersistentVolume et PersistentVolumeClaim sont présents dans le cluster, vous pouvez autoriser les conteneurs d'un pod à accéder au volume en spécifiant des valeurs dans le champ volumeMounts. Dans cet exemple, ces champs indiquent que le volume nommé task-pv-storage est installé et que son chemin d'accès est /usr/share/nginx/html.

kind: Pod
apiVersion: v1
metadata:
  name: task-pv-pod
spec:
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
       claimName: pv-claim-demo
  containers:
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: task-pv-storage

Lorsque vous appliquez ce fichier manifeste à un cluster, le pod est créé et le conteneur task-pv-container a accès au volume dans son répertoire /usr/share/nginx/html/.

Utiliser un disque préexistant dans un objet StatefulSet

Pour utiliser un disque préexistant dans un objet StatefulSet, procédez comme suit :

  1. Déterminez le nom de l'objet StatefulSet, volumeClaimTemplates.name, ainsi que le nombre d'instances dupliquées pour cet objet, puis enregistrez les valeurs. Ne créez pas l'objet StatefulSet tant que vous n'avez pas terminé de créer l'objet PersistentVolumeClaim.
  2. Déterminez le nom de l'objet PersistentVolumeClaim généré automatiquement par l'objet StatefulSet. Dans les objets StatefulSet, le nom PersistentVolumeClaim suit un modèle prévisible : volumeclaimtemplates-name - statefulset-name - replica-index. Par exemple, si vous décidez que le nom de l'objet StatefulSet est "web" et que le volumeClaimTemplates.name de l'objet StatefulSet est "www" alors qu'il existe deux instances dupliquées de l'objet StatefulSet, les deux noms PersistentVolumeClaim sont : www-web-0 et www-web-1.
  3. Créez des objets PersistentVolume avec un champ claimRef et définissez claimRef.name sur le nom de l'objet PersistentVolumeClaim généré. Lorsqu'il existe plusieurs instances dupliquées, vous devez créer un objet PersistentVolume pour chaque instance dupliquée.

    Les exemples d'objets PersistentVolume présentés ci-dessous concernent un environnement doté des fonctionnalités suivantes :

    • Un objet StatefulSet qui se trouve dans l'espace de noms par défaut.
    • Un objet StatefulSet comportant deux instances dupliquées.
    • Un objet StatefulSet dans lequel les noms de PersistentVolumeClaim générés automatiquement sont www-web-0 et www-web-1.
    • Deux disques persistants existants nommés pd-zero et pd-one.
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-statefulset-demo-0
    spec:
      storageClassName: "example-storageclass"
      capacity:
        storage: 100Gi
      accessModes:
        - ReadWriteOnce
      claimRef:
        namespace: default
        name: www-web-0
      gcePersistentDisk:
        pdName: pd-zero
        fsType: ext4
    
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-statefulset-demo-1
    spec:
      storageClassName: "example-storageclass"
      capacity:
        storage: 100Gi
      accessModes:
        - ReadWriteOnce
      claimRef:
        namespace: default
        name: www-web-1
      gcePersistentDisk:
        pdName: pd-one
        fsType: ext4
    
  4. Créez un objet StatefulSet à l'aide des valeurs que vous avez choisies à la première étape. Assurez-vous que l'espace de stockage que vous spécifiez dans volumeClaimTemplates est inférieur ou égal à la capacité de vos objets PersistentVolume. Exemple :

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      selector:
        matchLabels:
          app: nginx
      serviceName: "nginx"
      replicas: 2
      template:
        metadata:
          labels:
            app: nginx
        spec:
          terminationGracePeriodSeconds: 10
          containers:
          - name: nginx
            image: k8s.gcr.io/nginx-slim:0.8
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - metadata:
          name: www
        spec:
          accessModes: [ "ReadWriteOnce" ]
          resources:
            requests:
              storage: 100Gi
    

Étape suivante