Migration du plugiciel de volume FlexVolume vers le plugiciel de volume CSI

Découvrez comment migrer une charge de travail Kubernetes (gérée par un StatefulSet) du plugiciel de volume FlexVolume vers le plugiciel de volume CSI.

Vous pouvez utiliser le plugiciel de volume CSI ou FlexVolume pour connecter des grappes à des volumes par blocs à partir du service de volume par blocs. Cependant, Oracle recommande d'utiliser le plugiciel de volume CSI pour les raisons suivantes :
  • Le projet Kubernetes en amont abandonne le plugiciel de volume FlexVolume dans Kubernetes version 1.23.
  • De nouvelles fonctionnalités sont uniquement ajoutées au plugiciel de volume CSI, et non au plugiciel de volume FlexVolume.
  • Le plugiciel de volume CSI ne nécessite pas l'accès au système d'exploitation sous-jacent ni aux dépendances du système de fichiers racine.

Dans Kubernetes, une façon de gérer les applications avec état qui nécessitent un stockage persistant est d'utiliser des objets StatefulSet. Pour plus d'informations sur les objets StatefulSet, voir StatefulSets dans la documentation sur Kubernetes.

Si vous avez une application avec état qui nécessite un stockage persistant et que StatefulSet qui gère l'application utilise actuellement le plugiciel de volume FlexVolume pour provisionner un volume persistant, nous vous recommandons de migrer la charge de travail pour utiliser le plugiciel de volume CSI à la place.

Cette section fournit des étapes génériques pour migrer une charge de travail (gérée par un StatefulSet) du plugiciel de volume FlexVolume vers le plugiciel de volume CSI, comme suit :

Cette section comprend également un exemple de travail complet, afin que vous puissiez voir les étapes dans la pratique. Voir Exemple de migration d'une charge de travail du plugiciel de volume FlexVolume vers le plugiciel de volume CSI.

Notez que dans cette section :

  • Les revendications de volumes persistants et de volumes persistants créés par le plugiciel de volume FlexVolume sont appelées FlexVolume PVs et FlexVolume PVCs respectivement.
  • Les volumes persistants et les revendications de volume persistants créés par le plugiciel de volume CSI sont appelés PV CSI et PVC CSI respectivement.

Étape 1 : Modifier la politique de récupération des objets PV FlexVolume existants à "Conserver"

  1. Recherchez les noms des PV FlexVolume qui sont liés aux PVC FlexVolume dans StatefulSet en entrant :

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

    kubectl patch pv <volume-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
  3. Confirmez que chaque PV FlexVolume a été mis à jour, en entrant :

    kubectl get pv <volume-name>
  4. Vérifiez que la sortie indique que la politique de récupération a été réglée à Conserver pour chaque point de vue FlexVolume.

    Important

    Vérifiez que la politique de récupération a été réglée à Conserver pour chaque point de vente FlexVolume. Si la politique de récupération n'est pas réglée à Conserver, le volume par blocs qui sauvegarde le PV FlexVolume est supprimé lors de la migration.

Étape 2 : Créer de nouveaux objets PV CSI et les lier aux volumes par blocs

  1. Créez un fichier manifeste PV.
  2. Pour chaque objet PV FlexVolume existant, copiez la définition de 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 :

    • Réglez metadata.name à une chaîne de votre choix pour le nom du nouvel objet PV CSI.
    • Réglez spec.capacity.storage à la capacité du point de vue FlexVolume existant. Par exemple, 50Gi
    • Réglez spec.csi.fstype au type de système de fichiers qui sauvegarde le point de vue FlexVolume existant. Par exemple : ext4 .
      Conseil : Si vous n'êtes pas sûr du type de système de fichiers qui sauvegarde le point de vue FlexVolume existant, voir les détails du point de vue FlexVolume en entrant :
      kubectl get pv <original-pv-name> -o yaml
    • Réglez spec.csi.volumeHandle à l'OCID du volume par blocs initial soutenant le volume FlexVolume existant. L'OCID a également été utilisé comme nom du point de vue FlexVolume. Par exemple, ocid1.volume.oc1.phx.aaaaaa______xbd
    • Réglez spec.nodeAffinity.required.nodeSelectorTerms.matchExpressions.key: topology.kubernetes.io/zone.values au domaine de disponibilité pour le PV CSI, en fonction de la valeur du PV Flex failure-domain.beta.kubernetes.io/zone. Par exemple : PHX-AD-1.
      Conseil : Si vous n'êtes pas sûr de la valeur de la valeur failure-domain.beta.kubernetes.io/zone de la fonction PV Flex existante, consultez les détails de la fonction PV FlexVolume en entrant :
      kubectl get pv <original-pv-name> -o yaml

    Notez que dans le modèle, spec.storageClassName est déjà réglé à la classe de stockage utilisée par le plugiciel 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 PV CSI en entrant :

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

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

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

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

