Migration du module d'extension de volume FlexVolume vers le module d'extension de volume CSI

Découvrez comment migrer une charge globale Kubernetes (gérée par StatefulSet) du module d'extension de volume FlexVolume vers le module d'extension de volume CSI.

Vous pouvez utiliser le module d'extension de volume CSI ou FlexVolume pour connecter des clusters à des volumes de blocs du service Block Volume. Cependant, Oracle recommande d'utiliser le module d'extension de volume CSI pour les raisons suivantes :
  • Le projet Kubernetes en amont abandonne le module d'extension de volume FlexVolume dans la version 1.23 de Kubernetes.
  • Une nouvelle fonctionnalité est uniquement ajoutée au module d'extension de volume CSI, et non au module d'extension de volume FlexVolume.
  • Le module d'extension de volume CSI ne nécessite pas d'accès aux dépendances sous-jacentes du système d'exploitation et du système de fichiers racine.

Dans Kubernetes, une façon de gérer les applications avec conservation de statut nécessitant un stockage persistant consiste à utiliser des objets StatefulSet. Pour plus d'informations sur les objets StatefulSet, reportez-vous à StatefulSets dans la documentation Kubernetes.

Si vous disposez d'une application avec conservation de statut nécessitant un stockage persistant et que le service StatefulSet qui gère l'application utilise actuellement le module d'extension de volume FlexVolume pour provisionner un volume persistant, nous vous recommandons de migrer la charge globale pour utiliser le module d'extension de volume CSI à la place.

Cette section fournit les étapes génériques de migration d'une charge globale (gérée par StatefulSet) du module d'extension de volume FlexVolume vers le module d'extension de volume CSI, comme suit :

Cette section comprend également un exemple complet, qui vous permet de voir les étapes de la pratique. Reportez-vous à Exemple de migration d'une charge globale du module d'extension de volume FlexVolume vers le module d'extension de volume CSI.

Notez que dans cette section :

  • Les volumes persistants et les demandes de volume persistant créées par le module d'extension de volume FlexVolume sont respectivement appelés FlexVolume PV et FlexVolume PVC.
  • Les volumes persistants et les demandes de volume persistant créées par le module d'extension de volume CSI sont respectivement appelées CSI PV et CSI PVC.

Etape 1 : remplacez la stratégie de récupération des objets PV FlexVolume existants par "Conserver".

  1. Pour connaître les noms des PV FlexVolume qui sont liés aux PVC FlexVolume dans le fichier StatefulSet, entrez :

    kubectl get pvc
  2. Remplacez la stratégie de récupération des objets PV FlexVolume existants par Retain pour empêcher la suppression des volumes de blocs qui soutiennent les PV lors de la migration, en saisissant ce qui suit :

    kubectl patch pv <volume-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
  3. Vérifiez que chaque PV FlexVolume a été mis à jour en saisissant la commande suivante :

    kubectl get pv <volume-name>
  4. Vérifiez que la sortie indique que la stratégie de récupération a été définie sur Conserver pour chaque PV FlexVolume.

    Important

    Vérifiez à nouveau que la stratégie de récupération a été définie sur Conserver pour chaque PV FlexVolume. Si la stratégie de récupération n'est pas définie sur Conserver, le volume de blocs qui sauvegarde la valeur PV FlexVolume sera supprimé pendant la migration.

