Vom Volume-Plug-in FlexVolume zum CSI-Volume-Plug-in migrieren

Erfahren Sie, wie Sie eine Kubernetes-Workload (von einer StatefulSet verwaltet) vom Volume-Plug-in FlexVolume in das CSI-Volume-Plug-in migrieren.

Sie können Cluster mit dem CSI-Volume-Plug-in oder dem Volume-Plug-in FlexVolume mit Block-Volumes aus dem Block-Volume-Service verbinden. Oracle empfiehlt jedoch die Verwendung des CSI-Volume Plug-ins aus folgenden Gründen:
  • Das Upstream-Kubernetes-Projekt setzt das Volume-Plug-in FlexVolume in Kubernetes-Version 1.23 außer Kraft.
  • Neue Funktionalität wird nur dem CSI-Volume-Plug-in hinzugefügt, nicht dem Volume-Plug-in FlexVolume.
  • Das CSI-Volume-Plug-in setzt keinen Zugriff auf zugrunde liegende Betriebssystem- und Root-Dateisystemabhängigkeiten voraus.

In Kubernetes können Sie zustandsbehaftete Anwendungen, die persistenten Speicher erfordern, mit StatefulSet-Objekten verwalten. Weitere Informationen zu StatefulSet-Objekten finden Sie in der Kubernetes-Dokumentation unter StatefulSets.

Wenn eine zustandsbehaftete Anwendung persistenten Speicher erfordert und die StatefulSet, die die Anwendung verwaltet, derzeit das Volume-Plug-in FlexVolume zum Provisioning eines persistenten Volumes verwendet, wird empfohlen, dass Sie die Workload migrieren, um stattdessen das CSI-Volume-Plug-in zu verwenden.

Dieser Abschnitt enthält allgemeine Schritte zum Migrieren einer Workload (die von einer StatefulSet verwaltet wird) vom Volume-Plug-in FlexVolume zum CSI-Volume-Plug-in wie folgt:

Dieser Abschnitt enthält auch ein vollständig bearbeitetes Beispiel, sodass Sie die Schritte in der Praxis sehen können. Siehe Beispiel für die Migration einer Workload vom Volume-Plug-in FlexVolume zum CSI-Volume-Plug-in.

Beachten Sie Folgendes in diesem Abschnitt:

  • Persistente Volumes und Persistent Volume Claims, die vom Volume-Plug-in FlexVolume erstellt werden, werden als FlexVolume PVs bzw. FlexVolume PVCs bezeichnet.
  • Persistente Volumes und Persistent Volume Claims, die durch das CSI Volume Plugin erstellt werden, werden als CSI PVs bzw. CSI PVCs bezeichnet.

Schritt 1: Ändern Sie die Wiederherstellungs-Policy vorhandener FlexVolume PV-Objekte in "Beibehalten".

  1. Ermitteln Sie die Namen der FlexVolume-PVs, die an die FlexVolume-PVCs in der StatefulSet gebunden sind, indem Sie Folgendes eingeben:

    kubectl get pvc
  2. Ändern Sie die Reclaim Policy der vorhandenen FlexVolume PV-Objekte in Retain, um zu verhindern, dass die Block-Volumes, die PVs unterstützen, während der Migration gelöscht werden, indem Sie Folgendes eingeben:

    kubectl patch pv <volume-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
  3. Bestätigen Sie, dass jede FlexVolume PV aktualisiert wurde, indem Sie Folgendes eingeben:

    kubectl get pv <volume-name>
  4. Stellen Sie sicher, dass die Ausgabe anzeigt, dass die Wiederherstellungs-Policy für jeden FlexVolume-PV auf "Beibehalten" gesetzt wurde.

    Wichtig

    Überprüfen Sie, ob die Rückforderungs-Policy für jeden FlexVolume-PV auf "Beibehalten" gesetzt wurde. Wenn die Wiederherstellungs-Policy nicht auf "Beibehalten" gesetzt ist, wird das Block-Volume, das die PV FlexVolume unterstützt, während der Migration gelöscht.