Vous allez maintenant définir 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 de PVC.
  2. Pour chaque objet de revendication de volume persistant FlexVolume existant, copiez la définition de revendication de volume persistant de modèle suivante dans le nouveau fichier pour définir un nouvel objet de revendication de volume persistant 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 de revendication de volume persistant CSI, fournissez les valeurs suivantes :
    • Définissez metadata.name pour spécifier le nom de la nouvelle revendication de volume persistant CSI dans le format suivant :
      <new-volumeClaimTemplates.metadata.name>-<statefulset-name>-<index>

      où :

      • <new-volumeClaimTemplates.metadata.name> est une chaîne de votre choix pour être la première partie du nom de la nouvelle revendication de volume persistant CSI. La chaîne que vous spécifiez ici doit être différente de la valeur volumeClaimTemplates.metadata.name initiale dans le manifeste StatefulSet. À l'étape 4 : Recréez l'objet StatefulSet pour utiliser les nouveaux objets de revendication de volume persistant CSI, vous mettez à jour le manifeste StatefulSet et spécifiez 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 spécifié dans StatefulSet.
    • Réglez spec.resources.requests.storage à la même valeur que celle spécifiée pour la revendication de volume persistant FlexVolume. Par exemple, 50Gi
    • Réglez spec.volumeName au nom que vous avez spécifié en tant que nom du nouvel objet PV CSI à l'étape 2 : Créer de nouveaux objets PV CSI et les lier aux volumes par blocs.

    Notez que dans le modèle, spec.storageClassName est déjà réglé à la classe de stockage utilisée par le plugiciel 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 nouveaux objets de PVC CSI en entrant :

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

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

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

Étape 4 : Recréez l'objet StatefulSet pour utiliser les nouveaux objets de revendication de volume persistant CSI

  1. Créez un nouveau manifeste StatefulSet en copiant le fichier contenant le manifeste du fichier StatefulSet existant et enregistrez le nouveau fichier manifeste sous un nouveau nom.
  2. Mettez à jour le nouveau manifeste, de sorte que StatefulSet utilise les nouvelles PVC CSI que vous avez créées à l'étape 3 : Créer de nouveaux objets de PVC CSI et les lier aux objets PV CSI, comme suit :

    • Remplacez spec.template.spec.containers.volumeMounts.name par la chaîne que vous avez sélectionnée comme première partie des nouveaux noms de revendication de volume persistant CSI.
    • Remplacez spec.volumeClaimTemplates.metadata.name par la chaîne que vous avez sélectionnée comme première partie des nouveaux noms de revendication de volume persistant CSI.
    • Remplacez spec.volumeClaimTemplates.spec.storageClassName par oci-bv (classe de stockage utilisée par le plugiciel de volume CSI).
  3. Supprimez l'objet StatefulSet existant en entrant :

    kubectl delete statefulsets <statefulset-name>
  4. Créez un nouvel objet StatefulSet à partir du nouveau manifeste en entrant :

    kubectl apply -f <statefulset-manifest-filename>

Étape 5 : Supprimer les objets PVC et PV FlexVolume d'origine

Après avoir modifié la valeur persistentVolumeReclaimPolicy de la valeur FlexVolume pour Conserver à l'étape 1 : Modifier la politique de récupération des objets PV FlexVolume existants à "Conserver" et terminé les autres étapes de cette section, vous pouvez maintenant supprimer les objets PV et PVC FlexVolume initiaux.

  1. Pour chaque objet PV FlexVolume, supprimez l'objet PV en entrant :

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

    kubectl delete pvc <flexvolume-pvc-name>