Etape 2 : créer de nouveaux objets CSI PV et les lier à des volumes de blocs

  1. Créez un fichier manifeste PV.
  2. Pour chaque objet PV FlexVolume existant, copiez la définition PV de modèle suivante dans le fichier pour définir un nouvel objet PV CSI correspondant :

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: <new-pv-name>
      annotations:
        pv.kubernetes.io/provisioned-by: blockvolume.csi.oraclecloud.com
    spec:
      storageClassName: oci-bv
      persistentVolumeReclaimPolicy: Retain
      capacity:
        storage: <original-pv-storage>
      accessModes:
        - ReadWriteOnce
      csi:
        driver: blockvolume.csi.oraclecloud.com
        fsType: <original-pv-fs-type>
        volumeHandle: <original-pv-volume-ocid>
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: topology.kubernetes.io/zone
              operator: In
              values:
              - <original-pv-ad-location>
  3. Pour chaque nouvelle définition d'objet PV CSI, fournissez les valeurs suivantes :

    • Définissez metadata.name sur une chaîne de votre choix pour le nom du nouvel objet PV CSI.
    • Définissez spec.capacity.storage sur la capacité de la PV FlexVolume existante. Par exemple : 50Gi
    • Définissez spec.csi.fstype sur le type de système de fichiers sauvegardant la valeur PV FlexVolume existante. Par exemple, ext4 .
      A savoir : si vous n'êtes pas sûr du type de système de fichiers qui soutienne la valeur PV FlexVolume existante, consultez les détails de la valeur PV FlexVolume en saisissant ce qui suit :
      kubectl get pv <original-pv-name> -o yaml
    • Définissez spec.csi.volumeHandle sur l'OCID du volume de blocs d'origine qui sauvegarde la valeur PV FlexVolume existante. L'OCID a également été utilisé comme nom de la page PV FlexVolume. Par exemple, ocid1.volume.oc1.phx.aaaaaa______xbd
    • Définissez spec.nodeAffinity.required.nodeSelectorTerms.matchExpressions.key: topology.kubernetes.io/zone.values sur le domaine de disponibilité pour CSI PV, en fonction de la valeur failure-domain.beta.kubernetes.io/zone de Flex PV. Par exemple, PHX-AD-1.
      A savoir : Si vous n'êtes pas sûr de la valeur failure-domain.beta.kubernetes.io/zone de la variable flexible existante, consultez les détails de la variable FlexVolume en saisissant ce qui suit :
      kubectl get pv <original-pv-name> -o yaml

    Dans le modèle, spec.storageClassName est déjà défini sur la classe de stockage utilisée par le module d'extension de volume CSI (oci-bv).

    Par exemple :

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: csi-pv-web-app-0
      annotations:
        pv.kubernetes.io/provisioned-by: blockvolume.csi.oraclecloud.com
    spec:
      storageClassName: oci-bv
      persistentVolumeReclaimPolicy: Retain
      capacity:
        storage: 50Gi
      accessModes:
        - ReadWriteOnce
      csi:
        driver: blockvolume.csi.oraclecloud.com
        fsType: ext4
        volumeHandle: ocid1.volume.oc1.phx.aaaaaa______xbd
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: topology.kubernetes.io/zone
              operator: In
              values:
              - PHX-AD-1
  4. Créez les nouveaux objets CSI PV en saisissant la commande suivante :

    kubectl apply -f <pv-manifest-filename>.yaml
  5. Vérifiez que les nouveaux objets CSI PV ont été créés en saisissant la commande suivante :

    kubectl get pv
  6. Vérifiez que la sortie indique :

    • Nouvel objet PV CSI pour chaque objet PV FlexVolume.
    • Tous les nouveaux objets PV CSI ont le statut Available.

Etape 3 : Créer de nouveaux objets CSI PVC et les lier aux objets CSI PV