Schritt 2: Neue CSI PV-Objekte erstellen und an Block-Volumes binden

  1. Neue PV-Manifestdatei erstellen.
  2. Kopieren Sie für jedes vorhandene FlexVolume PV-Objekt die folgende PV-Vorlagendefinition in die Datei, um ein entsprechendes neues CSI PV-Objekt zu definieren:

    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. Geben Sie für jede neue CSI PV-Objektdefinition Werte wie folgt an:

    • Setzen Sie metadata.name auf eine Zeichenfolge Ihrer Wahl für den Namen des neuen CSI-PV-Objekts.
    • Setzen Sie spec.capacity.storage auf die vorhandene Kapazität von FlexVolume PV. Beispiel: 50Gi
    • Setzen Sie spec.csi.fstype auf den Typ des Dateisystems, das die vorhandene FlexVolume PV unterstützt. Beispiel: ext4 .
      Tipp: Wenn Sie sich nicht sicher sind, welcher Dateisystemtyp das vorhandene FlexVolume PV sichert, geben Sie Folgendes ein:
      kubectl get pv <original-pv-name> -o yaml
    • Setzen Sie spec.csi.volumeHandle auf die OCID des ursprünglichen Block-Volumes, das die vorhandene PV FlexVolume unterstützt. Die OCID wurde auch als Name des PV FlexVolume verwendet. Beispiel: ocid1.volume.oc1.phx.aaaaaa______xbd
    • Setzen Sie spec.nodeAffinity.required.nodeSelectorTerms.matchExpressions.key: topology.kubernetes.io/zone.values auf die Availability-Domain für die CSI-PV, basierend auf dem Wert von failure-domain.beta.kubernetes.io/zone der Flex-PV. Beispiel: PHX-AD-1.
      Tipp: Wenn Sie sich nicht sicher sind, welchen Wert die vorhandene failure-domain.beta.kubernetes.io/zone von Flex PV hat, lesen Sie die Details der PV FlexVolume, indem Sie Folgendes eingeben:
      kubectl get pv <original-pv-name> -o yaml

    Beachten Sie, dass in der Vorlage spec.storageClassName bereits auf die Speicherklasse festgelegt ist, die vom CSI-Volume-Plug-in (oci-bv) verwendet wird.

    Beispiel:

    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. Erstellen Sie die neuen CSI PV-Objekte, indem Sie Folgendes eingeben:

    kubectl apply -f <pv-manifest-filename>.yaml
  5. Bestätigen Sie, dass die neuen CSI PV-Objekte erstellt wurden, indem Sie Folgendes eingeben:

    kubectl get pv
  6. Prüfen Sie, ob die Ausgabe wie folgt angezeigt wird:

    • Ein neues CSI PV-Objekt für jedes FlexVolume PV-Objekt.
    • Alle neuen CSI-PV-Objekte haben den Status Available.

Schritt 3: Neue CSI-PVC-Objekte erstellen und an die CSI-PV-Objekte binden

