Aprovisionamiento de PVC en el servicio Block Volume

Descubra cómo aprovisionar reclamaciones de volumen persistentes para clusters que ha creado mediante Container Engine for Kubernetes (OKE) asociando volúmenes del servicio Block Volume.

El servicio Oracle Cloud Infrastructure - Volumen en bloque (servicio Volumen en bloque) proporciona almacenamiento en bloque persistente, duradero y de alto rendimiento para los datos. Puede utilizar el plugin de volumen CSI o el plugin de volumen FlexVolume para conectar clusters a volúmenes desde el servicio Volumen en bloque. Oracle recomienda utilizar el plugin de volumen CSI porque:
  • La nueva funcionalidad solo se está agregando al plugin de volumen CSI, no al plugin de volumen FlexVolume (aunque los desarrolladores de Kubernetes seguirán manteniendo el plugin de volumen FlexVolume).
  • El plugin de volumen CSI no requiere acceso a dependencias subyacentes del sistema operativo y del sistema de archivos raíz.
Nota

El proyecto de Kubernetes ascendente está dejando de utilizar el plugin de volumen FlexVolume en la versión 1.23 de Kubernetes. La eliminación de la función se ajustará a las directrices de la política de desuso de Kubernetes.

El StorageClass especificado para un PVC controla qué plugin de volumen se debe utilizar para conectarse a los volúmenes del servicio Volumen en bloque. Por defecto, se definen dos clases de almacenamiento: oci-bv para el plugin de volumen CSI y oci para el plugin FlexVolume. Si no especifica explícitamente un valor para storageClassName en el archivo yaml que define la PVC, se utilizará la clase de almacenamiento por defecto del cluster. La clase de almacenamiento por defecto del cluster se define inicialmente según la versión de Kubernetes especificada cuando se creó el cluster, de la siguiente manera:

  • En los clusters creados por Container Engine for Kubernetes para ejecutar la versión 1.24 (o posterior) de Kubernetes, la clase de almacenamiento oci-bv se define inicialmente como la clase por defecto. El plugin de volumen CSI utiliza la clase de almacenamiento oci-bv.
  • En los clusters creados por Container Engine for Kubernetes para ejecutar la versión 1.23 (o anterior) de Kubernetes, la clase de almacenamiento oci se define inicialmente como la clase por defecto. El plugin de volumen FlexVolume utiliza la clase de almacenamiento oci.
Nota

En los clusters creados originalmente por Container Engine for Kubernetes para ejecutar la versión 1.23 (o anterior) de Kubernetes y, posteriormente, actualizados a la versión 1.24 (o posterior) de Kubernetes, la clase de almacenamiento por defecto no se cambia durante el proceso de actualización. Por lo tanto, si la clase de almacenamiento por defecto era oci antes de la actualización, la clase de almacenamiento por defecto sigue siendo oci después de la actualización.

Si desea que oci-bv en lugar de oci sea la clase de almacenamiento por defecto de un cluster que ha actualizado de la versión 1.23 (o anterior) de Kubernetes a la versión 1.24 (o posterior) de Kubernetes, cambie la clase de almacenamiento por defecto de la siguiente forma:

  1. Especifique que oci no es la clase de almacenamiento por defecto introduciendo:
    kubectl patch storageclass oci -p '{"metadata": {"annotations": {"storageclass.beta.kubernetes.io/is-default-class":"false"}}}'
  2. Especifique que oci-bv es la clase de almacenamiento por defecto introduciendo:
    kubectl patch storageclass oci-bv -p '{"metadata": {"annotations": {"storageclass.kubernetes.io/is-default-class":"true"}}}'

En el caso del plugin de volumen CSI, la función de topología CSI garantiza que los nodos y volúmenes de trabajador estén ubicados en el mismo dominio de disponibilidad. En el caso del plugin de volumen FlexVolume, puede utilizar el elemento matchLabels para seleccionar el dominio de disponibilidad en el que se aprovisiona una reclamación de volumen persistente. Tenga en cuenta que no se utiliza el elemento matchLabels con el plugin de volumen CSI.

Independientemente del plugin de volumen que elija utilizar, si un cluster está en un compartimento diferente a sus nodos de trabajador, debe crear una política adicional para permitir el acceso a los volúmenes del servicio Block Volume. Esta situación surge cuando la subred especificada para un pool de nodos pertenece a un compartimento diferente del cluster. Para permitir que los nodos de trabajador accedan a los volúmenes del servicio Block Volume, cree la política adicional con las siguientes sentencias de política:

  • ALLOW any-user to manage volumes in TENANCY where request.principal.type = 'cluster'
  • ALLOW any-user to manage volume-attachments in TENANCY where request.principal.type = 'cluster'

Para especificar explícitamente el plugin de volumen que se utilizará para conectarse al servicio Volumen en bloque al provisionar una reclamación de volumen persistente, especifique un valor para storageClassName en el archivo yaml que define la PVC:

  • para utilizar el plugin de volumen CSI, especifique storageClassName: "oci-bv"
  • para utilizar el plugin de volumen FlexVolume, especifique storageClassName: "oci"

Tenga en cuenta lo siguiente:

  • La cantidad mínima de almacenamiento persistente que puede solicitar una PVC es de 50 gigabytes. Si la solicitud es para menos de 50 gigabytes, se redondea hasta 50 gigabytes.
  • Si desea poder aumentar la cantidad de almacenamiento persistente que puede solicitar una PVC, defina allowVolumeExpansion: true en la definición de la clase de almacenamiento especificada para la PVC. Consulte Ampliación de un volumen en bloque.
  • Al crear un cluster, puede definir etiquetas para aplicarlas a los volúmenes en bloque creados cuando se definen reclamaciones de volúmenes persistentes (PVC). El etiquetado permite agrupar recursos diversos en compartimentos y, además, permite anotar recursos con sus propios metadatos. Consulte Aplicación de etiquetas a volúmenes en bloque.
  • Después de crear una PVC en un nuevo volumen en bloque mediante el plugin de volumen CSI, puede ver estadísticas de capacidad para el volumen en bloque mediante una herramienta de agregación de métricas (como Prometheus), que incluye:
    • kubelet_volume_stats_available_bytes
    • kubelet_volume_stats_capacity_bytes
    • kubelet_volume_stats_inodes
    • kubelet_volume_stats_inodes_free
    • kubelet_volume_stats_inodes_used
    • kubelet_volume_stats_used_bytes

Creación de una PVC en un volumen en bloque mediante el plugin de volumen CSI

Puede aprovisionar dinámicamente un volumen en bloque mediante el plugin CSI especificado por la definición de la clase de almacenamiento oci-bv (provisioner: blockvolume.csi.oraclecloud.com). Por ejemplo, si el administrador del cluster no ha creado ningún PV adecuado que coincida con la solicitud de PVC.

Se define una PVC en un archivo llamado csi-bvs-pvc.yaml. Por ejemplo:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mynginxclaim
spec:
  storageClassName: "oci-bv"
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi

Introduzca el siguiente comando para crear la PVC a partir del archivo csi-bvs-pvc.yaml:

kubectl create -f  csi-bvs-pvc.yaml

La salida del comando anterior confirma la creación de la PVC.

persistentvolumeclaim "mynginxclaim" created

Verifique que la PVC se haya creado ejecutando kubectl get pvc:

kubectl get pvc

La salida del comando anterior muestra el estado actual de la PVC:

		
NAME               STATUS   VOLUME   CAPACITY   ACCESSMODES   STORAGECLASS   AGE
mynginxclaim       Pending                                    oci-bv         4m

La PVC tiene el estado Pending porque la definición de la clase de almacenamiento oci-bv incluye volumeBindingMode: WaitForFirstConsumer.

Puede utilizar esta PVC al crear otros objetos, como pods. Por ejemplo, puede crear un nuevo pod a partir de la siguiente definición de pod, que indica al sistema que utilice la PVC mynginxclaim como volumen nginx, montado por el pod en /data.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - name: http
          containerPort: 80
      volumeMounts:
        - name: data
          mountPath: /usr/share/nginx/html
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: mynginxclaim