Vous définissez maintenant un nouvel objet PVC CSI pour chaque objet PV CSI que vous avez créé à l'étape précédente :

  1. Créez un fichier manifeste PVC.
  2. Pour chaque objet PVC FlexVolume existant, copiez la définition de PVC de modèle suivante dans le nouveau fichier pour définir un nouvel objet PVC CSI :

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: <new-pvc-name>
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: <original-pvc-size>
      volumeName: <new-pv-name>
      storageClassName: oci-bv

  3. Pour chaque nouvelle définition d'objet PVC CSI, fournissez les valeurs suivantes :
    • Définissez metadata.name pour indiquer le nom de la nouvelle demande de volume persistant CSI au format suivant :
      <new-volumeClaimTemplates.metadata.name>-<statefulset-name>-<index>

      où :

      • <new-volumeClaimTemplates.metadata.name> est une chaîne de votre choix qui doit être la première partie du nom de la nouvelle demande de volume persistant CSI. La chaîne que vous indiquez ici doit être différente de la valeur volumeClaimTemplates.metadata.name d'origine dans le manifeste StatefulSet. A l'étape 4 : recréation de l'objet StatefulSet pour utiliser les nouveaux objets PVC CSI, vous mettez à jour le manifeste StatefulSet et indiquez cette chaîne comme valeur de volumeClaimTemplates.metadata.name.
      • <statefulset-name> est le nom de StatefulSet qui gère l'application.
      • <index> est un nombre ordinal, commençant à 0 et incrémenté de 1 pour le nombre de répliques indiqué dans StatefulSet.
    • Définissez spec.resources.requests.storage sur la même valeur que celle indiquée pour la demande de volume persistant FlexVolume. Par exemple, 50Gi
    • Définissez spec.volumeName sur le nom que vous avez indiqué comme nom du nouvel objet PV CSI à l'étape 2 : création de nouveaux objets PV CSI et liaison aux volumes de blocs.

    Dans le modèle, spec.storageClassName est déjà défini sur la classe de stockage utilisée par le module d'extension de volume CSI (oci-bv).

    Par exemple :

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: storage-csi-web-app-0
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 50Gi
      volumeName: csi-pv-web-app-0
      storageClassName: oci-bv
  4. Créez les objets PVC CSI en saisissant ce qui suit :

    kubectl apply -f <pvc-manifest-filename>.yaml
  5. Vérifiez que les nouveaux objets CSI PVC ont été créés et liés aux objets CSI PV en saisissant la commande suivante :

    kubectl get pvc
  6. Vérifiez que la sortie indique :

    • Un objet PVC CSI a été créé pour chaque objet PVC FlexVolume.
    • Tous les objets PVC CSI ont le statut Bound.
    • Chaque objet PVC CSI est lié à l'objet PV CSI spécifié dans le manifeste.