Sie definieren jetzt ein neues CSI PVC-Objekt für jedes CSI PV-Objekt, das Sie im vorherigen Schritt erstellt haben:

  1. Neue PVC-Manifestdatei erstellen.
  2. Kopieren Sie für jedes vorhandene FlexVolume PVC-Objekt die folgende PVC-Vorlagendefinition in die neue Datei, um ein neues CSI PVC-Objekt zu definieren:

    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. Geben Sie für jede neue CSI PVC-Objektdefinition Werte wie folgt an:
    • Legen Sie metadata.name fest, um den Namen für den neuen CSI-PVC im folgenden Format anzugeben:
      <new-volumeClaimTemplates.metadata.name>-<statefulset-name>-<index>

      Hierbei gilt:

      • <new-volumeClaimTemplates.metadata.name> ist eine Zeichenfolge Ihrer Wahl, die der erste Teil des Namens für das neue CSI-PVC ist. Die hier angegebene Zeichenfolge muss sich vom ursprünglichen volumeClaimTemplates.metadata.name-Wert im Manifest StatefulSet unterscheiden. In Schritt 4: StatefulSet-Objekt für die Verwendung der neuen CSI-PVC-Objekte neu erstellen aktualisieren Sie das Manifest StatefulSet und geben diese Zeichenfolge als Wert von volumeClaimTemplates.metadata.name an.
      • <statefulset-name> ist der Name des StatefulSet, der die Anwendung verwaltet.
      • <index> ist eine Ordnungszahl, die bei 0 beginnt und für die in StatefulSet angegebene Anzahl von Replikaten um 1 erhöht wird.
    • Setzen Sie spec.resources.requests.storage auf denselben Wert wie für das PVC FlexVolume angegeben. Beispiel: 50Gi
    • Setzen Sie spec.volumeName auf den Namen, den Sie unter Schritt 2: Neue CSI-PV-Objekte erstellen und an Block-Volumes binden als Namen des neuen CSI-PV-Objekts angegeben haben.

    Beachten Sie, dass in der Vorlage spec.storageClassName bereits auf die Speicherklasse festgelegt ist, die vom CSI-Volume-Plug-in (oci-bv) verwendet wird.

    Beispiel:

    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. Erstellen Sie die neuen CSI-PVC-Objekte, indem Sie Folgendes eingeben:

    kubectl apply -f <pvc-manifest-filename>.yaml
  5. Stellen Sie sicher, dass die neuen CSI-PVC-Objekte erstellt und an die CSI-PV-Objekte gebunden wurden, indem Sie Folgendes eingeben:

    kubectl get pvc
  6. Prüfen Sie, ob die Ausgabe wie folgt angezeigt wird:

    • Für jedes PVC-Objekt FlexVolume wurde ein CSI-PVC-Objekt erstellt.
    • Alle CSI-PVC-Objekte haben den Status Bound.
    • Jedes CSI PVC-Objekt ist an das im Manifest angegebene CSI PV-Objekt gebunden.

Schritt 4: Erstellen Sie das Objekt StatefulSet neu, um die neuen CSI-PVC-Objekte zu verwenden

  1. Erstellen Sie ein neues StatefulSet-Manifest, indem Sie die Datei mit dem Manifest des vorhandenen StatefulSet kopieren, und speichern Sie die neue Manifestdatei unter einem neuen Namen.
  2. Aktualisieren Sie das neue Manifest, sodass StatefulSet die neuen CSI-PVCs verwendet, die Sie in Schritt 3: Neue CSI-PVC-Objekte erstellen und an die CSI-PV-Objekte binden erstellt haben:

    • Ändern Sie spec.template.spec.containers.volumeMounts.name in die Zeichenfolge, die Sie als ersten Teil der neuen CSI-PVC-Namen ausgewählt haben.
    • Ändern Sie spec.volumeClaimTemplates.metadata.name in die Zeichenfolge, die Sie als ersten Teil der neuen CSI-PVC-Namen ausgewählt haben.
    • Ändern Sie spec.volumeClaimTemplates.spec.storageClassName in oci-bv (die vom CSI-Volume-Plug-in verwendete Speicherklasse).
  3. Löschen Sie das vorhandene StatefulSet-Objekt, indem Sie Folgendes eingeben:

    kubectl delete statefulsets <statefulset-name>
  4. Erstellen Sie ein neues StatefulSet-Objekt aus dem neuen Manifest, indem Sie Folgendes eingeben:

    kubectl apply -f <statefulset-manifest-filename>

Schritt 5: Löschen Sie die ursprünglichen FlexVolume PVC- und PV-Objekte

Having changed the FlexVolume PV's persistentVolumeReclaimPolicy to Retain in Step 1: Change the reclaim policy of existing FlexVolume PV objects to "Retain", and completed the other steps in this section, you can now delete the original FlexVolume PV and PVC objects.

  1. Löschen Sie für jedes FlexVolume PV-Objekt das PV-Objekt, indem Sie Folgendes eingeben:

    kubectl delete pv <flexvolume-pv-name>
  2. Löschen Sie für jedes PVC-Objekt des Typs FlexVolume das PVC-Objekt, indem Sie Folgendes eingeben:

    kubectl delete pvc <flexvolume-pvc-name>