Tras crear el nuevo pod, puede verificar que la PVC se haya enlazado a un nuevo volumen persistente introduciendo:

kubectl get pvc

La salida del comando anterior confirma que la PVC se ha enlazado:

			
NAME               STATUS    VOLUME                               CAPACITY   ACCESSMODES   STORAGECLASS   AGE
mynginxclaim       Bound     ocid1.volume.oc1.iad.<unique_ID>     50Gi       RWO           oci-bv         4m

Puede verificar que el pod está utilizando la nueva reclamación de volumen persistente introduciendo:

kubectl describe pod nginx

Puede ver las estadísticas de capacidad del nuevo volumen persistente mediante una herramienta de agregación de métricas como Prometheus.

Creación de una instantánea de volumen a partir de una copia de seguridad de volumen en bloque mediante el plugin de volumen CSI

Una instantánea de volumen de Kubernetes es una instantánea de un volumen persistente en un sistema de almacenamiento. Puede utilizar una instantánea de volumen para aprovisionar un nuevo volumen persistente. Para obtener más información sobre las instantáneas de volumen de Kubernetes, consulte Instantáneas de volumen en la documentación de Kubernetes.

Al utilizar el plugin de volumen CSI para conectar clusters a volúmenes en bloque en el servicio Volumen en bloque, puede utilizar copias de seguridad de volumen en bloque para aprovisionar instantáneas de volumen de Kubernetes. Puede utilizar una instantánea de volumen para crear un nuevo volumen en bloque y rellenarlo previamente con datos de la copia de seguridad de volumen en bloque. Para obtener más información sobre las copias de seguridad de volumen en bloque en el servicio de volumen en bloque, consulte Descripción general de copias de seguridad de volumen en bloque.

Puede utilizar el plugin de volumen CSI para aprovisionar una instantánea de volumen de una de las dos maneras siguientes:

  • Dinámicamente: puede solicitar la creación de una copia de seguridad del volumen en bloque que aprovisiona un volumen persistente. Especifique la reclamación de volumen persistente mediante el objeto VolumeSnapshot y especifique los parámetros que se utilizarán para crear la copia de seguridad de volumen en bloque mediante el objeto VolumeSnapshotClass. Las instantáneas de volúmenes aprovisionadas dinámicamente también se denominan instantáneas de volúmenes dinámicos. Consulte Creación de instantáneas de volumen aprovisionadas dinámicamente.
  • Estáticamente: puede proporcionar detalles de una copia de seguridad de volumen en bloque existente mediante el objeto VolumeSnapshotContent. Las instantáneas de volúmenes aprovisionadas estáticamente también se conocen como instantáneas de volúmenes estáticos y como instantáneas de volúmenes aprovisionadas previamente. Creación de instantáneas de volumen aprovisionadas estáticamente

Al crear una instantánea de volumen aprovisionada dinámicamente, se aplican a la copia de seguridad del volumen en bloque las mismas etiquetas de formato libre y definidas que se han aplicado al volumen en bloque de origen. Sin embargo, puede utilizar parámetros para aplicar etiquetas adicionales a la copia de seguridad del volumen en bloque (consulte Etiquetado de copias de seguridad de volumen en bloque).

Hay una serie de requisitos que cumplir antes de crear instantáneas de volumen para su uso con clusters creados por Container Engine for Kubernetes. Consulte Requisitos para crear instantáneas de volumen.

Tenga en cuenta lo siguiente al crear y utilizar instantáneas de volúmenes:

  • Solo puede crear instantáneas de volumen al utilizar el plugin de volumen CSI (es decir, no puede crear instantáneas de volumen al utilizar el plugin de volumen FlexVolume).
  • En el caso de las copias de seguridad de volumen dinámicas, el plugin de volumen CSI crea una nueva copia de seguridad de volumen en bloque para aprovisionar una instantánea de volumen dinámica en el mismo compartimento que el cluster. En el caso de instantáneas de volumen estáticas, la copia de seguridad de volumen en bloque que aprovisiona una instantánea de volumen estática puede estar en un compartimento diferente al cluster, siempre que existan sentencias de política adecuadas para permitir que el cluster acceda a ese otro compartimento (consulte Requisitos para crear instantáneas de volumen).
  • No puede utilizar el plugin de volumen CSI para volver a rellenar un volumen existente con datos. En otras palabras, no puede restaurar (revertir) los datos de un volumen persistente existente a un estado anterior cambiando la instantánea de volumen especificada en el manifiesto de la reclamación de volumen persistente. Solo puede usar el plugin de volumen CSI para rellenar un nuevo volumen con datos.
  • Al crear una copia de seguridad de un volumen en bloque (por ejemplo, al crear una instantánea de un volumen dinámico), la clave de cifrado que se utilizó al crear el volumen en bloque también se utiliza para crear la copia de seguridad del volumen en bloque. No puede especificar una nueva clave de cifrado al crear una copia de seguridad de volumen en bloque. Por tanto, la copia de seguridad del volumen en bloque utiliza el mismo cifrado que el volumen en bloque del que realiza la copia de seguridad.
  • El tamaño especificado para un volumen persistente aprovisionado por una instantánea de volumen no debe ser menor que el tamaño del volumen original a partir del cual se creó la instantánea.
  • Cuando el plugin de volumen CSI crea un nuevo volumen en bloque para respaldar un volumen persistente aprovisionado por una instantánea de volumen, la ubicación del volumen en bloque depende de los requisitos de topología de la solicitud de creación de volumen. Por ejemplo, si el plugin de volumen CSI crea un volumen en bloque para un pod que utiliza una reclamación de volumen persistente, el volumen en bloque se crea en el mismo dominio de disponibilidad que el nodo de trabajador en el que se está ejecutando el pod.
  • Las instantáneas entre espacios de nombres no están soportadas.

Requisitos para crear instantáneas de volumen

Para crear instantáneas de volumen para su uso con clusters creados por Container Engine for Kubernetes:

  • los nodos de plano de control del cluster deben ejecutar Kubernetes versión 1.24 o posterior
  • los nodos de trabajador del cluster deben utilizar unidades de computación de procesador basadas en Arm o procesador AMD
  • los nodos de trabajador del cluster deben ejecutar Oracle Linux 7 u Oracle Linux 8

Los objetos VolumeSnapshot, VolumeSnapshotContent y VolumeSnapshotClass no forman parte de la API de Kubernetes principal. Por lo tanto, antes de crear instantáneas de volumen mediante el plugin de volumen CSI, debe instalar los archivos CRD (Definición de recurso personalizado) necesarios en el cluster mediante la ejecución de los siguientes comandos:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml

Si desea utilizar una instantánea de volumen aprovisionada estáticamente para aprovisionar un nuevo volumen persistente y la copia de seguridad de volumen en bloque subyacente está en un compartimento diferente al cluster, deben existir sentencias de política adecuadas para permitir que el cluster acceda a las copias de seguridad de volumen en bloque de ese otro compartimento. Por ejemplo:

ALLOW any-user to manage volume-backups in compartment <compartment-name> where request.principal.type = 'cluster'
ALLOW any-user to use volumes in compartment <compartment-name> where request.principal.type = 'cluster'

Creación de instantáneas de volumen aprovisionadas dinámicamente

Para aprovisionar dinámicamente una instantánea de volumen mediante la creación de una copia de seguridad del volumen en bloque que aprovisiona una reclamación de volumen persistente, primero debe definir un objeto VolumeSnapshotClass que especifique el tipo de copia de seguridad de volumen en bloque que se va a crear. Una vez creado el objeto VolumeSnapshotClass, debe definir un objeto VolumeSnapshot que utilice VolumeSnapshotClass. Utilice el objeto VolumeSnapshot para especificar la reclamación de volumen persistente aprovisionada por el volumen en bloque del que desea realizar una copia de seguridad.

Nota

Al crear una instantánea de volumen aprovisionada dinámicamente, Container Engine for Kubernetes crea un objeto VolumeSnapshotContent. No modifique los objetos VolumeSnapshotContent que crea Container Engine for Kubernetes ni cree sus propios objetos VolumeSnapshotContent al crear instantáneas de volumen aprovisionadas dinámicamente.