Etape 4 : recréez l'objet StatefulSet pour utiliser les nouveaux objets PVC CSI

  1. Créez un manifeste StatefulSet en copiant le fichier contenant le manifeste du fichier StatefulSet existant, puis enregistrez le nouveau fichier manifeste sous un nouveau nom.
  2. Mettez à jour le nouveau manifeste, de sorte que StatefulSet utilise les nouvelles demandes de volume persistant CSI que vous avez créées à l'Step 3 : Create new CSI PVC objects and bind them to CSI PV objects, comme suit :

    • Remplacez spec.template.spec.containers.volumeMounts.name par la chaîne que vous avez choisie comme première partie des nouveaux noms CSI PVC.
    • Remplacez spec.volumeClaimTemplates.metadata.name par la chaîne que vous avez choisie comme première partie des nouveaux noms CSI PVC.
    • Remplacez spec.volumeClaimTemplates.spec.storageClassName par oci-bv (classe de stockage utilisée par le module d'extension de volume CSI).
  3. Supprimez l'objet StatefulSet existant en saisissant ce qui suit :

    kubectl delete statefulsets <statefulset-name>
  4. Créez un objet StatefulSet à partir du nouveau manifeste en saisissant ce qui suit :

    kubectl apply -f <statefulset-manifest-filename>

Etape 5 : suppression des objets PVC et PV FlexVolume d'origine

Après avoir remplacé la valeur persistentVolumeReclaimPolicy de FlexVolume PV par Conserver lors de l'étape 1 : modification de la stratégie de récupération des objets PV FlexVolume existants par Conserver et exécution des autres étapes de cette section, vous pouvez supprimer les objets PV et PVC FlexVolume d'origine.

  1. Pour chaque objet PV FlexVolume, supprimez l'objet PV en saisissant ce qui suit :

    kubectl delete pv <flexvolume-pv-name>
  2. Pour chaque objet PVC FlexVolume, supprimez l'objet PVC en saisissant ce qui suit :

    kubectl delete pvc <flexvolume-pvc-name>

Exemple de migration d'une charge globale du module d'extension de volume FlexVolume vers le module d'extension de volume CSI

Cet exemple montre comment migrer un exemple de charge globale du module d'extension de volume FlexVolume vers le module d'extension de volume CSI. Les instructions de cet exemple supposent une charge globale gérée par un objet StatefulSet nommé web-app.

Exemple de charge globale StatefulSet

Initialement, StatefulSet utilise le module d'extension de volume FlexVolume pour provisionner le stockage. La valeur StatefulSet d'origine est définie dans flex-statefulset.yaml comme suit :

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web-app
spec:
  serviceName: "nginx"
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80
              name: web
          volumeMounts:
            - name: storage-flex
              mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      creationTimestamp: null
      name: storage-flex
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 50Gi
      storageClassName: oci
      volumeMode: Filesystem

Le manifeste StatefulSet d'origine définit :

  • Nom de StatefulSet en tant que web-app (valeur de metadata.name).
  • Nom d'un élément volumeClaimTemplate en tant que storage-flex (valeur de volumeClaimTemplates.metadata.name).
  • Trois répliques (valeur de spec.replicas).

Lors de la création de demandes de volume persistant pour une valeur StatefulSet, Kubernetes utilise la convention suivante pour nommer les demandes de volume persistant :

<volumeClaimTemplate-name>-<StatefulSet-name>-<index>

où :

  • <volumeClaimTemplate-name> est le nom de volumeClaimTemplate spécifié par la valeur de volumeClaimTemplates.metadata.name dans le manifeste StatefulSet. Dans cet exemple, storage-flex.
  • <StatefulSet-name> est le nom de StatefulSet spécifié par la valeur de metadata.name dans le manifeste StatefulSet. Dans cet exemple, web-app.
  • <index> est un nombre ordinal, commençant à 0 et incrémenté de 1 pour le nombre de répliques indiqué dans StatefulSet. Dans cet exemple, trois répliques sont spécifiées.

Ainsi, lorsque Kubernetes a créé les demandes de volume persistant FlexVolume d'origine pour web-app StatefulSet, il a créé trois demandes de volume persistant portant les noms suivants :

  • storage-flex-web-app-0
  • storage-flex-web-app-1
  • storage-flex-web-app-2

Exemple d'étape 1 : remplacez la stratégie de récupération des objets PV FlexVolume existants par "Conserver".

  1. Pour connaître les noms des trois PV FlexVolume qui sont liés aux trois PVC FlexVolume dans le fichier StatefulSet, entrez :

    kubectl get pvc
    
    NAME                     STATUS   VOLUME                                 CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
    storage-flex-web-app-0   Bound    ocid1.volume.oc1.phx.aaaaaa______xbd   50Gi       RWO            oci            <unset>                 9m28s             
    storage-flex-web-app-1   Bound    ocid1.volume.oc1.phx.aaaaaa______xbe   50Gi       RWO            oci            <unset>                 2m59s             
    storage-flex-web-app-2   Bound    ocid1.volume.oc1.phx.aaaaaa______xbf   50Gi       RWO            oci            <unset>                 2m3s              
  2. Vous modifiez la stratégie de récupération des trois objets PV FlexVolume existants en Retain afin d'empêcher la suppression des volumes de blocs qui soutiennent les PV lors de la migration, en saisissant ce qui suit :

    kubectl patch pv <volume-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'

    Dans cet exemple :

    kubectl patch pv ocid1.volume.oc1.phx.aaaaaa______xbd -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
    
    persistentvolume/ocid1.volume.oc1.phx.aaaaaa______xbd patched
    kubectl patch pv ocid1.volume.oc1.phx.aaaaaa______xbe -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
    
    persistentvolume/ocid1.volume.oc1.phx.aaaaaa______xbe patched
    kubectl patch pv ocid1.volume.oc1.phx.aaaaaa______xbf -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
    
    persistentvolume/ocid1.volume.oc1.phx.aaaaaa______xbf patched
  3. Vérifiez que chaque PV FlexVolume a été mis à jour en saisissant la commande suivante :

    kubectl get pv
    
    NAME                                   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS        CLAIM                            STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
    ocid1.volume.oc1.phx.aaaaaa______xbd   50Gi       RWO            Retain           Bound         default/storage-flex-web-app-0   oci            <unset>                          13m
    ocid1.volume.oc1.phx.aaaaaa______xbe   50Gi       RWO            Retain           Bound         default/storage-flex-web-app-2   oci            <unset>                          6m8s
    ocid1.volume.oc1.phx.aaaaaa______xbf   50Gi       RWO            Retain           Bound         default/storage-flex-web-app-1   oci            <unset>                          7m8s
  4. Vérifiez que la sortie indique que la stratégie de récupération a été définie sur Conserver pour chaque PV FlexVolume.

    Important

    Vérifiez à nouveau que la stratégie de récupération a été définie sur Conserver pour chaque PV FlexVolume. Si la stratégie de récupération n'est pas définie sur Conserver, le volume de blocs qui sauvegarde la valeur PV FlexVolume sera supprimé pendant la migration.

Exemple Etape 2 : créer de nouveaux objets CSI PV et les lier à des volumes de blocs

  1. Créez un fichier manifeste PV et enregistrez-le sous migrated-csi-pv.yaml.

  2. Pour chacun des trois objets PV FlexVolume existants, copiez la définition PV de modèle suivante dans le fichier migrated-CSI-pv.yaml pour définir un nouvel objet PV CSI correspondant.

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: <new-pv-name>
      annotations:
        pv.kubernetes.io/provisioned-by: blockvolume.csi.oraclecloud.com
    spec:
      storageClassName: oci-bv
      persistentVolumeReclaimPolicy: Retain
      capacity:
        storage: <original-pv-storage>
      accessModes:
        - ReadWriteOnce
      csi:
        driver: blockvolume.csi.oraclecloud.com
        fsType: <original-pv-fs-type>
        volumeHandle: <original-pv-volume-ocid>
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: topology.kubernetes.io/zone
              operator: In
              values:
              - <original-pv-ad-location>
  3. Pour chaque nouvelle définition d'objet PV CSI, vous devez fournir les valeurs suivantes :

    • Définissez metadata.name sur une chaîne de votre choix pour le nom du nouvel objet PV CSI. Dans cet exemple, vous nommez les nouveaux objets PV CSI csi-pv-web-app-0, csi-pv-web-app-1 et csi-pv-web-app-2.
    • Définissez spec.capacity.storage sur la capacité de la PV FlexVolume existante. Dans cet exemple, vous indiquez 50Gi pour les trois nouveaux objets PV CSI.
    • Définissez spec.csi.fstype sur le type de système de fichiers sauvegardant la valeur PV FlexVolume existante. Dans cet exemple, vous indiquez ext4 pour les trois nouveaux objets PV CSI.
    • Définissez spec.csi.volumeHandle sur l'OCID du volume de blocs d'origine qui sauvegarde la valeur PV FlexVolume existante. L'OCID a également été utilisé comme nom de l'objet PV FlexVolume. Dans cet exemple, vous indiquez les OCID suivants pour les trois nouveaux objets CSI PV :
      • ocid1.volume.oc1.phx.aaaaaa______xbd
      • ocid1.volume.oc1.phx.aaaaaa______xbe
      • ocid1.volume.oc1.phx.aaaaaa______xbf
    • Définissez spec.nodeAffinity.required.nodeSelectorTerms.matchExpressions.key: topology.kubernetes.io/zone sur le domaine de disponibilité pour CSI PV, en fonction de la valeur failure-domain.beta.kubernetes.io/zone de Flex PV. Dans cet exemple, vous indiquez les domaines de disponibilité suivants pour les trois nouveaux objets PV CSI :
      • PHX-AD-1
      • PHX-AD-2
      • PHX-AD-3

    Après avoir saisi les informations, le fichier migrated-CSI-pv.yaml contient les trois définitions CSI PV suivantes :

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: csi-pv-web-app-0
      annotations:
        pv.kubernetes.io/provisioned-by: blockvolume.csi.oraclecloud.com
    spec:
      storageClassName: oci-bv
      persistentVolumeReclaimPolicy: Retain
      capacity:
        storage: 50Gi
      accessModes:
        - ReadWriteOnce
      csi:
        driver: blockvolume.csi.oraclecloud.com
        fsType: ext4
        volumeHandle: ocid1.volume.oc1.phx.aaaaaa______xbd
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: topology.kubernetes.io/zone
              operator: In
              values:
              - PHX-AD-3
    ---
    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: csi-pv-web-app-1
      annotations:
        pv.kubernetes.io/provisioned-by: blockvolume.csi.oraclecloud.com
    spec:
      storageClassName: oci-bv
      persistentVolumeReclaimPolicy: Retain
      capacity:
        storage: 50Gi
      accessModes:
        - ReadWriteOnce
      csi:
        driver: blockvolume.csi.oraclecloud.com
        fsType: ext4
        volumeHandle: ocid1.volume.oc1.phx.aaaaaa______xbe
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: topology.kubernetes.io/zone
              operator: In
              values:
              - PHX-AD-2
    ---
    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: csi-pv-web-app-2
      annotations:
        pv.kubernetes.io/provisioned-by: blockvolume.csi.oraclecloud.com
    spec:
      storageClassName: oci-bv
      persistentVolumeReclaimPolicy: Retain
      capacity:
        storage: 50Gi
      accessModes:
        - ReadWriteOnce
      csi:
        driver: blockvolume.csi.oraclecloud.com
        fsType: ext4
        volumeHandle: ocid1.volume.oc1.phx.aaaaaa______xbf
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: topology.kubernetes.io/zone
              operator: In
              values:
              - PHX-AD-1
  4. Pour créer les trois nouveaux objets CSI PV, entrez :

    kubectl apply -f migrated-csi-pv.yaml
    
    persistentvolume/csi-pv-web-app-0 created
    persistentvolume/csi-pv-web-app-1 created
    persistentvolume/csi-pv-web-app-2 created
  5. Vous confirmez que les trois nouveaux objets CSI PV ont été créés en saisissant la commande suivante :

    kubectl get pv
    
    NAME                                   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS        CLAIM                            STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
    csi-pv-web-app-0                       50Gi       RWO            Retain           Available                                      oci-bv         <unset>                          11s
    csi-pv-web-app-1                       50Gi       RWO            Retain           Available                                      oci-bv         <unset>                          11s
    csi-pv-web-app-2                       50Gi       RWO            Retain           Available                                      oci-bv         <unset>                          10s
    ocid1.volume.oc1.phx.aaaaaa______xbd   50Gi       RWO            Retain           Bound         default/storage-flex-web-app-0   oci            <unset>                          23m
    ocid1.volume.oc1.phx.aaaaaa______xbe   50Gi       RWO            Retain           Bound         default/storage-flex-web-app-2   oci            <unset>                          16m
    ocid1.volume.oc1.phx.aaaaaa______xbf   50Gi       RWO            Retain           Bound         default/storage-flex-web-app-1   oci            <unset>                          17m
  6. Vous vérifiez que la sortie indique :

    • Nouvel objet PV CSI pour chacun des objets PV FlexVolume d'origine.
    • Les trois nouveaux objets PV CSI ont le statut Available.

Exemple Etape 3 : Créer de nouveaux objets CSI PVC et les lier aux objets CSI PV

Vous définissez maintenant un nouvel objet PVC CSI pour chaque objet PV CSI que vous avez créé à l'étape précédente :

  1. Créez un fichier manifeste PVC et enregistrez-le en tant que migrated-csi-pvc.yaml.

  2. Pour chacun des trois objets PVC FlexVolume existants, copiez la définition de PVC de modèle suivante dans le fichier migrated-CSI-pvc.yaml pour définir un nouvel objet PVC CSI.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: <new-pvc-name>
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: <original-pvc-size>
      volumeName: <new-pv-name>
      storageClassName: oci-bv
  3. Pour chaque nouvelle définition d'objet PVC CSI, vous fournissez les valeurs suivantes :

    • Vous définissez metadata.name pour indiquer le nom de la nouvelle demande de volume persistant CSI au format suivant :

      <new-volumeClaimTemplates.metadata.name>-<statefulset-name>-<index>

      où :

      • <new-volumeClaimTemplates.metadata.name> est une chaîne de votre choix qui doit être la première partie du nom de la nouvelle demande de volume persistant CSI. La chaîne que vous indiquez ici doit être différente de la valeur volumeClaimTemplates.metadata.name d'origine dans le manifeste StatefulSet. Dans l'exemple d'étape 4 : recréation de l'objet StatefulSet pour utiliser les nouveaux objets PVC CSI, vous mettez à jour le manifeste StatefulSet et indiquez cette chaîne comme nouvelle valeur de volumeClaimTemplates.metadata.name. Dans cet exemple, vous indiquez storage-csi.
      • <statefulset-name> est web-app (nom du fichier StatefulSet qui gère l'exemple d'application).
      • <index> est un nombre ordinal, commençant à 0 et incrémenté de 1 pour le nombre de répliques indiqué dans StatefulSet. Dans cet exemple, web-app StatefulSet indique trois répliques.
    • Vous définissez spec.resources.requests.storage sur la même valeur que celle indiquée pour la demande de volume persistant FlexVolume. Dans cet exemple, vous indiquez 50Gi
    • Vous définissez spec.volumeName sur l'un des noms (csi-pv-web-app-0, csi-pv-web-app-1 ou csi-pv-web-app-2) que vous avez indiqués pour les nouveaux objets PV CSI dans l'exemple d'étape 2 : création de nouveaux objets PV CSI et liaison aux volumes de blocs.

    Après avoir entré les informations, le fichier migrated-CSI-pvc.yaml contient les trois définitions CSI PVC suivantes :

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: storage-csi-web-app-0
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 50Gi
      volumeName: csi-pv-web-app-0
      storageClassName: oci-bv
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: storage-csi-web-app-1
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 50Gi
      volumeName: csi-pv-web-app-1
      storageClassName: oci-bv
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: storage-csi-web-app-2
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 50Gi
      volumeName: csi-pv-web-app-2
      storageClassName: oci-bv
  4. Pour créer les nouveaux objets CSI PVC, entrez :

    kubectl apply -f migrated-csi-pvc.yaml
    
    persistentvolumeclaim/storage-csi-web-app-0 created
    persistentvolumeclaim/storage-csi-web-app-1 created
    persistentvolumeclaim/storage-csi-web-app-2 created
  5. Vous confirmez que les nouveaux objets CSI PVC ont été créés et liés aux objets CSI PV en saisissant :

    kubectl get pvc
    
    NAME                     STATUS   VOLUME                                 CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
    storage-csi-web-app-0    Bound    csi-pv-web-app-0                       50Gi       RWO            oci-bv         <unset>                 2m32s
    storage-csi-web-app-1    Bound    csi-pv-web-app-1                       50Gi       RWO            oci-bv         <unset>                 2m31s
    storage-csi-web-app-2    Bound    csi-pv-web-app-2                       50Gi       RWO            oci-bv         <unset>                 2m31s
    storage-flex-web-app-0   Bound    ocid1.volume.oc1.phx.aaaaaa______xbd   50Gi       RWO            oci            <unset>                 38m
    storage-flex-web-app-1   Bound    ocid1.volume.oc1.phx.aaaaaa______xbe   50Gi       RWO            oci            <unset>                 31m
    storage-flex-web-app-2   Bound    ocid1.volume.oc1.phx.aaaaaa______xbf   50Gi       RWO            oci            <unset>                 30m
  6. Vérifiez que la sortie affiche :

    • Un objet PVC CSI a été créé pour chaque objet PVC FlexVolume.
    • Les trois objets PVC CSI ont le statut Bound.
    • Chaque objet PVC CSI est lié à l'objet PV CSI spécifié dans le manifeste.

Exemple d'étape 4 : recréez l'objet StatefulSet pour utiliser les nouveaux objets PVC CSI

  1. Pour créer un manifeste StatefulSet, copiez le fichier contenant le manifeste de l'élément StatefulSet existant (flex-statefulset.yaml), puis enregistrez le nouveau fichier manifeste en tant que csi.statefulset.yaml.
  2. Vous mettez à jour le nouveau manifeste dans csi.statefulset.yaml, de sorte que StatefulSet utilise les nouvelles demandes de volume persistant CSI que vous avez créées dans l'exemple d'étape 3 : création de nouveaux objets de demande de volume persistant CSI et liaison aux objets PV CSI, comme suit :
    • Vous remplacez spec.template.spec.containers.volumeMounts.name par storage-csi (chaîne que vous avez choisie comme première partie des nouveaux noms de demande de volume persistant CSI).
    • Vous remplacez spec.volumeClaimTemplates.metadata.name par storage-csi (chaîne que vous avez choisie comme première partie des nouveaux noms de demande de volume persistant CSI).
    • Vous remplacez spec.volumeClaimTemplates.spec.storageClassName par oci-bv (classe de stockage utilisée par le module d'extension de volume CSI).

    Le nouveau manifeste StatefulSet dans csi.statefulset.yaml se présente désormais comme suit :

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web-app
    spec:
      serviceName: "nginx"
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - name: nginx
              image: nginx:latest
              ports:
                - containerPort: 80
                  name: web
              volumeMounts:
                - name: storage-csi
                  mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - apiVersion: v1
        kind: PersistentVolumeClaim
        metadata:
          creationTimestamp: null
          name: storage-csi
        spec:
          accessModes:
          - ReadWriteOnce
          resources:
            requests:
              storage: 50Gi
          storageClassName: oci-bv
          volumeMode: Filesystem
  3. Supprimez l'objet web-app StatefulSet existant en saisissant ce qui suit :

    kubectl delete statefulsets web-app
    
    statefulset.apps "web-app" deleted
  4. Créez un objet web-app StatefulSet à partir du nouveau manifeste en saisissant la commande suivante :

    kubectl apply -f csi.statefulset.yaml

Exemple d'étape 5 : suppression des objets PVC et PV FlexVolume d'origine

Après avoir remplacé la valeur persistentVolumeReclaimPolicy de FlexVolume PV par Conserver dans l'exemple d'étape 1 : remplacez la stratégie de récupération des objets PV FlexVolume existants par Conserver, puis effectuez les autres étapes de cette section, vous pouvez supprimer les objets PV et PVC FlexVolume d'origine.

  1. Pour chaque objet PV FlexVolume, supprimez l'objet PV en saisissant ce qui suit :

    kubectl delete pv <flexvolume-pv-name>

    Dans cet exemple :

    kubectl delete pv ocid1.volume.oc1.phx.aaaaaa______xbd
    
    persistentvolume ocid1.volume.oc1.phx.aaaaaa______xbd deleted
    kubectl delete pv ocid1.volume.oc1.phx.aaaaaa______xbe
    
    persistentvolume ocid1.volume.oc1.phx.aaaaaa______xbe deleted
    kubectl delete pv ocid1.volume.oc1.phx.aaaaaa______xbf
    
    persistentvolume ocid1.volume.oc1.phx.aaaaaa______xbf deleted
  2. Pour chaque objet PVC FlexVolume, supprimez l'objet PVC en saisissant ce qui suit :

    kubectl delete pvc <flexvolume-pv-name>

    Dans cet exemple :

    kubectl delete pvc storage-flex-web-app-0
    
    persistentvolumeclaim storage-flex-web-app-0 deleted
    kubectl delete pvc storage-flex-web-app-1
    
    persistentvolumeclaim storage-flex-web-app-1 deleted
    kubectl delete pvc storage-flex-web-app-2
    
    persistentvolumeclaim storage-flex-web-app-2 deleted