Exemple de migration d'une charge de travail du plugiciel de volume FlexVolume vers le plugiciel de volume CSI

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

Exemple de charge de travail StatefulSet

Initialement, StatefulSet utilise le plugiciel de volume FlexVolume pour provisionner le stockage. La valeur StatefulSet initiale 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 initial définit :

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

Lors de la création d'une revendication de volume persistant pour une instance StatefulSet, Kubernetes utilise la convention suivante pour nommer les revendications 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 spécifié dans StatefulSet. Dans cet exemple, trois répliques sont spécifiées.

Ainsi, lorsque Kubernetes a créé les PVC FlexVolume d'origine pour web-app StatefulSet, il a créé trois PVC avec les noms suivants :

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

Exemple Étape 1 : Modifier la politique de récupération des objets PV FlexVolume existants à "Conserver"

  1. Pour connaître les noms des trois PV FlexVolume qui sont liés aux trois PVC FlexVolume dans 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 remplacez la politique de récupération des trois objets PV FlexVolume existants par Retain pour empêcher la suppression des volumes par blocs qui soutiennent les PV lors de la migration, en entrant :

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

    Dans ce cas :

    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. Confirmez que chaque PV FlexVolume a été mis à jour, en entrant :

    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 politique de récupération a été réglée à Conserver pour chaque point de vue FlexVolume.

    Important

    Vérifiez que la politique de récupération a été réglée à Conserver pour chaque point de vente FlexVolume. Si la politique de récupération n'est pas réglée à Conserver, le volume par blocs qui sauvegarde le PV FlexVolume est supprimé lors de la migration.