Por ejemplo, puede definir una reclamación de volumen persistente denominada sample-pvc en un archivo denominado csi-mypvctobackup.yaml, aprovisionado por un volumen en bloque:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: sample-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: "oci-bv"
  resources:
    requests:
      storage: 50Gi

Cree la reclamación de volúmenes persistentes:

kubectl create -f csi-mypvctobackup.yaml

Puede utilizar la reclamación de volumen persistente al definir otros objetos, como los pods. Por ejemplo, la siguiente definición de pod indica al sistema que utilice la reclamación de volumen persistente de pvc de muestra como volumen nginx, montado por el pod en /sample-volume.

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
    - name: sample-nginx
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: sample-volume
  volumes:
  - name: sample-volume
    persistentVolumeClaim:
      claimName: sample-pvc

Una vez creado el nuevo pod, la reclamación de volumen persistente se enlaza a un nuevo volumen persistente aprovisionado por un volumen en bloque.

Para prepararse para crear una copia de seguridad del volumen en bloque que aprovisiona la reclamación de volumen persistente, defina los parámetros para la copia de seguridad de volumen en bloque definiendo un objeto VolumeSnapshotClass denominado my-snapclass en un archivo denominado csi-mysnapshotclass.yaml:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: my-snapclass
driver: blockvolume.csi.oraclecloud.com
parameters:
  backupType: full
deletionPolicy: Delete

donde:

  • driver: blockvolume.csi.oraclecloud.com especifica el plugin de volumen CSI para aprovisionar objetos VolumeSnapshot.
  • parameters.backupType: full especifica que una copia de seguridad de volumen en bloque debe incluir todos los cambios desde que se creó el volumen en bloque. Especifique incremental para crear una copia de seguridad solo con los cambios desde la última copia de seguridad. Tenga en cuenta que, a efectos de recuperación de datos, no hay ninguna diferencia funcional entre una copia de seguridad incremental y una copia de seguridad completa. Consulte Tipos de copia de seguridad de volumen.
  • deletionPolicy: Delete especifica lo que sucede con una copia de seguridad de volumen en bloque si se suprime el objeto VolumeSnapshot asociado. Especifique Retain para mantener una copia de seguridad de volumen en bloque si se suprime el objeto VolumeSnapshot asociado.

Por defecto, se aplican a la copia de seguridad del volumen en bloque las mismas etiquetas de formato libre y definidas que se han aplicado al volumen en bloque de origen. Sin embargo, puede utilizar parámetros para aplicar etiquetas adicionales a la copia de seguridad del volumen en bloque (consulte Etiquetado de copias de seguridad de volumen en bloque).

Cree el objeto VolumeSnapshotClass:

kubectl create -f csi-mysnapshotclass.yaml

Para crear una copia de seguridad del volumen en bloque que aprovisiona la reclamación de volumen persistente, defina un objeto VolumeSnapshot como mi instantánea en un archivo denominado csi-mysnapshot.yaml:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: my-snapshot
  namespace: default
spec:
  volumeSnapshotClassName: my-snapclass
  source:
    persistentVolumeClaimName: sample-pvc
donde:
  • volumeSnapshotClassName: my-snapclass especifica my-snapclass como objeto VolumeSnapshotClass desde el que se obtienen los parámetros que se van a utilizar al crear la copia de seguridad del volumen en bloque. Tenga en cuenta que no puede cambiar volumeSnapshotClassName después de crear el objeto VolumeSnapshot (tiene que crear un nuevo objeto VolumeSnapshot).
  • persistentVolumeClaimName: sample-pvc especifica sample-pvc como reclamación de volumen persistente según el volumen en bloque para el que desea crear una copia de seguridad de volumen en bloque. Tenga en cuenta que no puede cambiar el origen después de crear el objeto VolumeSnapshot (tiene que crear un nuevo objeto VolumeSnapshot).

Cree el objeto VolumeSnapshot:

kubectl create -f csi-mysnapshot.yaml

El objeto VolumeSnapshot se crea y aprovisiona mediante una nueva copia de seguridad de volumen en bloque. Puede utilizar la instantánea de volumen para aprovisionar un nuevo volumen persistente (consulte Uso de una instantánea de volumen para aprovisionar un nuevo volumen).

Creación de instantáneas de volumen aprovisionadas estáticamente

Para aprovisionar de forma estática una instantánea de volumen a partir de una copia de seguridad de volumen en bloque existente, primero debe crear la copia de seguridad de volumen en bloque (consulte Creación de una copia de seguridad manual para un volumen en bloque).

Una vez creada la copia de seguridad de volumen en bloque, defina un objeto VolumeSnapshotContent y especifique los detalles (incluido el OCID) de la copia de seguridad de volumen en bloque existente. A continuación, puede definir un objeto VolumeSnapshot y especificar el objeto VolumeSnapshotContent que proporciona detalles de la copia de seguridad de volumen en bloque existente.

Por ejemplo, puede definir el objeto VolumeSnapshotContent como my-static-snapshot-content en un archivo denominado csi-mystaticsnapshotcontent.yaml:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
  name: my-static-snapshot-content
spec:
  deletionPolicy: Retain
  driver: blockvolume.csi.oraclecloud.com
  source:
    snapshotHandle: ocid1.volumebackup.oc1.iad.aaaaaa______xbd
  volumeSnapshotRef:
    name: my-static-snapshot
    namespace: default
donde:
  • deletionPolicy: Retain especifica lo que sucede con una copia de seguridad de volumen en bloque si se suprime el objeto VolumeSnapshot asociado. Especifique Delete para suprimir una copia de seguridad de volumen en bloque si se suprime el objeto VolumeSnapshot asociado.
  • driver: blockvolume.csi.oraclecloud.com especifica que se utilice el plugin de volumen CSI para aprovisionar objetos VolumeSnapshot.
  • snapshotHandle: ocid1.volumebackup.oc1.iad.aaaaaa______xbd especifica el OCID de la copia de seguridad de volumen en bloque existente.
  • volumeSnapshotRef.name: my-static-snapshot especifica el nombre del objeto VolumeSnapshot correspondiente que se aprovisionará a partir de la copia de seguridad de volumen en bloque existente. Este campo se necesario. Tenga en cuenta que el objeto VolumeSnapshot no necesita existir al crear el objeto VolumeSnapshotContent.
  • namespace: default especifica el espacio de nombres que contiene el objeto VolumeSnapshot correspondiente que se aprovisionará a partir de la copia de seguridad de volumen en bloque existente. Este campo se necesario.

Cree el objeto VolumeSnapshotContent:

kubectl create -f csi-mystaticsnapshotcontent.yaml

El objeto VolumeSnapshot aprovisionado estáticamente se define como my-static-snapshot en un archivo denominado csi-mystaticsnapshot.yaml:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: my-static-snapshot
spec:
  source:
    volumeSnapshotContentName: my-static-snapshot-content

donde VolumeSnapshotContentName: my-static-snapshot-content especifica el nombre del objeto VolumeSnapshotContent que ha creado anteriormente. Tenga en cuenta que no puede cambiar el origen después de crear el objeto VolumeSnapshot (tiene que crear un nuevo objeto VolumeSnapshot).

Cree el objeto VolumeSnapshot:

kubectl create -f csi-mystaticsnapshot.yaml

El objeto VolumeSnapshot se crea y aprovisiona mediante la copia de seguridad de volumen en bloque especificada en el objeto VolumeSnapshotContent. Puede utilizar la instantánea de volumen para aprovisionar un nuevo volumen persistente (consulte Uso de una instantánea de volumen para aprovisionar un nuevo volumen).

Uso de una instantánea de volumen para aprovisionar un nuevo volumen

Una vez creada una instantánea de volumen aprovisionada de forma dinámica o estática, puede especificar la instantánea de volumen como origen de datos para una reclamación de volumen persistente a fin de aprovisionar un nuevo volumen persistente.

Por ejemplo, puede definir una reclamación de volumen persistente denominada pvc-fromsnapshot en un archivo denominado csi-mypvcfromsnapshot.yaml, aprovisionada por una instantánea de volumen denominada test-snapshot:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-fromsnapshot
  namespace: default