Beispiel für die Migration einer Workload vom Volume-Plug-in FlexVolume zum CSI-Volume-Plug-in

In diesem Beispiel wird gezeigt, wie Sie eine Beispiel-Workload vom Volume-Plug-in FlexVolume zum CSI-Volume-Plug-in migrieren. Die Anweisungen in diesem Beispiel setzen eine Workload voraus, die von einem StatefulSet-Objekt namens web-app verwaltet wird.

Beispiel für StatefulSet-Workload

Anfangs verwendet StatefulSet das Volume-Plug-in FlexVolume, um Speicher bereitzustellen. Das ursprüngliche StatefulSet wird wie folgt in flex-statefulset.yaml definiert:

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

Das ursprüngliche StatefulSet-Manifest definiert:

  • Der Name von StatefulSet als web-app (Wert von metadata.name).
  • Der Name einer volumeClaimTemplate als storage-flex (Wert von volumeClaimTemplates.metadata.name).
  • Drei Replikate (Wert von spec.replicas).

Beim Erstellen von PVCs für eine StatefulSet verwendet Kubernetes die folgende Konvention, um die PVCs zu benennen:

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

Hierbei gilt:

  • <volumeClaimTemplate-name> ist der Name des volumeClaimTemplate, der durch den Wert von volumeClaimTemplates.metadata.name im Manifest StatefulSet angegeben wird. In diesem Beispiel storage-flex.
  • <StatefulSet-name> ist der Name des StatefulSet, der durch den Wert von metadata.name im Manifest StatefulSet angegeben wird. In diesem Beispiel gilt web-app.
  • <index> ist eine Ordnungszahl, die bei 0 beginnt und für die in StatefulSet angegebene Anzahl von Replikaten um 1 erhöht wird. In diesem Beispiel werden drei Replikate angegeben.

Als Kubernetes also die ursprünglichen FlexVolume-PVCs für die web-app StatefulSet erstellt hat, wurden drei PVCs mit den folgenden Namen erstellt:

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

Beispielschritt 1: Ändern Sie die Wiederherstellungs-Policy vorhandener FlexVolume-PV-Objekte in "Beibehalten".

  1. Sie ermitteln die Namen der drei FlexVolume-PVs, die an die drei FlexVolume-PVCs in StatefulSet gebunden sind, indem Sie Folgendes eingeben:

    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. Sie ändern die Rückforderungs-Policy der vorhandenen drei FlexVolume-PV-Objekte in Retain, um zu verhindern, dass die Block-Volumes, die PVs unterstützen, während der Migration gelöscht werden, indem Sie Folgendes eingeben:

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

    In diesem Beispiel gilt:

    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. Bestätigen Sie, dass jede FlexVolume PV aktualisiert wurde, indem Sie Folgendes eingeben:

    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. Prüfen Sie, ob die Ausgabe zeigt, dass die Reclaim-Policy für jeden FlexVolume-PV auf "Beibehalten" gesetzt wurde.

    Wichtig

    Überprüfen Sie, ob die Rückforderungs-Policy für jeden FlexVolume-PV auf "Beibehalten" gesetzt wurde. Wenn die Wiederherstellungs-Policy nicht auf "Beibehalten" gesetzt ist, wird das Block-Volume, das die PV FlexVolume unterstützt, während der Migration gelöscht.