Exemple Étape 2 : Créer de nouveaux objets PV CSI et les lier aux volumes par blocs

  1. Vous créez un nouveau fichier manifeste PV et l'enregistrez sous le nom migrated-csi-pv.yaml.

  2. Pour chacun des trois objets PV FlexVolume existants, vous copiez la définition de PV de modèle suivante dans le fichier migré-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 fournissez les valeurs suivantes :

    • Réglez metadata.name à 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.
    • Réglez spec.capacity.storage à la capacité du point de vue FlexVolume existant. Dans cet exemple, vous spécifiez 50Gi pour les trois nouveaux objets PV CSI.
    • Réglez spec.csi.fstype au type de système de fichiers qui sauvegarde le point de vue FlexVolume existant. Dans cet exemple, vous spécifiez ext4 pour les trois nouveaux objets PV CSI.
    • Réglez spec.csi.volumeHandle à l'OCID du volume par blocs initial soutenant le volume FlexVolume existant. L'OCID a également été utilisé comme nom de l'objet PV FlexVolume. Dans cet exemple, vous spécifiez les OCID suivants pour les trois nouveaux objets PV CSI :
      • ocid1.volume.oc1.phx.aaaaaa______xbd
      • ocid1.volume.oc1.phx.aaaaaa______xbe
      • ocid1.volume.oc1.phx.aaaaaa______xbf
    • Réglez spec.nodeAffinity.required.nodeSelectorTerms.matchExpressions.key: topology.kubernetes.io/zone au domaine de disponibilité pour le PV CSI, en fonction de la valeur du PV Flex failure-domain.beta.kubernetes.io/zone. Dans cet exemple, vous spécifiez les domaines de disponibilité suivants pour les trois nouveaux objets PV CSI :
      • PHX-AD-1
      • PHX-AD-2
      • PHX-AD-3

    Après avoir entré les informations, le fichier migrated-CSI-pv.yaml contient les trois définitions PV CSI 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. Vous créez les trois nouveaux objets PV CSI en entrant :

    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 PV CSI ont été créés en entrant :

    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 affiche :

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

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

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

  1. Vous créez un nouveau fichier manifeste de revendication de volume persistant et vous l'enregistrez sous le nom migrated-csi-pvc.yaml.

  2. Pour chacun des trois objets de PVC FlexVolume existants, vous copiez la définition de PVC de modèle suivante dans le fichier migré-CSI-pvc.yaml pour définir un nouvel objet de 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 de PVC CSI, vous fournissez les valeurs suivantes :

    • Vous définissez metadata.name pour spécifier le nom de la nouvelle revendication de volume persistant CSI dans le format suivant :

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

      où :

      • <new-volumeClaimTemplates.metadata.name> est une chaîne de votre choix pour être la première partie du nom de la nouvelle revendication de volume persistant CSI. La chaîne que vous spécifiez ici doit être différente de la valeur volumeClaimTemplates.metadata.name initiale dans le manifeste StatefulSet. Dans l'Exemple d'étape 4 : Recréez l'objet StatefulSet pour utiliser les nouveaux objets de revendication de volume persistant CSI, vous mettez à jour le manifeste StatefulSet et spécifiez cette chaîne en tant que nouvelle valeur de volumeClaimTemplates.metadata.name. Dans cet exemple, vous spécifiez storage-csi.
      • <statefulset-name> est web-app (nom de l'application 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 spécifié dans StatefulSet. Dans cet exemple, web-app StatefulSet spécifie trois répliques.
    • Vous réglez spec.resources.requests.storage à la même valeur que celle spécifiée pour la revendication de volume persistant FlexVolume. Dans cet exemple, vous spécifiez 50Gi
    • Vous réglez spec.volumeName à l'un des noms (csi-pv-web-app-0, csi-pv-web-app-1 ou csi-pv-web-app-2) que vous avez spécifiés pour les nouveaux objets PV CSI dans Exemple d'étape 2 : Créer de nouveaux objets PV CSI et les lier aux volumes par blocs.

    Après avoir entré les informations, le fichier migrated-CSI-pvc.yaml contient les trois définitions de PVC CSI 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. Vous créez de nouveaux objets de PVC CSI en entrant :

    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 de PVC CSI ont été créés et liés aux objets PV CSI en entrant :

    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. Vous vérifiez que la sortie affiche :

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

Exemple Étape 4 : Recréez l'objet StatefulSet pour utiliser les nouveaux objets de revendication de volume persistant CSI

  1. Vous créez un nouveau manifeste StatefulSet en copiant le fichier contenant le manifeste du fichier StatefulSet existant (flex-statefulset.yaml) et en enregistrant le nouveau fichier manifeste sous csi.statefulset.yaml.
  2. Vous mettez à jour le nouveau manifeste dans csi.statefulset.yaml, de sorte que StatefulSet utilise les nouvelles PVC CSI que vous avez créées à l'Exemple d'étape 3 : Créer de nouveaux objets PVC CSI et les lier aux objets PV CSI, comme suit :
    • Vous remplacez spec.template.spec.containers.volumeMounts.name par storage-csi (chaîne que vous avez sélectionnée comme première partie des nouveaux noms de revendication de volume persistant CSI).
    • Vous remplacez spec.volumeClaimTemplates.metadata.name par storage-csi (chaîne que vous avez sélectionnée comme première partie des nouveaux noms de revendication de volume persistant CSI).
    • Vous remplacez spec.volumeClaimTemplates.spec.storageClassName par oci-bv (classe de stockage utilisée par le plugiciel de volume CSI).

    Le nouveau manifeste StatefulSet dans csi.statefulset.yaml se présente maintenant 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 entrant :

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

    kubectl apply -f csi.statefulset.yaml

Exemple Étape 5 : Supprimer les objets PVC et PV FlexVolume d'origine

Après avoir modifié persistentVolumeReclaimPolicy de la valeur PV FlexVolume pour Conserver dans Exemple d'étape 1 : Modifier la politique de récupération des objets PV FlexVolume existants à "Conserver" et terminé les autres étapes de cette section, vous pouvez maintenant supprimer les objets PV et PVC FlexVolume initiaux.

  1. Pour chaque objet PV FlexVolume, vous supprimez l'objet PV en entrant :

    kubectl delete pv <flexvolume-pv-name>

    Dans ce cas :

    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, vous supprimez l'objet PVC en entrant :

    kubectl delete pvc <flexvolume-pv-name>

    Dans ce cas :

    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