spec:
  storageClassName: oci-bv
  dataSource:
    name: test-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi

donde:

  • datasource.name: test-snapshot especifica la instantánea de prueba como nombre del objeto VolumeSnapshot que se va a utilizar como origen de datos para el volumen persistente.
  • datasource.apiGroup: snapshot.storage.k8s.io especifica la versión de la API de almacenamiento de instantáneas de Kubernetes que se va a utilizar.

Cree la reclamación de volúmenes persistentes:

kubectl create -f csi-mypvcfromsnapshot.yaml

Cuando se utiliza la reclamación de volumen persistente para aprovisionar otro objeto (como un pod), se crea un volumen persistente y se utiliza el objeto VolumeSnapshot especificado para rellenar el volumen en bloque subyacente. Por ejemplo, puede crear un nuevo pod a partir de la siguiente definición de pod que indique al sistema que utilice la PVC PVC-fromsnapshot como volumen nginx, montado por el pod en /data.

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod-restore
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - name: http
          containerPort: 80
      volumeMounts:
        - name: data
          mountPath: /data
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: pvc-fromsnapshot

Una vez creado el nuevo pod, la reclamación de volumen persistente se enlaza a un nuevo volumen persistente aprovisionado por un nuevo volumen en bloque rellenado por el objeto VolumeSnapshot.

Etiquetado de copias de seguridad de volumen en bloque

Al utilizar el plugin de volumen CSI para crear una instantánea de volumen aprovisionada dinámicamente, las mismas etiquetas de formato libre y etiquetas definidas que se aplicaron al volumen en bloque de origen también se aplican a la copia de seguridad de volumen en bloque.

Para aplicar etiquetas de formato libre adicionales a la nueva copia de seguridad de volumen en bloque, incluya el siguiente parámetro en la sección de parámetros del archivo de manifiesto VolumeSnapshotClass:

oci.oraclecloud.com/freeform-tags: '{"<first-tag-key>":","<first-tag-value>","<second-tag-key>":"<second-tag-value>"...}'

Para aplicar etiquetas definidas adicionales a la nueva copia de seguridad de volumen en bloque, incluya el siguiente parámetro en la sección de parámetros del archivo de manifiesto VolumeSnapshotClass:

oci.oraclecloud.com/defined-tags: '{"<tag-namespace>": {"<first-tag-key>":","<first-tag-value>","<second-tag-key>":"<second-tag-value>"...}}'

Por ejemplo:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: my-snapclass
driver: blockvolume.csi.oraclecloud.com
parameters:
  backupType: full
  oci.oraclecloud.com/freeform-tags: '{"<first-tag-key>":","<first-tag-value>","<second-tag-key>":"<second-tag-value>"...}'
deletionPolicy: Delete

Creación de una PVC mediante la clonación de un volumen en bloque existente mediante el plugin de volumen CSI

Una clonación de Kubernetes es un duplicado exacto de un volumen persistente existente en un sistema de almacenamiento. Puede clonar un volumen persistente existente para aprovisionar una nueva reclamación de volumen persistente. El nuevo volumen persistente contiene una copia de los datos del volumen persistente de origen, pero es independiente del volumen persistente de origen. Puede utilizar las clonaciones de volúmenes para probar los cambios de configuración rápidamente, sin que esto afecte a un entorno de producción. Para obtener más información sobre las clonaciones de Kubernetes, consulte Clonación de volúmenes CSI en la documentación de Kubernetes.

En el servicio de volumen en bloque, puede clonar un volumen en bloque para crear un nuevo volumen en bloque relleno previamente con datos del volumen en bloque de origen. Para obtener más información sobre la clonación de volúmenes en bloque en el servicio de volumen en bloque, consulte Clonación de un volumen en bloque.

Al utilizar el plugin de volumen CSI para conectar clusters a volúmenes en bloque en el servicio Block Volume, puede aprovisionar una nueva PVC con un nuevo volumen en bloque que se haya clonado a partir de un volumen en bloque existente aprovisionando otra PVC existente. Para indicar que desea que el plugin de volumen CSI clone el volumen en bloque existente para la nueva PVC, especifique la PVC existente como origen de datos para la nueva PVC.

El nuevo PVC se puede utilizar de la misma manera que cualquier otro PVC, y es completamente independiente del PVC existente especificado como origen de datos. Del mismo modo, el nuevo volumen en bloque y el volumen en bloque existente desde el que se clona son recursos totalmente independientes y se pueden actualizar, clonar, crear instantáneas y suprimir de forma independiente.

En cuanto se haya clonado el volumen en bloque de origen y se haya creado un nuevo volumen en bloque (normalmente en unos segundos), el nuevo volumen en bloque tendrá el estado Disponible. Todos los datos presentes en el volumen en bloque de origen en ese momento se copian en el nuevo volumen en bloque (no se copian los cambios posteriores). Sin embargo, los datos se copian en segundo plano, lo que puede tardar hasta treinta minutos en función del tamaño del volumen en bloque (por ejemplo, puede tardar hasta quince minutos en copiar un volumen en bloque de 1 TB). Por lo tanto, para evitar la posibilidad de errores o corrupción de datos, la nueva PVC tiene el estado Pendiente hasta que se hayan copiado todos los datos. Cuando se han copiado todos los datos, la nueva PVC se enlaza al PV aprovisionado por el nuevo volumen en bloque y la nueva PVC tiene el estado Disponible.

Hay una serie de requisitos que se deben cumplir antes de aprovisionar una nueva reclamación de volumen persistente mediante la clonación del volumen en bloque que ya está aprovisionando una reclamación de volumen persistente existente. Consulte Requisitos para clonar un volumen en bloque existente para aprovisionar una nueva PVC.

Tenga en cuenta lo siguiente al clonar un volumen en bloque para aprovisionar una nueva PVC:

  • El plugin del volumen CSI crea el nuevo volumen en bloque en el mismo dominio de disponibilidad, región y arrendamiento que el volumen en bloque de origen.
  • El nuevo volumen en bloque creado por el plugin de volumen CSI se puede clonar en cuanto tenga el estado Available.
  • Los requisitos de topología de una solicitud de creación de volúmenes se ignoran. Por ejemplo, si el plugin de volumen CSI clona un volumen en bloque para un pod que utiliza una reclamación de volumen persistente, el nuevo volumen en bloque se crea en el mismo dominio de disponibilidad que el nodo de trabajador en el que se está ejecutando el pod.
  • No puede utilizar el plugin de volumen CSI para clonar volúmenes en bloque creados por el plugin de volumen FlexVolume.
  • No puede suprimir la PVC de origen mientras la clonación está en curso. Del mismo modo, no puede suprimir un volumen en bloque de origen mientras se copian los datos en un volumen en bloque que se ha clonado a partir de él.
  • La clonación entre espacios de nombres no está soportada. El nuevo PVC y el PVC de origen deben estar en el mismo espacio de nombres.
  • No es necesario especificar explícitamente una clase de almacenamiento para la nueva PVC. Si especifica explícitamente una clase de almacenamiento para la nueva PVC, la clase de almacenamiento que especifique puede ser diferente a la clase de almacenamiento especificada para la PVC de origen. Si no especifica una clase de almacenamiento para la nueva PVC, se utiliza la clase de almacenamiento por defecto.

Requisitos para clonar un volumen en bloque existente para aprovisionar una nueva PVC

Para aprovisionar una nueva reclamación de volumen persistente mediante la clonación del volumen en bloque que ya está aprovisionando una reclamación de volumen persistente existente:

  • Los nodos de plano de control del cluster deben ejecutar Kubernetes versión 1.25 o posterior.
  • Los nodos de trabajador del cluster deben utilizar unidades de computación de procesador basadas en Arm o procesador AMD.
  • Los nodos de trabajador del cluster deben estar ejecutando Oracle Linux 7 u Oracle Linux 8.
  • La PVC existente que especifique como origen de datos para la nueva PVC debe:
    • Ya se debe enlazar a un PV aprovisionado por un volumen en bloque.
    • Tener un estado Disponible.
  • El nuevo volumen en bloque debe tener el mismo tamaño o un tamaño mayor que el volumen en bloque de origen del que se clona. Si especifica un valor de almacenamiento para la nueva PVC que sea mayor que el volumen en bloque de origen, el nuevo volumen en bloque tendrá el tamaño correspondiente. No puede especificar un valor de almacenamiento para la nueva PVC que sea menor que el volumen en bloque que desea clonar o menor que el valor de almacenamiento de la PVC de origen.
  • El tipo de sistema de archivos especificado para el nuevo volumen en bloque debe ser el mismo que el tipo de sistema de archivos del volumen en bloque de origen del que se clona (consulte Especificación de tipos de sistemas de archivos para volúmenes en bloque).