Beispielschritt 2: Neue CSI-PV-Objekte erstellen und an Block-Volumes binden

  1. Sie erstellen eine neue PV-Manifestdatei und speichern sie als migrated-csi-pv.yaml.

  2. Für jedes der drei vorhandenen FlexVolume PV-Objekte kopieren Sie die folgende PV-Vorlagendefinition in die Datei migrated-CSI-pv.yaml, um ein entsprechendes neues CSI PV-Objekt zu definieren.

    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. Für jede neue CSI PV-Objektdefinition geben Sie folgende Werte an:

    • Setzen Sie metadata.name auf eine Zeichenfolge Ihrer Wahl für den Namen des neuen CSI-PV-Objekts. In diesem Beispiel benennen Sie die neuen CSI-PV-Objekte csi-pv-web-app-0, csi-pv-web-app-1 und csi-pv-web-app-2.
    • Setzen Sie spec.capacity.storage auf die vorhandene Kapazität von FlexVolume PV. In diesem Beispiel geben Sie 50Gi für alle drei neuen CSI PV-Objekte an.
    • Setzen Sie spec.csi.fstype auf den Typ des Dateisystems, das die vorhandene FlexVolume PV unterstützt. In diesem Beispiel geben Sie ext4 für alle drei neuen CSI PV-Objekte an.
    • Setzen Sie spec.csi.volumeHandle auf die OCID des ursprünglichen Block-Volumes, das die vorhandene PV FlexVolume unterstützt. Die OCID wurde auch als Name des PV-Objekts FlexVolume verwendet. In diesem Beispiel geben Sie die folgenden OCIDs für die drei neuen CSI-PV-Objekte an:
      • ocid1.volume.oc1.phx.aaaaaa______xbd
      • ocid1.volume.oc1.phx.aaaaaa______xbe
      • ocid1.volume.oc1.phx.aaaaaa______xbf
    • Setzen Sie spec.nodeAffinity.required.nodeSelectorTerms.matchExpressions.key: topology.kubernetes.io/zone auf die Availability-Domain für die CSI-PV, basierend auf dem Wert von failure-domain.beta.kubernetes.io/zone der Flex-PV. In diesem Beispiel geben Sie die folgenden Availability-Domains für die drei neuen CSI PV-Objekte an:
      • PHX-AD-1
      • PHX-AD-2
      • PHX-AD-3

    Nach Eingabe der Informationen enthält die Datei migrated-CSI-pv.yaml die folgenden drei CSI-PV-Definitionen:

    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. Sie erstellen die drei neuen CSI PV-Objekte, indem Sie Folgendes eingeben:

    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. Sie bestätigen, dass die drei neuen CSI PV-Objekte erstellt wurden, indem Sie Folgendes eingeben:

    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. Sie prüfen, ob die Ausgabe Folgendes zeigt:

    • Ein neues CSI PV-Objekt für jedes der ursprünglichen FlexVolume PV-Objekte.
    • Alle drei neuen CSI-PV-Objekte haben den Status Available.

Beispielschritt 3: Neue CSI-PVC-Objekte erstellen und an die CSI-PV-Objekte binden

Sie definieren jetzt ein neues CSI PVC-Objekt für jedes CSI PV-Objekt, das Sie im vorherigen Schritt erstellt haben:

  1. Sie erstellen eine neue PVC-Manifestdatei und speichern sie als migrated-csi-pvc.yaml.

  2. Für jedes der drei vorhandenen PVC-Objekte FlexVolume kopieren Sie die folgende PVC-Vorlagendefinition in die Datei migrated-CSI-pvc.yaml, um ein neues CSI-PVC-Objekt zu definieren.

    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. Für jede neue CSI PVC-Objektdefinition geben Sie folgende Werte an:

    • Sie legen metadata.name fest, um den Namen für den neuen CSI-PVC im folgenden Format anzugeben:

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

      Hierbei gilt:

      • <new-volumeClaimTemplates.metadata.name> ist eine Zeichenfolge Ihrer Wahl, die der erste Teil des Namens für das neue CSI-PVC ist. Die hier angegebene Zeichenfolge muss sich vom ursprünglichen volumeClaimTemplates.metadata.name-Wert im Manifest StatefulSet unterscheiden. In Beispielschritt 4: StatefulSet-Objekt für die Verwendung der neuen CSI-PVC-Objekte neu erstellen aktualisieren Sie das Manifest StatefulSet und geben diese Zeichenfolge als neuen Wert von volumeClaimTemplates.metadata.name an. In diesem Beispiel geben Sie storage-csi an.
      • <statefulset-name> ist web-app (der Name von StatefulSet, der die Beispielanwendung verwaltet).
      • <index> ist eine Ordnungszahl, die bei 0 beginnt und für die in StatefulSet angegebene Anzahl von Replikaten um 1 erhöht wird. In diesem Beispiel gibt web-app StatefulSet drei Replikate an.
    • Sie setzen spec.resources.requests.storage auf denselben Wert wie für das PVC FlexVolume angegeben. In diesem Beispiel geben Sie 50Gi an.
    • Sie setzen spec.volumeName auf einen der Namen (csi-pv-web-app-0, csi-pv-web-app-1 oder csi-pv-web-app-2), den Sie für die neuen CSI-PV-Objekte in Beispielschritt 2: Neue CSI-PV-Objekte erstellen und an Block-Volumes binden angegeben haben.

    Nach Eingabe der Informationen enthält die Datei migrated-CSI-pvc.yaml die folgenden drei CSI-PVC-Definitionen:

    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. Sie erstellen die neuen CSI-PVC-Objekte, indem Sie Folgendes eingeben:

    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. Sie bestätigen, dass die neuen CSI-PVC-Objekte erstellt und an die CSI-PV-Objekte gebunden wurden, indem Sie Folgendes eingeben:

    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. Sie prüfen, ob die Ausgabe Folgendes zeigt:

    • Für jedes PVC-Objekt FlexVolume wurde ein CSI-PVC-Objekt erstellt.
    • Alle drei CSI-PVC-Objekte haben den Status Bound.
    • Jedes CSI PVC-Objekt ist an das im Manifest angegebene CSI PV-Objekt gebunden.

