Migrando do Plug-in de Volume FlexVolume para o Plug-in de Volume CSI
Descubra como migrar uma carga de trabalho do Kubernetes (gerenciada por um StatefulSet) do plug-in de volume FlexVolume para o plug-in de volume CSI.
- O projeto upstream do Kubernetes descontinua o plug-in de volume FlexVolume no Kubernetes versão 1.23.
- A nova funcionalidade só está sendo adicionada ao plug-in de volume CSI, não ao FlexVolume.
- O plug-in de volume CSI não requer acesso às dependências subjacentes do sistema operacional e do sistema de arquivos raiz.
No Kubernetes, uma maneira de gerenciar aplicativos com monitoramento de estado que exigem armazenamento persistente é usar objetos StatefulSet. Para obter mais informações sobre objetos StatefulSet, consulte StatefulSets na documentação do Kubernetes.
Se você tiver um aplicativo com monitoramento de estado que exija armazenamento persistente e o StatefulSet que gerencia o aplicativo estiver usando no momento o plug-in de volume FlexVolume para provisionar um volume persistente, recomendamos que você migre a carga de trabalho para usar o plug-in de volume CSI.
Esta seção fornece etapas genéricas para migrar uma carga de trabalho (gerenciada por um StatefulSet) do plug-in de volume FlexVolume para o plug-in de volume CSI, da seguinte forma:
- Etapa 1: Altere a política de recuperação de objetos PV FlexVolume existentes para "Reter"
- Etapa 2: Criar novos objetos CSI PV e vinculá-los a volumes em blocos
- Etapa 3: Criar novos objetos CSI PVC e vinculá-los aos objetos CSI PV
- Etapa 4: Recrie o objeto StatefulSet para usar os novos objetos CSI PVC
- Etapa 5: Excluir os objetos PVC e PV FlexVolume originais
Esta seção também inclui um exemplo totalmente trabalhado, para que você possa ver as etapas na prática. Consulte Exemplo de migração de uma carga de trabalho do plug-in de volume FlexVolume para o plug-in de volume CSI.
Observe que nesta seção:
- Volumes persistentes e reivindicações de volume persistente criadas pelo plug-in de volume FlexVolume são chamados de PVs FlexVolume e PVCs FlexVolume, respectivamente.
- Volumes persistentes e reivindicações de volume persistentes criadas pelo plug-in de volume CSI são chamados de PVs CSI e PVCs CSI, respectivamente.
Etapa 1: Altere a política de recuperação de objetos PV FlexVolume existentes para "Reter"
-
Descubra os nomes dos PVs FlexVolume vinculados às PVCs FlexVolume no StatefulSet digitando:
kubectl get pvc
-
Altere a política de recuperação dos objetos PV FlexVolume existentes para
Retain
para impedir que os volumes em blocos que suportam os PVs sejam excluídos durante a migração, digitando:kubectl patch pv <volume-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
-
Confirme se cada PV FlexVolume foi atualizado digitando:
kubectl get pv <volume-name>
-
Verifique se a saída mostra que a política de reivindicação foi definida como Reter para cada PV FlexVolume.
Importante
Verifique novamente se a política de reivindicação foi definida como Reter para cada PV FlexVolume. Se a política de recuperação não estiver definida como Reter, o volume em blocos que suporta o PV FlexVolume será excluído durante a migração.
Etapa 2: Criar novos objetos CSI PV e vinculá-los a volumes em blocos
- Crie um novo arquivo de manifesto PV.
-
Para cada objeto PV FlexVolume existente, copie a seguinte definição PV de modelo no arquivo para definir um novo objeto PV CSI correspondente:
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>
-
Para cada nova definição de objeto PV CSI, forneça os seguintes valores:
- Defina
metadata.name
como uma string de sua escolha para o nome do novo objeto PV CSI. - Defina
spec.capacity.storage
como a capacidade do PV FlexVolume existente. Por exemplo,50Gi
- Defina
spec.csi.fstype
como o tipo de sistema de arquivos que suporta o PV FlexVolume existente. Por exemplo,ext4
.Dica: Se você não tiver certeza do tipo de sistema de arquivos que suporta o PV FlexVolume existente, consulte os detalhes do PV FlexVolume informando:kubectl get pv <original-pv-name> -o yaml
- Defina
spec.csi.volumeHandle
como o OCID do volume em blocos original que suporta o PV FlexVolume existente. O OCID também foi usado como o nome do PV FlexVolume. Por exemplo,ocid1.volume.oc1.phx.aaaaaa______xbd
- Defina
spec.nodeAffinity.required.nodeSelectorTerms.matchExpressions.key: topology.kubernetes.io/zone.values
como o domínio de disponibilidade para o CSI PV, com base no valor do Flex PVfailure-domain.beta.kubernetes.io/zone
. Por exemplo,PHX-AD-1
.Dica: Se você não tiver certeza do valor dofailure-domain.beta.kubernetes.io/zone
do Flex PV existente, consulte os detalhes do FlexVolume PV informando:kubectl get pv <original-pv-name> -o yaml
Observe que no modelo,
spec.storageClassName
já está definido como a classe de armazenamento usada pelo plug-in de volume CSI (oci-bv
).Por exemplo:
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
- Defina
-
Crie os novos objetos CSI PV inserindo:
kubectl apply -f <pv-manifest-filename>.yaml
-
Confirme se os novos objetos CSI PV foram criados inserindo:
kubectl get pv
-
Verifique se o resultado mostra:
- Um novo objeto PV CSI para cada objeto PV FlexVolume.
- Todos os novos objetos PV CSI têm um status de
Available
.
Etapa 3: Criar novos objetos CSI PVC e vinculá-los aos objetos CSI PV
Agora você define um novo objeto PVC CSI para cada objeto PV CSI criado na etapa anterior:
- Crie um novo arquivo de manifesto de PVC.
-
Para cada objeto PVC FlexVolume existente, copie a seguinte definição de PVC de modelo no novo arquivo para definir um novo objeto 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
- Para cada nova definição de objeto PVC CSI, forneça os seguintes valores:
- Defina
metadata.name
para especificar o nome da nova PVC CSI no seguinte formato:<new-volumeClaimTemplates.metadata.name>-<statefulset-name>-<index>
em que:
<new-volumeClaimTemplates.metadata.name>
é uma string de sua escolha para ser a primeira parte do nome da nova PVC CSI. A string especificada aqui deve ser diferente do valorvolumeClaimTemplates.metadata.name
original no manifesto StatefulSet. Na Etapa 4: Recrie o objeto StatefulSet para usar os novos objetos PVC CSI, atualize o manifesto StatefulSet e especifique essa string como o valor devolumeClaimTemplates.metadata.name
.<statefulset-name>
é o nome do StatefulSet que gerencia o aplicativo.<index>
é um número ordinal, começando em 0, e incrementado em 1 para o número de réplicas especificado em StatefulSet.
- Defina
spec.resources.requests.storage
com o mesmo valor especificado para a PVC FlexVolume. Por exemplo,50Gi
- Defina
spec.volumeName
como o nome especificado como o nome do novo objeto PV CSI na Etapa 2: Criar novos objetos PV CSI e vinculá-los a volumes em blocos.
Observe que no modelo,
spec.storageClassName
já está definido como a classe de armazenamento usada pelo plug-in de volume CSI (oci-bv
).Por exemplo:
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
- Defina
-
Crie os novos objetos CSI PVC inserindo:
kubectl apply -f <pvc-manifest-filename>.yaml
-
Confirme se os novos objetos CSI PVC foram criados e vinculados aos objetos CSI PV digitando:
kubectl get pvc
-
Verifique se o resultado mostra:
- Um objeto PVC CSI foi criado para cada objeto PVC FlexVolume.
- Todos os objetos PVC CSI têm o status
Bound
. - Cada objeto PVC CSI é vinculado ao objeto PV CSI especificado no manifesto.
Etapa 4: Recrie o objeto StatefulSet para usar os novos objetos CSI PVC
- Crie um novo manifesto StatefulSet copiando o arquivo que contém o manifesto do StatefulSet existente e salve o novo arquivo de manifesto com um novo nome.
-
Atualize o novo manifesto, para que StatefulSet use as novas PVCs CSI criadas na Etapa 3: Criar novos objetos CSI PVC e vinculá-los aos objetos CSI PV, da seguinte forma:
- Altere
spec.template.spec.containers.volumeMounts.name
para a string escolhida como a primeira parte dos novos nomes de PVC CSI. - Altere
spec.volumeClaimTemplates.metadata.name
para a string escolhida como a primeira parte dos novos nomes de PVC CSI. - Altere
spec.volumeClaimTemplates.spec.storageClassName
paraoci-bv
(a classe de armazenamento usada pelo plug-in de volume CSI).
- Altere
-
Exclua o objeto StatefulSet existente digitando:
kubectl delete statefulsets <statefulset-name>
-
Crie um novo objeto StatefulSet a partir do novo manifesto digitando:
kubectl apply -f <statefulset-manifest-filename>
Etapa 5: Excluir os objetos PVC e PV FlexVolume originais
Depois de alterar o persistentVolumeReclaimPolicy do PV FlexVolume para Reter na Etapa 1: Altere a política de recuperação de objetos PV FlexVolume existentes para "Reter" e conclua as outras etapas desta seção, agora você pode excluir os objetos PV e PVC FlexVolume originais.
-
Para cada objeto PV FlexVolume, exclua o objeto PV informando:
kubectl delete pv <flexvolume-pv-name>
-
Para cada objeto PVC FlexVolume, exclua o objeto PVC digitando:
kubectl delete pvc <flexvolume-pvc-name>
Exemplo de migração de uma carga de trabalho do plug-in de volume FlexVolume para o plug-in de volume CSI
Este exemplo mostra como migrar uma carga de trabalho de amostra do plug-in de volume FlexVolume para o plug-in de volume CSI. As instruções deste exemplo pressupõem uma carga de trabalho gerenciada por um objeto StatefulSet chamado web-app
.
Exemplo de Carga de Trabalho StatefulSet
Inicialmente, o StatefulSet usa o plug-in de volume FlexVolume para provisionar armazenamento. O StatefulSet original é definido em flex-statefulset.yaml da seguinte forma:
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
O manifesto StatefulSet original define:
- O nome de StatefulSet como
web-app
(o valor demetadata.name
). - O nome de um volumeClaimTemplate como
storage-flex
(o valor devolumeClaimTemplates.metadata.name
). - Três réplicas (o valor de
spec.replicas
).
Ao criar PVCs para um StatefulSet, o Kubernetes usa a seguinte convenção para nomear as PVCs:
<volumeClaimTemplate-name>-<StatefulSet-name>-<index>
em que:
<volumeClaimTemplate-name>
é o nome do volumeClaimTemplate especificado pelo valor devolumeClaimTemplates.metadata.name
no manifesto StatefulSet. Neste exemplo,storage-flex
.<StatefulSet-name>
é o nome do StatefulSet especificado pelo valor demetadata.name
no manifesto StatefulSet. Neste exemplo,web-app
.<index>
é um número ordinal, começando em 0, e incrementado em 1 para o número de réplicas especificado em StatefulSet. Neste exemplo, três réplicas são especificadas.
Então, quando o Kubernetes criou as PVCs FlexVolume originais para o web-app
StatefulSet, ele criou três PVCs com os seguintes nomes:
storage-flex-web-app-0
storage-flex-web-app-1
storage-flex-web-app-2
Exemplo Etapa 1: Altere a política de recuperação de objetos PV FlexVolume existentes para "Reter"
-
Você descobre os nomes dos três PVs FlexVolume vinculados às três PVCs FlexVolume no StatefulSet digitando:
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
-
Altere a política de recuperação dos três objetos FlexVolume PV existentes para
Retain
para impedir que os volumes em blocos que suportam os PVs sejam excluídos durante a migração, digitando:kubectl patch pv <volume-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
Neste exemplo:
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
-
Confirme se cada PV FlexVolume foi atualizado digitando:
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
-
Verifique se a saída mostra que a política de reivindicação foi definida como Reter para cada PV FlexVolume.
Importante
Verifique novamente se a política de reivindicação foi definida como Reter para cada PV FlexVolume. Se a política de recuperação não estiver definida como Reter, o volume em blocos que suporta o PV FlexVolume será excluído durante a migração.
Exemplo Etapa 2: Criar novos objetos CSI PV e vinculá-los a volumes em blocos
-
Você cria um novo arquivo de manifesto PV e o salva como migrated-csi-pv.yaml.
-
Para cada um dos três objetos PV FlexVolume existentes, copie a seguinte definição PV de modelo no arquivo migrated-CSI-pv.yaml para definir um novo objeto PV CSI correspondente.
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>
-
Para cada nova definição de objeto PV CSI, forneça os seguintes valores:
- Defina
metadata.name
como uma string de sua escolha para o nome do novo objeto PV CSI. Neste exemplo, você nomeia os novos objetos PV CSIcsi-pv-web-app-0
,csi-pv-web-app-1
ecsi-pv-web-app-2
. - Defina
spec.capacity.storage
como a capacidade do PV FlexVolume existente. Neste exemplo, você especifica50Gi
para todos os três novos objetos PV CSI. - Defina
spec.csi.fstype
como o tipo de sistema de arquivos que suporta o PV FlexVolume existente. Neste exemplo, você especificaext4
para todos os três novos objetos PV CSI. - Defina
spec.csi.volumeHandle
como o OCID do volume em blocos original que suporta o PV FlexVolume existente. O OCID também foi usado como o nome do objeto PV FlexVolume. Neste exemplo, você especifica os seguintes OCIDs para os três novos objetos CSI PV:ocid1.volume.oc1.phx.aaaaaa______xbd
ocid1.volume.oc1.phx.aaaaaa______xbe
ocid1.volume.oc1.phx.aaaaaa______xbf
- Defina
spec.nodeAffinity.required.nodeSelectorTerms.matchExpressions.key: topology.kubernetes.io/zone
como o domínio de disponibilidade para o CSI PV, com base no valor do Flex PVfailure-domain.beta.kubernetes.io/zone
. Neste exemplo, você especifica os seguintes domínios de disponibilidade para os três novos objetos PV CSI:PHX-AD-1
PHX-AD-2
PHX-AD-3
Após inserir as informações, o arquivo migrated-CSI-pv.yaml contém as três definições de CSI PV a seguir:
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
- Defina
-
Para criar os três novos objetos PV CSI, insira:
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
-
Você confirma que os três novos objetos CSI PV foram criados digitando:
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
-
Verifique se a saída mostra:
- Um novo objeto PV CSI para cada um dos objetos PV FlexVolume originais.
- Todos os três novos objetos PV CSI têm o status
Available
.
Exemplo Etapa 3: Criar novos objetos CSI PVC e vinculá-los aos objetos CSI PV
Agora você define um novo objeto PVC CSI para cada objeto PV CSI criado na etapa anterior:
-
Você cria um novo arquivo de manifesto de PVC e o salva como migrated-csi-pvc.yaml.
-
Para cada um dos três objetos de PVC FlexVolume existentes, copie a seguinte definição de PVC de modelo no arquivo migrated-CSI-pvc.yaml para definir um novo objeto 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
-
Para cada nova definição de objeto de PVC CSI, forneça os seguintes valores:
-
Defina
metadata.name
para especificar o nome da nova PVC CSI no seguinte formato:<new-volumeClaimTemplates.metadata.name>-<statefulset-name>-<index>
em que:
<new-volumeClaimTemplates.metadata.name>
é uma string de sua escolha para ser a primeira parte do nome da nova PVC CSI. A string especificada aqui deve ser diferente do valorvolumeClaimTemplates.metadata.name
original no manifesto StatefulSet. Em Exemplo de Etapa 4: Recrie o objeto StatefulSet para usar os novos objetos PVC CSI, atualize o manifesto StatefulSet e especifique essa string como o novo valor devolumeClaimTemplates.metadata.name
. Neste exemplo, você especificastorage-csi
.<statefulset-name>
éweb-app
(o nome do StatefulSet que gerencia o aplicativo de exemplo).<index>
é um número ordinal, começando em 0, e incrementado em 1 para o número de réplicas especificado em StatefulSet. Neste exemplo,web-app
StatefulSet especifica três réplicas.
- Você define
spec.resources.requests.storage
com o mesmo valor especificado para a PVC FlexVolume. Neste exemplo, você especifica50Gi
- Defina
spec.volumeName
como um dos nomes (csi-pv-web-app-0
,csi-pv-web-app-1
oucsi-pv-web-app-2
) especificados para os novos objetos CSI PV na Etapa de Exemplo 2: Criar novos objetos CSI PV e vinculá-los a volumes em blocos.
Após inserir as informações, o arquivo migrated-CSI-pvc.yaml contém as três definições de PVC CSI a seguir:
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
-
-
Você cria os novos objetos CSI PVC inserindo:
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
-
Você confirma que os novos objetos CSI PVC foram criados e vinculados aos objetos CSI PV digitando:
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
-
Verifique se a saída mostra:
- Um objeto PVC CSI foi criado para cada objeto PVC FlexVolume.
- Todos os três objetos CSI PVC têm o status
Bound
. - Cada objeto PVC CSI é vinculado ao objeto PV CSI especificado no manifesto.
Exemplo Etapa 4: Recrie o objeto StatefulSet para usar os novos objetos CSI PVC
- Você cria um novo manifesto StatefulSet copiando o arquivo que contém o manifesto do StatefulSet existente (flex-statefulset.yaml) e salvando o novo arquivo de manifesto como csi.statefulset.yaml.
- Você atualiza o novo manifesto em csi.statefulset.yaml, para que StatefulSet use as novas PVCs CSI criadas em Exemplo Etapa 3: Criar novos objetos CSI PVC e vinculá-los aos objetos CSI PV, da seguinte forma:
- Você altera
spec.template.spec.containers.volumeMounts.name
parastorage-csi
(a string escolhida como a primeira parte dos novos nomes de PVC CSI). - Você altera
spec.volumeClaimTemplates.metadata.name
parastorage-csi
(a string escolhida como a primeira parte dos novos nomes de PVC CSI). - Você altera
spec.volumeClaimTemplates.spec.storageClassName
paraoci-bv
(a classe de armazenamento usada pelo plug-in de volume CSI).
O novo manifesto StatefulSet em csi.statefulset.yaml agora tem a seguinte aparência:
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
- Você altera
-
Exclua o objeto
web-app
StatefulSet existente digitando:kubectl delete statefulsets web-app statefulset.apps "web-app" deleted
-
Crie um novo objeto
web-app
StatefulSet a partir do novo manifesto digitando:kubectl apply -f csi.statefulset.yaml
Exemplo Etapa 5: Excluir os objetos PVC e PV FlexVolume originais
Depois de alterar o persistentVolumeReclaimPolicy do PV FlexVolume para Reter na Etapa de Exemplo 1: Altere a política de recuperação de objetos PV FlexVolume existentes para "Reter" e conclua as outras etapas desta seção, agora você pode excluir os objetos PV e PVC FlexVolume originais.
-
Para cada objeto PV FlexVolume, exclua o objeto PV informando:
kubectl delete pv <flexvolume-pv-name>
Neste exemplo:
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
-
Para cada objeto PVC FlexVolume, exclua o objeto PVC digitando:
kubectl delete pvc <flexvolume-pv-name>
Neste exemplo:
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