Clonación de un volumen en bloque existente para aprovisionar una nueva PVC

Para aprovisionar una nueva reclamación de volumen persistente mediante la clonación del volumen en bloque que ya está aprovisionando una reclamación de volumen persistente existente, especifique la reclamación de volumen persistente existente como dataSource de la nueva reclamación de volumen persistente.

Por ejemplo, puede definir una reclamación de volumen persistente denominada my-clone-pvc en un archivo denominado csi-myclonepvc.yaml. La reclamación de volumen persistente my-clone-pvc se aprovisiona mediante un volumen en bloque creado mediante la clonación del volumen en bloque que aprovisiona la reclamación de volumen persistente my-source-pvc:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-clone-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: custom-clone-storage-class
  resources:
    requests:
      storage: 50Gi
  dataSource:
    kind: PersistentVolumeClaim
    name: my-source-pvc

Cree la reclamación de volúmenes persistentes:

kubectl create -f csi-myclonepvc.yaml

Puede utilizar la reclamación de volumen persistente al definir otros objetos, como los pods. Por ejemplo, la siguiente definición de pod indica al sistema que utilice la reclamación de volumen persistente my-clone-pvc como volumen nginx, montado por el pod en /sample-volume.

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
    - name: sample-nginx
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: sample-volume
  volumes:
  - name: sample-volume
    persistentVolumeClaim:
      claimName: my-clone-pvc

Una vez creado el nuevo pod, la reclamación de volumen persistente my-clone-pvc está enlazada a un nuevo volumen persistente aprovisionado por un volumen en bloque que se ha clonado a partir del volumen en bloque que aprovisiona la reclamación de volumen persistente my-source-pvc.

Etiquetado de volúmenes en bloque clonados

Al utilizar el plugin de volumen CSI para aprovisionar un volumen persistente mediante la clonación de un volumen en bloque que aprovisione otra reclamación de volumen persistente, las mismas etiquetas de formato libre y las etiquetas definidas que se han aplicado al volumen en bloque de origen también se aplican al nuevo volumen en bloque. El plugin de volumen CSI no aplica ninguna etiqueta adicional al nuevo volumen en bloque.

Creación de una PVC a partir de un volumen en bloque existente o copia de seguridad mediante el plugin de volumen FlexVolume

Puede crear una PVC a partir de un volumen en bloque existente o una copia de seguridad de volumen en bloque para que la utilice el plugin de volumen FlexVolume. Por ejemplo, si el administrador del cluster ha creado una copia de seguridad de volumen en bloque para que la utilice al aprovisionar una nueva reclamación de volumen persistente. Esta copia de seguridad de volumen en bloque puede incluir datos listos para su uso por otros objetos como pods.

Se define una PVC en un archivo denominado flex-pvcfrombackup.yaml. Utilice el elemento de anotación volume.beta.kubernetes.io/oci-volume-source para especificar el origen del volumen en bloque que se va a utilizar al aprovisionar una nueva reclamación de volumen persistente mediante el plugin de volumen FlexVolume. Puede especificar el OCID de un volumen en bloque o una copia de seguridad de volumen en bloque como el valor de la anotación. En este ejemplo, especifique el OCID de la copia de seguridad de volumen en bloque creada por el administrador del cluster. Por ejemplo:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myvolume
  annotations:
    volume.beta.kubernetes.io/oci-volume-source: ocid1.volumebackup.oc1.iad.abuw...
spec:
  selector:
    matchLabels:
      topology.kubernetes.io/zone: US-ASHBURN-AD-1
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi

Tenga en cuenta que el archivo flex-pvcfrombackup.yaml incluye el elemento matchLabels, que solo es aplicable en el caso del plugin de volumen FlexVolume.

Introduzca el siguiente comando para crear la PVC a partir del archivo flex-pvcfrombackup.yaml:

kubectl create -f flex-pvcfrombackup.yaml

La salida del comando anterior confirma la creación de la PVC.

persistentvolumeclaim "myvolume" created

Verifique que la PVC se ha creado y enlazado a un nuevo volumen persistente creado a partir de la copia de seguridad de volumen introduciendo:

kubectl get pvc

La salida del comando anterior muestra el estado actual de la PVC:

			
NAME           STATUS    VOLUME                               CAPACITY   ACCESSMODES   STORAGECLASS   AGE
myvolume       Bound     ocid1.volume.oc1.iad.<unique_ID>     50Gi       RWO           oci            4m

Puede utilizar el nuevo volumen persistente creado a partir de la copia de seguridad del volumen al definir otros objetos, como los pods. Por ejemplo, la siguiente definición de pod indica al sistema que utilice la PVC como volumen nginx, montado por el pod en /data.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - name: http
          containerPort: 80
      volumeMounts:
        - name: data
          mountPath: /usr/share/nginx/html
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: myvolume

Tras crear el nuevo pod, puede verificar que se está ejecutando y utilizando la nueva reclamación de volumen persistente introduciendo:

kubectl describe pod nginx
Nota

En el ejemplo FlexVolume de este tema, la PVC solicita almacenamiento en un dominio de disponibilidad de la región de Ashburn mediante la etiqueta topology.kubernetes.io/zone. Para obtener más información sobre el uso de esta etiqueta (y las versiones abreviadas de los nombres de dominio de disponibilidad que se deben especificar), consulte topology.kubernetes.io/zone.

Cifrado de datos estáticos y datos en tránsito con el servicio de volúmenes de bloques

El servicio Oracle Cloud Infrastructure Block Volume siempre cifra todos los volúmenes en bloque y las copias de seguridad de volumen estáticas mediante el algoritmo estándar de cifrado avanzado (AES) con cifrado de 256 bits. Por defecto, todos los volúmenes y sus copias de seguridad se cifran con las claves de cifrado proporcionadas por Oracle. Cada vez que se clona o restaura un volumen a partir de una copia de seguridad, se le asigna una nueva clave de cifrado única.

Puede cifrar todos los volúmenes y sus copias de seguridad mediante claves propias y gestionar mediante el servicio de almacén. Para obtener más información, consulte Gestión de claves. Si no configura un volumen para que utilice el servicio de almacén ni anula posteriormente la asignación de una clave del volumen, el servicio de volumen en bloque utiliza la clave de cifrado proporcionada por Oracle en su lugar. Esto se aplica tanto al cifrado estático como al cifrado en tránsito paravirtualizado.

Todos los datos que se mueven entre la instancia y el volumen en bloque se transfieren a través de una red interna altamente segura. Si tiene requisitos de conformidad específicos relacionados con el cifrado de los datos mientras se mueven entre la instancia y el volumen en bloque, el servicio de volumen en bloque proporciona la opción de activar el cifrado en tránsito para asociaciones de volúmenes paravirtualizadas en instancias de máquina virtual (VM). Algunas unidades dedicadas admiten el cifrado en tránsito para los volúmenes en bloque con asociación iSCSI de la instancia.

Para obtener más información sobre el cifrado de volúmenes en bloque y el soporte de cifrado en tránsito, consulte Cifrado de volumen en bloque.

Cuando las PVC de Kubernetes están respaldadas por el servicio de volumen en bloque, puede elegir cómo se cifran los volúmenes en bloque especificando:

  • Clave de cifrado maestra que se va a utilizar, definiendo la propiedad kms-key-id en la definición de la clase de almacenamiento de Kubernetes. Puede especificar el OCID de una clave de cifrado maestra en el servicio Almacén.
  • Cómo se asocia el volumen en bloque a la instancia informática definiendo la propiedad attachment-type en la definición de la clase de almacenamiento de Kubernetes en iscsi o paravirtualized.
  • Si el cifrado en tránsito está activado para cada pool de nodos de un cluster, mediante la configuración de la propiedad isPvEncryptionInTransitEnabled del pool de nodos (mediante la CLI, la API o la opción Usar cifrado en tránsito del pool de nodos en la consola).