Beispielschritt 4: Erstellen Sie das Objekt StatefulSet neu, um die neuen CSI-PVC-Objekte zu verwenden

  1. Sie erstellen ein neues StatefulSet-Manifest, indem Sie die Datei mit dem Manifest des vorhandenen StatefulSet (flex-statefulset.yaml) kopieren und die neue Manifestdatei als csi.statefulset.yaml speichern.
  2. Sie aktualisieren das neue Manifest in csi.statefulset.yaml, sodass StatefulSet die neuen CSI-PVCs verwendet, die Sie in Beispielschritt 3: Neue CSI-PVC-Objekte erstellen und an die CSI-PV-Objekte binden erstellt haben:
    • Sie ändern spec.template.spec.containers.volumeMounts.name in storage-csi (die Zeichenfolge, die Sie als ersten Teil der neuen CSI-PVC-Namen ausgewählt haben).
    • Sie ändern spec.volumeClaimTemplates.metadata.name in storage-csi (die Zeichenfolge, die Sie als ersten Teil der neuen CSI-PVC-Namen ausgewählt haben).
    • Sie ändern spec.volumeClaimTemplates.spec.storageClassName in oci-bv (die vom CSI-Volume-Plug-in verwendete Speicherklasse).

    Das neue StatefulSet-Manifest in csi.statefulset.yaml sieht jetzt wie folgt aus:

    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. Löschen Sie das vorhandene web-app StatefulSet-Objekt, indem Sie Folgendes eingeben:

    kubectl delete statefulsets web-app
    
    statefulset.apps "web-app" deleted
  4. Erstellen Sie ein neues web-app StatefulSet-Objekt aus dem neuen Manifest, indem Sie Folgendes eingeben:

    kubectl apply -f csi.statefulset.yaml

Beispielschritt 5: Löschen Sie die ursprünglichen PVC- und PV-Objekte FlexVolume

Having changed the FlexVolume PV's persistentVolumeReclaimPolicy to Retain in Example Step 1: Change the reclaim policy of existing FlexVolume PV objects to "Retain", and completed the other steps in this section, you can now delete the original FlexVolume PV and PVC objects.

  1. Löschen Sie für jedes FlexVolume PV-Objekt das PV-Objekt, indem Sie Folgendes eingeben:

    kubectl delete pv <flexvolume-pv-name>

    In diesem Beispiel gilt:

    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. Löschen Sie für jedes FlexVolume PVC-Objekt das PVC-Objekt, indem Sie Folgendes eingeben:

    kubectl delete pvc <flexvolume-pv-name>

    In diesem Beispiel gilt:

    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