La interacción de la configuración que especifique determina cómo se cifran los volúmenes en bloque, como se muestra en la tabla:

La propiedad isPvEncryptionInTransitEnabled del pool de nodos se ha definido en: Propiedad class kms-key-id de almacenamiento definida en: Propiedad de clase de almacenamiento attachment-type definida en ¿Se cifran los datos estáticos? ¿Se cifran los datos en tránsito? Notas:
true OCID de una clave en Vault paravirtualized Sí (clave gestionada por el usuario) Sí (clave gestionada por el usuario)
true OCID de una clave en Vault iscsi Error Error El PV no se puede aprovisionar porque la propiedad attachment-type se debe definir en paravirtualized cuando isPvEncryptionInTransitEnabled se define en True.
true no definido paravirtualized Sí (clave gestionada por Oracle) Sí (clave gestionada por Oracle)
true no definido iscsi Error Error El PV no se puede aprovisionar porque la propiedad attachment-type se debe definir en paravirtualized cuando isPvEncryptionInTransitEnabled se define en True.
false OCID de una clave en Vault paravirtualized Sí (clave gestionada por el usuario) No
false OCID de una clave en Vault iscsi Sí (clave gestionada por el usuario) No
false no definido paravirtualized Sí (clave gestionada por Oracle) No
false no definido iscsi Sí (clave gestionada por Oracle) No

Para poder crear un cluster para el que desee gestionar la clave de cifrado maestra usted mismo, debe:

Para obtener más información sobre la rotación de claves en el servicio Vault, consulte Rotación de una clave de Vault.

Ejemplo: configuración de una clase de almacenamiento para activar el cifrado estático y en tránsito mediante la clave gestionada por Oracle por defecto

Para aprovisionar una PVC en un volumen de bloques, mediante una clave de cifrado maestra gestionada por Oracle para cifrar los datos estáticos (y, opcionalmente, en tránsito), defina una clase de almacenamiento y defina:

  • De provisioner: a blockvolume.csi.oraclecloud.com
  • De attachment-type a paravirtualized

Por ejemplo:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: bv-encrypted-storage-class
provisioner: blockvolume.csi.oraclecloud.com
parameters:
  attachment-type: "paravirtualized"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

A continuación, puede crear una PVC aprovisionada por la clase de almacenamiento que ha creado.

Una vez definida la clase de almacenamiento y creada la PVC, defina la propiedad isPvEncryptionInTransitEnabled de cada pool de nodos en true (mediante la CLI, la API o la opción Usar cifrado en tránsito: del pool de nodos en la consola). Tenga en cuenta que el cifrado de datos en tránsito solo está soportado en algunas situaciones (consulte Cifrado de datos estáticos y datos en tránsito con el servicio de volúmenes en bloque).

Ejemplo: configuración de una clase de almacenamiento para activar el cifrado estático y en tránsito mediante una clave que gestione

Para aprovisionar una PVC en un volumen de bloques, mediante una clave de cifrado maestra gestionada por usted para cifrar los datos estáticos (y, opcionalmente, en tránsito), debe:

Después de crear una política y una clave de cifrado maestra adecuadas, defina una clase de almacenamiento y defina:

  • De provisioner: a blockvolume.csi.oraclecloud.com
  • De attachment-type a paravirtualized
  • kms-key-id al OCID de la clave de cifrado maestra en el servicio de almacén que desea utilizar para cifrar los datos

Por ejemplo:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: bv-user-encrypted-storage-class
provisioner: blockvolume.csi.oraclecloud.com
parameters:
  attachment-type: "paravirtualized"
  kms-key-id: "ocid1.key.oc1.iad.anntl______usjh"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

A continuación, puede crear una PVC aprovisionada por la clase de almacenamiento que ha creado.

Una vez definida la clase de almacenamiento y creada la PVC, defina la propiedad isPvEncryptionInTransitEnabled de cada pool de nodos en true (mediante la CLI, la API o la opción Usar cifrado en tránsito: del pool de nodos en la consola). Tenga en cuenta que el cifrado de datos en tránsito solo está soportado en algunas situaciones (consulte Cifrado de datos estáticos y datos en tránsito con el servicio de volúmenes en bloque).

Ampliación de un volumen en bloque

Cuando se crea una PVC con el plugin de volumen CSI (provisioner: blockvolume.csi.oraclecloud.com), puede ampliar el tamaño del volumen en línea. Al hacerlo, permite desplegar inicialmente aplicaciones con una determinada cantidad de almacenamiento y, a continuación, aumentar el almacenamiento disponible sin tiempo de inactividad.

Si desea soportar aumentos de solicitudes de almacenamiento, defina allowVolumeExpansion: true en la definición de la clase de almacenamiento que especifique para la PVC. Por ejemplo:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: my-bv
provisioner: blockvolume.csi.oraclecloud.com
parameters:
  attachment-type: "paravirtualized"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

La clase de almacenamiento oci-bv por defecto para el plugin de volumen CSI tiene allowVolumeExpansion: true por defecto.

Para ampliar el tamaño de un volumen, edite el manifiesto de PVC, actualice el tamaño del volumen y, a continuación, aplique el manifiesto. La próxima vez que se vuelva a explorar el disco para permitir que el sistema operativo identifique el tamaño de volumen ampliado (que puede tardar unos minutos), el almacenamiento aumentado estará disponible automáticamente para los pods mediante PVC. No es necesario reiniciar los pods.

Introduzca el siguiente comando para confirmar que la PVC se ha enlazado a un volumen en bloque recién ampliado:

kubectl get pvc <pvc_name> -o yaml

Tenga en cuenta lo siguiente:

  • La expansión de volúmenes está soportada en clusters que ejecutan Kubernetes 1.19 o posterior.
  • La clase de almacenamiento oci-bv por defecto para el plugin de volumen CSI se configura con allowVolumeExpansion: true en clusters que ejecutan Kubernetes 1.19 o posterior. Las definiciones de clases de almacenamiento oci-bv en clusters existentes que ejecutan Kubernetes 1.19 o posterior se editan automáticamente para definir allowVolumeExpansion: true.
  • No puede reducir el tamaño de un volumen en bloque. Solo puede especificar un valor mayor que el tamaño actual del volumen en bloque. Si actualiza un manifiesto de PVC para solicitar menos almacenamiento del solicitado anteriormente, la solicitud de almacenamiento falla.
  • Para obtener más información sobre cómo aumentar el tamaño de los volúmenes en bloque en el servicio de volumen en bloque, consulte Cambio de tamaño de un volumen. En concreto, tenga en cuenta la recomendación de crear una copia de seguridad antes de cambiar el tamaño de un volumen en bloque.

Ejemplo: configuración de una clase de almacenamiento para activar la expansión de volúmenes en bloque

Edite el manifiesto de una PVC aprovisionada por la clase de almacenamiento oci-bv e incluya una solicitud de almacenamiento. Por ejemplo, puede definir inicialmente storage: 100Gi para solicitar 100 GB de almacenamiento para la PVC, en un archivo denominado csi-bvs-PVC-exp.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: my-pvc
spec:
 storageClassName: oci-bv
 resources:
  requests:
    storage: 100Gi
 volumeName: pvc-bv1

Introduzca el siguiente comando para crear la PVC a partir del archivo csi-bvs-PVC-exp.yaml:

kubectl apply -f csi-bvs-pvc-exp.yaml

Posteriormente, es posible que necesite aumentar la cantidad de almacenamiento disponible para el PVC. Por ejemplo, puede cambiar el manifiesto y definir storage: 200Gi:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: my-pvc
spec:
 storageClassName: oci-bv
 resources:
  requests:
    storage: 200Gi
 volumeName: pvc-bv1

Después de aplicar el manifiesto, el PV que aprovisiona el PVC se aumenta a 200 GB. La actualización del manifiesto dispara el servicio de volumen en bloque para aumentar el tamaño del volumen en bloque existente a 200 GB. La próxima vez que se vuelva a explorar el disco (que puede tardar unos minutos), el almacenamiento aumentado estará disponible automáticamente para los pods que utilicen PVC.

Especificación del rendimiento del volumen en bloque

Los volúmenes en bloque del servicio de volumen en bloque se pueden configurar para distintos niveles de rendimiento, según los requisitos de E/S de carga de trabajo esperados. El rendimiento de los volúmenes en bloque se expresa en unidades de rendimiento de volumen (VPU). Hay una serie de niveles de rendimiento disponibles, que incluyen:

  • Costo bajo (0 VPU)
  • Equilibrado (10 VPU)
  • Alto rendimiento (20 VPU)
  • Rendimiento ultraalto (entre 30 VPU y 120 VPU)

Por defecto, los volúmenes en bloque se configuran para el nivel de rendimiento Equilibrado (10 VPU). Para obtener más información sobre los diferentes niveles de rendimiento de volumen en bloque, consulte Niveles de rendimiento de volumen en bloque.

Al definir una PVC mediante el plugin de volumen CSI (provisioner: blockvolume.csi.oraclecloud.com), puede especificar un nivel de rendimiento de volumen en bloque diferente en la definición de clase de almacenamiento que sea adecuado para la carga de trabajo esperada.

Tenga en cuenta que no puede cambiar posteriormente el nivel de rendimiento de un volumen en bloque que realiza una copia de seguridad de PVC. En su lugar, debe definir una nueva clase de almacenamiento, definir el nivel de rendimiento según sea necesario y crear una nueva PVC aprovisionada por esa nueva clase de almacenamiento.

Creación de PVC con niveles de rendimiento de menor costo (0 VPU), equilibrados (10 VPU) y de mayor rendimiento (20 VPU)

Para crear una PVC respaldada por un volumen en bloque con un nivel de rendimiento Costo bajo, Equilibrado o Alto rendimiento, defina vpusPerGB en la definición de clase de almacenamiento de la siguiente manera:

  • para un nivel de rendimiento de Costo bajo, defina vpusPerGB: "0"
  • para un nivel de rendimiento Equilibrado, defina vpusPerGB: "10"
  • para un nivel de rendimiento Alto rendimiento, defina vpusPerGB: "20"

Por ejemplo:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: oci-high
provisioner: blockvolume.csi.oraclecloud.com
parameters:
  vpusPerGB: "20"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

El valor de vpusPerGB debe ser "0", "10" o "20". No se admiten otros valores.

Cree un manifiesto para una PVC aprovisionada por la clase de almacenamiento oci-high e incluya una solicitud de almacenamiento. Por ejemplo, en un archivo denominado csi-bvs-pvc-perf.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: oci-pvc-high
spec:
  storageClassName: oci-high
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

Introduzca el siguiente comando para crear la PVC a partir del archivo csi-bvs-PVC-perf.yaml:

kubectl apply -f csi-bvs-pvc-perf.yaml

Una vez creada la PVC, puede utilizarla al crear otros objetos, como pods. Por ejemplo, puede crear un nuevo pod a partir de la siguiente definición de pod, que indica al sistema que utilice la PVC oci-pvc-high:

apiVersion: v1
kind: Pod
metadata:
  name: pod-high
spec:
  containers:
    - name: app
      image: busybox:latest
      command: ["/bin/sh"]
      args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"]
      volumeMounts:
        - name: persistent-storage
          mountPath: /data
  volumes:
    - name: persistent-storage
      persistentVolumeClaim:
        claimName: oci-pvc-high

Al crear el pod, se crea un nuevo volumen en bloque en el servicio de volumen en bloque para respaldar la PVC. El nuevo volumen en bloque tiene el nivel de rendimiento especificado en la definición de clase de almacenamiento oci-high.

Creación de PVC con niveles de rendimiento ultraalto (de 30 a 120 VPU)

Para crear una PVC respaldada por un volumen en bloque con un nivel de Rendimiento ultraalto, debe realizar una serie de pasos. Los pasos se describen en detalle en esta sección, pero, en resumen, debe:

  • Cree un pool de nodos con nodos de trabajador de una unidad soportada.
  • Si asocia un volumen en bloque a instancias informáticas como asociación iSCSI, instale y active el plugin Gestión de volúmenes en bloque en las instancias que alojan los nodos de trabajador.
  • Cree una definición de clase de almacenamiento y defina vpusPerGB en la definición de clase de almacenamiento en un valor entre 30 y 120.
  • Cree una PVC aprovisionada por la clase de almacenamiento e incluya una solicitud de almacenamiento.

Una vez creada una PVC adecuada, puede definir un pod que utilice un volumen en bloque de Rendimiento ultraalto y programar el pod en un nodo que soporte volúmenes en bloque de Rendimiento ultraalto.

Para ofrecer características de Rendimiento ultraalto, los volúmenes en bloque de Rendimiento ultraalto deben estar asociados a instancias informáticas que alojen nodos de trabajador mediante una asociación activada para rutas múltiples. Sin embargo, solo el primer volumen en bloque de Rendimiento ultraalto asociado a una instancia está asociado a una asociación activada para rutas múltiples. Como resultado, solo el primer volumen en bloque de Rendimiento ultraalto asociado a una instancia tiene características de Rendimiento ultraalto.

Si desea utilizar más de un volumen en bloque de Rendimiento ultra alto en un cluster, cree el mismo número de nodos que soporten volúmenes en bloque de Rendimiento ultra alto que los volúmenes en bloque de Rendimiento ultra alto.

Para crear una PVC respaldada por un volumen en bloque con un nivel de Rendimiento ultraalto:

  1. Siga las instrucciones para crear un pool de nodos (consulte Creación de un pool de nodos) y especifique lo siguiente:
    1. Especifique una unidad con hardware dedicado (BM) o de máquina virtual (VM) que esté soportada por Container Engine for Kubernetes y que también soporte el nivel Rendimiento ultraalto.

      Tenga en cuenta que los volúmenes en bloque de Rendimiento ultraalto necesitan unidades que soporten asociaciones activadas para rutas múltiples. Tenga en cuenta también que si desea asociar el volumen en bloque a las instancias informáticas que alojan nodos de trabajador en el pool de nodos como asociación paravirtualizada, VM.Standard.E4. La unidad flexible es la única unidad soportada.

      Consulte:

    2. Especifique una etiqueta para agregar a todos los nodos de trabajador del pool de nodos para indicar que los nodos de trabajador soportan el nivel Rendimiento ultraalto. Por ejemplo, uhp: supported
  2. Si desea asociar un volumen en bloque de Rendimiento ultraalto a las instancias informáticas que alojan nodos de trabajador en el pool de nodos como asociación iSCSI, instale y active el plugin Gestión de volúmenes en bloque en las instancias.

    Hay diferentes formas de instalar y activar el plugin Gestión de volúmenes en bloque, como utilizar la consola o la CLI. También puede instalar y activar el plugin Gestión de volúmenes en bloque especificando un script cloud-init personalizado similar al siguiente:

    #!/bin/bash
    curl --fail -H "Authorization: Bearer Oracle" -L0 http://169.254.169.254/opc/v2/instance/metadata/oke_init_script | base64 --decode >/var/run/oke-init.sh
    bash /var/run/oke-init.sh
    
    echo "Installing oci cli package"
    
    sudo yum install -y python36-oci-cli
    echo "Completed oci cli package"
    
    instance_id=$(curl -H "Authorization: Bearer Oracle" -L http://169.254.169.254/opc/v2/instance/id)
    
    echo "Instance Id : $instance_id"
    
    echo "Updating compute instance agent config."
    
    oci compute instance update --instance-id $instance_id --force --agent-config '{
        "is-agent-disabled": false,
        "plugins-config": [
            {"name": "Block Volume Management", "desiredState": "ENABLED" }
        ]
    }' --auth instance_principal
    
    echo "Update completed for instance agent config."
    

    Tenga en cuenta lo siguiente al instalar y activar el plugin Gestión de volúmenes en bloque:

    • El plugin Gestión de volúmenes en bloque debe poder conectarse a los servicios de Oracle, ya sea porque la instancia informática tiene una dirección IP pública o porque la VCN tiene un gateway de servicios.
    • Los permisos se deben configurar para permitir que el plugin Gestión de volúmenes en bloque informe de los resultados de configuración de iSCSI para asociaciones de iSCSI activadas para rutas múltiples.

    Para obtener más información:

  3. Cree una definición de clase de almacenamiento para volúmenes en bloque con un nivel de rendimiento Rendimiento ultraalto y defina vpusPerGB en la definición de clase de almacenamiento en un valor entre 30 y 120.

    Por ejemplo:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: oci-uhp-sc
    provisioner: blockvolume.csi.oraclecloud.com
    parameters:
      vpusPerGB: "30"
      attachment-type: "iscsi"
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
  4. Cree una PVC aprovisionada por la clase de almacenamiento que acaba de crear e incluya una solicitud de almacenamiento, de la siguiente forma:

    1. Cree un manifiesto para la PVC.

      Por ejemplo, en un archivo denominado csi-bvs-pvc-uhp.yaml:

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: uhp-claim
      spec:
        storageClassName: "oci-uhp-sc"
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 50Gi
    2. Cree la PVC desde el archivo de manifiesto.

      Por ejemplo, introduzca:

      kubectl apply -f csi-bvs-pvc-uhp.yaml

Una vez creada la PVC, puede utilizarla al crear otros objetos, como pods. Por ejemplo, puede crear un nuevo pod a partir de la siguiente definición de pod:

apiVersion: v1
kind: Pod
metadata:
  name: pod-uhp
  labels:
    uhp-pod: "true"
spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: uhp-pod
            operator: In
            values:
            - "true"
        topologyKey: kubernetes.io/hostname
  containers:
    - name: app
      image: iad.ocir.io/odx-oke/oke-public/busybox:latest
      command: ["/bin/sh"]
      args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"]
      volumeMounts:
        - name: persistent-storage
          mountPath: /data
  volumes:
    - name: persistent-storage
      persistentVolumeClaim:
        claimName: uhp-claim
  nodeSelector:
    uhp: supported

En este ejemplo, ha especificado:

  • Etiqueta para el pod que indica que utiliza un volumen en bloque de Rendimiento ultraalto. En este ejemplo, uhp-pod: "true"
  • Una regla de anti-afinidad que utiliza la etiqueta de pod para garantizar que solo se ejecute un pod mediante el volumen en bloque Rendimiento ultraalto en cualquier nodo de trabajador.
  • Un selector de nodos, de modo que el pod solo se ejecute en nodos de trabajador con una etiqueta concreta (derivada de la etiqueta del pool de nodos). En este ejemplo, uhp: supported
  • PVC respaldado por un volumen en bloque de Rendimiento ultraalto. En este ejemplo, claimName: uhp-claim

Al crear un pod basado en la definición, el pod se ejecuta en un nodo de trabajador alojado en una instancia que tiene una unidad adecuada para el nivel de rendimiento Rendimiento ultraalto. Se crea un nuevo volumen en bloque en el servicio de volumen en bloque para respaldar la PVC. El nuevo volumen en bloque tiene el nivel de rendimiento Rendimiento ultraalto especificado en la definición de clase de almacenamiento.

Especificación de tipos de sistemas de archivos para volúmenes en bloque

Los volúmenes en bloque del servicio de volumen en bloque se pueden configurar para diferentes tipos de sistemas de archivos. El sistema de archivos más adecuado para utilizar depende (entre otras cosas) del tamaño de archivo esperado y del número de archivos que se van a procesar. Hay varios tipos de sistemas de archivos disponibles, incluidos:

  • ext3: el tipo de sistema de archivos ext3 incluye capacidades de registro por diario para mejorar la fiabilidad y la disponibilidad. Las comprobaciones de coherencia después de un fallo de alimentación o un cierre incontrolado del sistema no son necesarias.
  • ext4: además de las funciones ext3, el tipo de sistema de archivos ext4 soporta extensiones (bloques físicos contiguos), asignación previa, asignación retrasada, comprobación más rápida del sistema de archivos, registro por diario más sólido y otras mejoras.
  • XFS: el sistema de archivos XFS es un tipo de sistema de archivos de registro por diario de alto rendimiento, que proporciona alta escalabilidad para threads de E/S, ancho de banda del sistema de archivos, tamaño de archivo y sistema de archivos, incluso cuando el sistema de archivos abarca muchos dispositivos de almacenamiento.

Los sistemas de archivos ext3 y ext4 se suelen considerar más adecuados para las aplicaciones que utilizan un único thread de lectura/escritura y archivos pequeños. Mientras que, el sistema de archivos XFS generalmente se considera más adecuado para aplicaciones que tienen varios threads de lectura/escritura y archivos más grandes.

Cuando se crea una PVC mediante el plugin de volumen CSI (provisioner: blockvolume.csi.oraclecloud.com), puede especificar un tipo de sistema de archivos para el volumen en bloque adecuado para la carga de trabajo esperada.

Nota

Los volúmenes en bloque se configuran con un sistema de archivos ext4 por defecto. Si un sistema de archivos ext4 es adecuado para la carga de trabajo esperada, no tiene que especificar explícitamente el tipo de sistema de archivos en la definición de clase de almacenamiento como se describe en el resto de este tema.

Por defecto, los volúmenes en bloque se configuran con un sistema de archivos ext4. Si el sistema de archivos ext4 no es el más adecuado para la carga de trabajo esperada, puede especificar un tipo de sistema de archivos alternativo en la definición de clase de almacenamiento.

Para crear una PVC respaldada por un volumen en bloque con un sistema de archivos ext3 o XFS, defina el parámetro fstype en la definición de clase de almacenamiento personalizada de la siguiente forma:

  • para ext3, defina csi.storage.k8s.io/fstype: ext3
  • para XFS, establezca csi.storage.k8s.io/fstype: xfs

Por ejemplo, para crear una PVC respaldada por un volumen en bloque con un sistema de archivos ext3:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: oci-bv-ext3
provisioner: blockvolume.csi.oraclecloud.com
parameters:
  csi.storage.k8s.io/fstype: ext3
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForConsumer

Cree un manifiesto para una PVC aprovisionada por la clase de almacenamiento oci-bv-ext3 e incluya una solicitud de almacenamiento. Por ejemplo, en un archivo denominado csi-bvs-pvc-fstype.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: oci-bv-claim-ext3
spec:
  storageClassName: oci-bv-ext3
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi

Introduzca el siguiente comando para crear la PVC a partir del archivo csi-bvs-PVC-fstype.yaml:

kubectl apply -f csi-bvs-pvc-fstype.yaml

Una vez creada la PVC, puede utilizarla al crear otros objetos, como pods. Por ejemplo, puede crear un nuevo pod a partir de la siguiente definición de pod, que indica al sistema que utilice la PVC oci-bv-claim-ext3 como volumen nginx, montado por el pod en /data.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - name: http
          containerPort: 80
      volumeMounts:
        - name: data
          mountPath: /usr/share/nginx/html
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: oci-bv-claim-ext3

Tras crear el nuevo pod, puede verificar que la PVC se haya enlazado a un nuevo volumen persistente introduciendo:

kubectl get pvc

La salida del comando anterior confirma que la PVC se ha enlazado:

			
NAME                    STATUS    VOLUME                               CAPACITY   ACCESSMODES   STORAGECLASS        AGE
oci-bv-claim-ext3       Bound     ocid1.volume.oc1.iad.<unique_ID>     50Gi       RWO           oci-bv-ext3         4m

Puede verificar que el pod está utilizando la nueva reclamación de volumen persistente introduciendo:

kubectl describe pod nginx

Tenga en cuenta que no puede cambiar posteriormente el sistema de archivos de un volumen en bloque que realiza una copia de seguridad de PVC. En su lugar, debe definir una nueva clase de almacenamiento, definir el sistema de archivos según sea necesario y crear una nueva PVC aprovisionada por esa nueva clase de almacenamiento.