Adición de File Storage for VPC a apps

Red Hat OpenShift on IBM Cloud Ofrece clases de almacenamiento predefinidas que puede utilizar para aprovisionar File Storage for VPC para las aplicaciones de su clúster. Cada clase de almacenamiento especifica el tamaño disponible, las IOPS, el sistema de archivos y la política de retención para el recurso compartido de archivos que se aprovisiona. También puede crear sus propias clases de almacenamiento para su caso de uso.

Revise las siguientes notas y consideraciones antes de continuar.

  • Después de suministrar un tipo específico de almacenamiento utilizando una clase de almacenamiento, no puede cambiar el tipo ni la política de retención del dispositivo de almacenamiento. Sin embargo, puede cambiar el tamaño y el IOPS si desea aumentar la capacidad de almacenamiento y el rendimiento. Para cambiar el tipo y la política de retención de su almacenamiento, debe crear una nueva instancia de almacenamiento y copiar los datos de la instancia de almacenamiento anterior a la nueva.
  • Si su clúster y VPC están en grupos de recursos separados, entonces antes de que pueda aprovisionar recursos compartidos de archivos, debe crear su propia clase de almacenamiento y proporcionar su ID de grupo de recursos de VPC en la sección resourceGroup junto con el ID de grupo de seguridad kube-<clusterID> en la sección securityGroupIDs. Para recuperar el ID del grupo de seguridad haga lo siguiente. Para obtener más información, consulte Crear su propia clase de almacenamiento.
  • Se introdujeron nuevas reglas de grupo de seguridad en las versiones de clúster. 4.11 y después. Estos cambios de reglas significan que debes sincronizar tus grupos de seguridad antes de poder usarFile Storage for VPC. Para más información, ver AñadiendoFile Storage for VPC a aplicaciones.
  • Se agregaron nuevas clases de almacenamiento con la versión2.0 del complemento. Ya no puede aprovisionar nuevos recursos compartidos de archivos que utilicen clases de almacenamiento más antiguas. Los volúmenes existentes que utilizan las clases de almacenamiento más antiguas siguen funcionando; sin embargo, no se pueden expandir los volúmenes que se crearon utilizando las clases más antiguas. Para obtener más información, consulte la Migrar a una nueva clase de almacenamiento.
  • La creación de un PVC mediante StorageClassSecrets no es posible.
  • Asegúrese de que el usuario que crea el clúster tiene los permisos de Lector, Escritor y Operador para los Servicios de Infraestructura VPC.
  • Asegúrese de configurar una autorización de servicio desde VPC Infrastructure a KMS/HPCS si planea utilizar cifrado en sus archivos compartidos.

IBM Cloud está cambiando los servicios de gestión de claves dedicados de Hyper Protect Crypto Services a Key Protect Dedicated.

Se introdujeron nuevas reglas de grupos de seguridad en las versiones 4.11 y posteriores. Estos cambios en las reglas significan que debe sincronizar sus grupos de seguridad antes de poder utilizar File Storage for VPC. Si su clúster se creó inicialmente en la versión 4.11 o anterior, ejecute los siguientes comandos para sincronizar la configuración de su grupo de seguridad.

  1. Consigue el ID de tu clúster.
    ibmcloud oc cluster ls
    
  2. Obtenga el ID del grupo de seguridad kube-<clusterID>.
    ibmcloud is sg kube-CLUSTER_ID  | grep ID
    
  3. Sincronice el grupo de seguridad kube-<clusterID> utilizando el ID que recuperó en el paso anterior.
    ibmcloud ks security-group sync -c CLUSTER_ID --security-group ID
    

Guía de inicio rápido para File Storage for VPC

Crea una solicitud de volumen persistente (PVC) para aprovisionar dinámicamente un File Storage for VPC e para tu clúster. El aprovisionamiento dinámico crea automáticamente el volumen persistente (PV) correspondiente y solicita el recurso compartido de archivos en tu cuenta.

Ahora puedes elegir una clase de almacenamiento de segunda generación.

  1. Acceda al clúster de Red Hat OpenShift.

  2. Revise las clases de almacenamiento preinstaladas ejecutando el mandato siguiente. Para obtener más información, consulte referencia de clases de almacenamiento.

    oc get sc | grep vpc-file
    
  3. Guarde el siguiente archivo YAML en un archivo. Este ejemplo crea una reclamación denominada my-pvc utilizando la clase de almacenamiento ibmc-vpc-file-min-iops con un tamaño de gigabyte de 10Gi.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-pvc # Enter a name for your PVC.
    spec:
      accessModes:
      - ReadWriteMany # The file share can be mounted on multiple nodes and pods.
      resources:
        requests:
          storage: 20Gi # Enter the size of the storage in gigabytes (Gi).
      storageClassName: ibmc-vpc-file-min-iops # Enter the name of the storage class that you want to use.
    
  4. Cree la PVC.

    oc apply -f my-pvc.yaml
    
  5. Verifique que la PVC se ha creado y se ha vinculado al PV.

    oc describe pvc my-pvc
    

    Salida de ejemplo

    Name:        my-pvc
    Namespace:    default
    StorageClass:    ""
    Status:        Bound
    Volume:        pvc-0d787071-3a67-11e7-aafc-eef80dd2dea2
    Labels:        <none>
    Capacity:    20Gi
    Access Modes:    RWX
    Events:
        FirstSeen    LastSeen    Count    From                                SubObjectPath    Type        Reason            Message
        ---------    --------    -----    ----                                -------------    --------    ------            -------
        1m        1m        1    {ibm.io/ibmc-vpc-file 31898035-3011-11e7-a6a4-7a08779efd33 }            Normal        ProvisioningSucceeded    Successfully provisioned volume pvc-0d787071-3a67-11e7-aafc-eef80dd2dea2
    
  6. Guarde la siguiente configuración de despliegue en el archivo denominado deployment.yaml y haga referencia a la PVC que ha creado en el paso anterior.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
      labels:
        app: my-deployment
    spec:
      selector:
        matchLabels:
          app: busybox
      template:
        metadata:
          labels:
            app: busybox
        spec:
          containers:
          - name: busybox
            image: busybox:1.28
            command: [ "sh", "-c", "sleep 1h" ]
            volumeMounts:
            - name: my-vol
              mountPath: /data/demo # Mount path for the application.
          volumes:
          - name: my-vol
            persistentVolumeClaim:
              claimName: my-pvc # Your PVC name.
    
    volumeMounts.mountPath
    En la sección de montajes de volúmenes de contenedor, especifique la vía de acceso absoluta del directorio en el que está montado el volumen dentro del contenedor. Los datos que se escriben en la vía de acceso de montaje se almacenan en el directorio root de la instancia de File Storage for VPC físicos. Si desea compartir un volumen entre diferentes aplicaciones, puede especificar subrutas del volumen para cada una de sus aplicaciones.
    volumeMounts.name
    En la sección de montajes de volúmenes de contenedor, especifique el nombre del volumen que se va a montar en el pod.
    volume.name
    En la sección de volúmenes, especifique el nombre del volumen que se va a montar en el pod. Normalmente, este nombre es el mismo que volumeMounts.name.
    claimName
    En la sección de reclamación de volúmenes persistentes, especifique el nombre de la PVC que enlaza el PV que desea utilizar.
  7. Cree el despliegue.

    oc apply -f deployment.yaml
    
  8. Verifique que el PV se ha montado correctamente.

    oc describe deployment my-deployment
    

    El punto de montaje se muestra en el campo Volume Mounts y el volumen se muestra en el campo Volumes.

    Containers:
      Mounts:
        /data/demo from my-vol (rw)
    Volumes:
    my-vol:
      Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
      ClaimName:  my-pvc
      ReadOnly:   false
    
  9. Opcional: después de que el pod se esté ejecutando, intente expandir el volumen de almacenamiento.

Migrar a una nueva clase de almacenamiento

  • Se agregaron nuevas clases de almacenamiento con la versión2.0 del complemento.
  • Ya no puede aprovisionar nuevos recursos compartidos de archivos que utilicen clases de almacenamiento más antiguas.
  • Los volúmenes existentes que utilizan las clases de almacenamiento más antiguas siguen funcionando; sin embargo, no se pueden expandir los volúmenes que se crearon utilizando las clases más antiguas.
  • Si necesita la función de expansión de volumen, complete los siguientes pasos para migrar sus aplicaciones a una clase de almacenamiento más nueva.
  • Si no necesita la función de expansión de volumen, no necesita migrar y sus PVC seguirán funcionando normalmente.
  • Los siguientes pasos cubren la migración manual.
  1. Busque el PVC que desea migrar y anote tanto el nombre del PVC como el nombre del PV asociado.

    oc get pvc
    
  2. Reduzca la escala de su aplicación que utiliza PVC.

    oc scale deployment DEPLOYMENT --replicas 0
    
  3. Edite el objeto PV que utiliza su aplicación para cambiar la política de recuperación a Retain y clase de almacenamiento para ibmc-vpc-file-min-iops.

    kubectl edit pv PV
    
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 20Gi
      claimRef:
        apiVersion: v1
        kind: PersistentVolumeClaim
        name: <pvc-name>
        namespace: default
        ...
      persistentVolumeReclaimPolicy: Retain # Change delete to retain
      storageClassName: ibmc-vpc-file-min-iops # Enter a new storage class
      volumeMode: Filesystem
    
  4. Elimine el objeto de PVC existente.

    kubectl delete pvc PVC
    
  5. Edite el PV nuevamente y elimine el claimRef sección.

    kubectl edit pv PV
    
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 20Gi
      #claimRef:
        #apiVersion: v1
        #kind: PersistentVolumeClaim
        #name: <pvc-name>
        #namespace: default
        #resourceVersion: "381270"
        #uid: 4042f319-1233-4187-8549-8249a840a8dd
    
  6. Cree un PVC que tenga el mismo nombre y el mismo tamaño que su PVC anterior. Esto debe hacerse uno por uno para todos los PVC afectados.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: <pvc-name>
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: <size>Gi
      storageClassName: ibmc-vpc-file-min-iops
    
  7. Amplíe su aplicación que utilizaba PVC.

    k scale deployment DEPLOYMENT --replicas x
    
  8. Para continuar usando la expansión de volumen, consulte Configurar la expansión de volumen.

Configuración de la expansión del volumen

Para suministrar volúmenes que admitan la expansión, debe utilizar la clase de almacenamiento que tiene allowVolumeExpansion establecido en true.

El complemento de clúster de File Storage for VPC admite la expansión tanto en modo en línea como fuera de línea. Sin embargo, la expansión solo es posible dentro del tamaño y el rango de IOPs establecidos en el perfil File Storage for VPC.

Se introdujeron nuevas clases de almacenamiento con la versión 2.0. La expansión de volumen no funciona para recursos compartidos que utilizan clases de almacenamiento de versiones anteriores del complemento.

Antes de empezar

Expansión de un volumen montado

  1. Después de montar la PVC mediante un pod de app, puede ampliar el volumen editando el valor del campo spec.resources.requests.storage de la PVC. Para ampliar el volumen, edite la PVC y aumente el valor del campo spec.resources.requests.storage.

    kubectl edit pvc my-pvc
    
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 50Gi
    
  2. Guarde y cierre la PVC. Espere unos minutos a que se expanda el volumen.

  3. Comprueba que el volumen esté expandido.

    kubectl get pvc
    

    Salida de ejemplo

    NAME     STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE
    my-pvc   Bound    pvc-25b6912e-75bf-41ca-b6b2-567fa4f9d245   50Gi       RWX            ibmc-vpc-file-min-iops   3m31s
    

Conexión del almacenamiento de archivos existente a una app

Crea una solicitud de volumen persistente (PVC) para aprovisionar de forma estática un File Storage for VPC e para tu clúster. El suministro estático permite a los administradores de clúster poner los dispositivos de almacenamiento existentes a disposición de un clúster.

  1. Obtenga el ID del clúster.

    ibmcloud ks cluster ls
    
  2. Obtén el ID de tu grupo de seguridad kube-<clusterID>.

    ibmcloud is sg kube-CLUSTER_ID  | grep ID
    
  3. Cree una compartición de archivos. Para obtener más información, consulte Creación de comparticiones de archivos y destinos de montaje.

    ibmcloud is share-create --name my-file-share --zone us-south-2 --profile dp2 --size 1000 --iops 1000
    
  4. Cree un destino de montaje compartido y especifique el ID del grupo de seguridad kube-<clusterID> que recuperó anteriormente en la opción --vni-sgs.

    ibmcloud is share-mount-target-create my-file-share --subnet my-subnet --name NAME --vni-name my-share-vni-1  --vni-sgs kube-CLUSTER_ID --resource-group-name Default --vpc ID
    
  5. Antes de poder crear un volumen persistente (PV), recupere los detalles sobre la compartición de archivos.

    ibmcloud is shares
    
  6. Consulta los detalles de tu participación. Anote los destinos de montaje.

    ibmcloud is share SHARE-ID
    

    Mandato de ejemplo.

    ibmcloud is share r134-bad98878-1f63-45d2-a3fd-60447094c2e6
    

    Salida de ejemplo

    ID                           r134-bad98878-1f63-45d2-a3fd-60447094c2e6   
    Name                         pvc-e7e005a9-e96b-41ad-9d6e-74650a9110a0   
    CRN                          crn:v1:staging:public:is:us-south-1:a/77f2bceddaeb577dcaddb4073fe82c1c::share:r134-bad98878-1f63-45d2-a3fd-60447094c2e6   
    Lifecycle state              stable   
    Access control mode          security_group   
    Zone                         us-south-1   
    Profile                      dp2   
    Size(GB)                     10   
    IOPS                         100   
    User Tags                    clusterid:cpjao3l20dl78jadqkd0,namespace:default,provisioner:vpc.file.csi.ibm.io,pv:pvc-e7e005a9-e96b-41ad-9d6e-74650a9110a0,pvc:pv-file,reclaimpolicy:delete,storageclass:custom-eni   
    Encryption                   provider_managed   
    Mount Targets                ID                                          Name      
                                r134-aa2aabb8-f616-47be-886b-99220852b728   pvc-e7e005a9-e96b-41ad-9d6e-74650a9110a0      
    Resource group               ID                                 Name      
                                300b9469ee8676f9a038ecdf408c1a9d   Default      
    Created                      2024-06-11T19:55:11+05:30   
    Replication role             none   
    Replication status           none   
    Replication status reasons   Status code   Status message      
    
  7. Obtenga el nfsServerPath, también denominado Mount Path.

    ibmcloud is share-mount-target SHARE-ID SHARE-TARGET-ID
    

    Mandato de ejemplo.

    ibmcloud is share-mount-target  r134-bad98878-1f63-45d2-a3fd-60447094c2e6 r134-aa2aabb8-f616-47be-886b-99220852b728
    

    Salida de ejemplo

    ID                          r134-aa2aabb8-f616-47be-886b-99220852b728   
    Name                        pvc-e7e005a9-e96b-41ad-9d6e-74650a9110a0   
    VPC                         ID                                          Name      
                                r134-f05922d4-d8ab-4f64-9a3d-82664b303bc1   vpc-public      
    Access control mode         security_group   
    Resource type               share_mount_target   
    Virtual network interface   ID                                          Name      
                                0716-6407fb4b-e962-49c4-8556-dc94f4574b4b   defective-chloride-huffy-gladly      
    Lifecycle state             stable   
    Mount path                  10.240.0.23:/89d8a454_f552_42bf_8374_4d31481edf4d   
    Transit Encryption          none   
    Created                     2024-06-11T19:55:12+05:30
    
  8. Cree un archivo de configuración PV denominado static-file-share.yaml que haga referencia a la compartición de archivos.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: static-file-share
    spec:
      mountOptions:
      - hard
      - nfsvers=4.1
      - sec=sys
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 10Gi
      csi:
        volumeAttributes:
          nfsServerPath: NFS-SERVER-PATH
        driver: vpc.file.csi.ibm.io
        volumeHandle: FILE-SHARE-ID#SHARE-TARGET-ID
    
  9. Cree el PV.

    oc apply -f static-file-share.yaml
    
  10. Cree una PVC.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-static
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      storageClassName: "" #Leave the storage class blank.
    
  11. Cree la PVC para enlazar el PV.

    oc apply -f pvc-static.yaml
    
  12. Cree un nombre de archivo de despliegue testpod.yaml para adjuntar su fileshare a un pod de aplicación.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: testpod
      labels:
        app: testpod
    spec:
      selector:
        matchLabels:
          app: busybox
      template:
        metadata:
          labels:
            app: busybox
        spec:
          containers:
          - name: busybox
            image: busybox:1.28
            command: [ "sh", "-c", "sleep 1h" ]
            volumeMounts:
            - name: my-vol
              mountPath: /data/demo # Mount path for the application.
          volumes:
          - name: pvc-name
            persistentVolumeClaim:
              claimName: pvc-static # The name of the PVC that you created earlier
    
    spec.containers.volumeMounts.mountPath
    Especifique la vía de acceso absoluta del directorio en el que está montado el volumen dentro del contenedor. Los datos que se escriben en la vía de acceso de montaje se almacenan en el directorio root de la instancia de File Storage for VPC físicos. Si desea compartir un volumen entre diferentes aplicaciones, puede especificar subrutas del volumen para cada una de sus aplicaciones.
    volumeMounts.name
    Especifique el nombre del volumen que se va a montar en el pod.
    volume.name
    Especifique el nombre del volumen que se va a montar en el pod. Normalmente, este nombre es el mismo que volumeMounts.name.
    volumes.persistentVolumeClaim.claimName
    Introduce el nombre del PVC al que está vinculado el PV que deseas utilizar.
  13. Cree el despliegue.

    oc apply -f testpod.yaml
    

Creación de su propia clase de almacenamiento

Puedes crear tu propia clase de almacenamiento personalizada con la configuración que prefieras para tu instancia de File Storage for VPC. Para mantener los costes bajos, puede aprovisionar inicialmente un PVC con un caudal mínimo y, más adelante, acceder al PVC y ajustar el caudal a medida que se definan mejor las necesidades.

Si necesita las características siguientes, debe crear su propia clase de almacenamiento.

  • La app debe ejecutarse como no root.
  • El clúster está en un grupo de recursos diferente de la VPC y la subred.
  • Debe limitar el acceso de compartición de archivos a los pods en un nodo determinado o en una zona determinada.
  • Es necesario que traiga su propio cifrado (BYOK) utilizando un proveedor de KMS como HPCS o Key Protect.
  • Debe especificar manualmente la subred o la dirección IP de la Interfaz de red virtual(VNI).
  • Necesitas más control sobre la capacidad y el ancho de banda. En este caso, puede utilizar el perfil rfs. Para obtener más información, consulte Descripción general de los archivos compartidos regionales.
  • Si desea redondear automáticamente al alza la capacidad solicitada del PVC hasta la capacidad mínima admitida para un perfil dp2 de IOPS fijo. Para obtener más información, consulte Activación del redondeo automático de la capacidad para perfiles de IOPS fijos.

Si su clúster y su VPC no están en el mismo grupo de recursos, debe especificar el ID del grupo de recursos de la VPC en la sección resourceGroup y el ID del grupo de seguridad kube-<clusterID> en la sección securityGroupIDs. Puede encontrar el ID del grupo de seguridad kube-<clusterID> ejecutando ibmcloud is sg kube-CLUSTER_ID | grep ID.

  1. Crea un archivo de configuración de clase de almacenamiento. El siguiente ejemplo utiliza el perfil dp2. Elija entre una clase de almacenamiento de primera generación y una de segunda generación.

    Ejemplo de primera generación:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: ibmc-vpc-file-custom-sc
      labels:
        app.kubernetes.io/name: ibm-vpc-file-csi-driver
    provisioner: vpc.file.csi.ibm.io
    mountOptions:
      - hard
      - nfsvers=4.1
      - sec=sys
    parameters:
        profile: "dp2" # or rfs
        billingType: "hourly" # hourly or monthly
        encrypted: "false"
        encryptionKey: "" # If encrypted is true, then a user must specify the CRK-CRN.
        resourceGroup: "" # Resource group ID. By default, the resource group of the cluster will be used from storage-secrete-store secret.
        isENIEnabled: "true" # VPC File Share VNI feature will be used by all PVCs created with this storage class.
        securityGroupIDs: "" # By default cluster security group i.e kube-<clusterID> will be used. User can provide their own comma separated SGs.
        subnetID: "" # User can provide subnetID in which the VNI will be created. Zone and region are mandatory for this. If not provided CSI driver will use the subnetID available in the cluster's VPC zone.
        region: "" # VPC CSI driver will select a region from cluster node's topology. The user can override this default.
        zone: "" # VPC CSI driver will select a region from cluster node's topology. The user can override this default.
        primaryIPID: "" # Existing ID of reserved IP from the same subnet as the file share zone. Zone and region are mandatory for this. SubnetID is not mandatory for this.
        primaryIPAddress: "" # IPAddress for VNI to be created in the subnet of the zone. Zone, region and subnetID are mandatory for this.
        iops: "" # Example: 100, this option is valid only for the dp2 profile.
        allowCapacityRoundoffForIops: "true" # Optional. Enables automatic capacity roundoff for fixed IOPS dp2 profiles. When set to "true", if the requested PVC size is lower than the minimum supported capacity for the requested IOPS, the driver automatically provisions the volume at the minimum supported capacity. Disabled by default. Requires a Virtual Private Endpoint Gateway (VPEG) to IBM Global Catalog.
        throughput: "" # Example: 2000, this option is valid only for the rfs profile
        tags: "" # User can add a list of tags "a, b, c" that will be used at the time of provisioning file share, by default CSI driver has its own tags.
        uid: "0" # The initial user identifier for the file share, by default its root.
        gid: "0" # The initial group identifier for the file share, by default its root.
        classVersion: "1"
    reclaimPolicy: "Delete"
    allowVolumeExpansion: true
    

    Ejemplo de segunda generación:

    Si aprovisiona un PVC de 10Gi utilizando la clase de almacenamiento de primera generación ibmc-vpc-file-min-iops, la IOPS máxima es de 1.000. La asignación predeterminada es 100 y el rendimiento está fijado en 210 Mbps, que no se puede ajustar.

    Sin embargo, si se aprovisiona un PVC de 10Gi utilizando la clase de almacenamiento de segunda generación ibmc-vpc-file-regional, las IOPS se fijan en 35.000 y el rendimiento máximo se puede ajustar hasta 8192 Mbps, aunque por defecto es de 8 Mbps.

    Por otro ejemplo, si inicialmente aprovisionas un PVC con un tamaño inferior a 16 TB e IOPS 500 fijas utilizando la clase de almacenamiento de primera generación ibmc-vpc-file-500-iops, las IOPS y el rendimiento son fijos y se calculan en función del tamaño y las IOPS.

    Para ampliar ese PVC más allá de 16 TB, entonces la primera generación de la clase de almacenamiento ibmc-vpc-file-500-iops no puede funcionar. En cambio, si se utiliza la clase de almacenamiento de segunda generación ibmc-vpc-file-regional-max-bandwidth, se puede aprovisionar un PVC de cualquier tamaño de hasta 32 TB y tiene hasta 35000 IOPS y un rendimiento predeterminado de 8192 Mbps, que se puede ajustar.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: ibmc-vpc-file-regional-max-bandwidth
      labels:
        app.kubernetes.io/name: ibm-vpc-file-csi-driver
      annotations:
        version: v2.0
        revision: "1"
    provisioner: vpc.file.csi.ibm.io
    mountOptions:
      - hard
      - nfsvers=4.1
      - sec=sys
    parameters:
      profile: "rfs" # general-purpose, sdp, 5iops-tier, 10iops-tier, or custom
      billingType: "hourly"
      encrypted: "false"
      encryptionKey: ""
      resourceGroup: ""
      throughput: "8192" # Example: 2000
      classVersion: "1"
      isENIEnabled: "true"   # VPC File Share ENI/VNI feature will be used by all PVCs created with this storage class.
      securityGroupIDs: ""   # By default cluster security group i.e kube-<clusterID> will be used. User can provide their own command separated SGs.
      subnetID: ""         # User can provide subnetID in which the ENI/VNI will be created.If not provided CSI driver will use the subnetID available in the cluster' VPC zone.
      primaryIPID: ""      # Existing ID of reserved IP from any of subnets within the VPC,subnetID is not mandatory for this.
      primaryIPAddress: "" # IPAddress for ENI/VNI to be created in the respective subnet,subnetID is mandatory for this.
      uid: "0"             # The initial user identifier for the file share, by default its root.
      gid: "0"             # The initial group identifier for the file share, by default its root.
    allowVolumeExpansion: true # Select true or false. Only supported on version 3.0.1 and later
    reclaimPolicy: "Delete"
    
  2. Cree la clase de almacenamiento personalizada en su clúster.

    oc apply -f custom-storageclass.yaml
    
  3. Verifique que la clase de almacenamiento está disponible en el clúster.

    oc get sc
    

    Salida de ejemplo

    ibmc-vpc-file-custom-sc                       vpc.file.csi.ibm.io
    

Configuración de la clase de almacenamiento predeterminada

  • Cambiar la clase de almacenamiento predeterminada solo está disponible para la versión del complemento 2.0 o posterior.
  • Puede establecer la clase de almacenamiento predeterminada en una de las clases File Storage for VPC preinstaladas o en su propia clase de almacenamiento personalizada. Si está utilizando una clase de almacenamiento personalizada, asegúrese de que el aprovisionador se establece en vpc.file.csi.ibm.io.
  • Si se establecen varias clases de almacenamiento como predeterminadas en un clúster, puede utilizarse cualquiera de ellas. Como práctica recomendada, y para garantizar que se utiliza la clase de almacenamiento correcta, elimine cualquier clase de almacenamiento predeterminada existente en el clúster antes de establecer una nueva clase predeterminada. Si también se ha instalado el complemento de almacenamiento en bloques de VPC, es posible que ya se haya establecido una clase de almacenamiento en bloques de VPC como predeterminada. Para eliminarlo antes de establecer un nuevo valor por defecto, consulta Cambiar la clase de almacenamiento predeterminada para el almacenamiento en bloques de VPC.
  1. Edita el configmap addon-vpc-file-csi-driver-configmap y especifica el nombre de la clase de almacenamiento en el parámetro SET_DEFAULT_STORAGE_CLASS.

    oc edit cm addon-vpc-file-csi-driver-configmap -n kube-system
    

    Salida de ejemplo

    SET_DEFAULT_STORAGE_CLASS: "ibmc-vpc-file-eit"
    
  2. Verifique que el valor predeterminado se establece correctamente mediante la descripción de la file-csi-driver-status configmap.

    oc describe cm file-csi-driver-status -n kube-system
    

    Ejemplo de salida.

    events:
    ----
    - event: EnableVPCFileCSIDriver
      description: 'VPC File CSI Driver enable successful, DriverVersion: v2.0.6'
      timestamp: "2024-09-20 12:01:02"
    - event: Change default storage class request
      description: Successfully set 'ibmc-vpc-file-eit' as default storage class
      timestamp: "2024-09-20 12:01:36"
    

Despliegue de una app que se ejecuta como no root

Los parámetros « uid » y « gid » de la clase de almacenamiento establecen los identificadores iniciales de usuario y grupo para el recurso compartido de archivos a nivel de infraestructura. Para obtener información general sobre cómo funcionan los identificadores complementarios en el almacenamiento de archivos de VPC, consulta « Identificadores complementarios para recursos compartidos de archivos de VPC ».

  1. Cree su propia clase de almacenamiento y especifique el ID de grupo o el ID de usuario que desea utilizar para la app.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: ibmc-vpc-file-custom-sc
      labels:
        app.kubernetes.io/name: ibm-vpc-file-csi-driver
    provisioner: vpc.file.csi.ibm.io
    mountOptions:
      - hard
      - nfsvers=4.1
      - sec=sys
    parameters:
        profile: "dp2"
        iops: "100"
        billingType: "hourly" # hourly or monthly
        encrypted: "false"
        uid: "3000" # The initial user identifier for the file share.
        gid: "1000" # The initial group identifier for the file share.
        classVersion: "1"
    reclaimPolicy: "Delete"
    allowVolumeExpansion: true
    
  2. Guarde el YAML siguiente en un archivo denominado my-pvc.yaml.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-pvc
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      storageClassName: ibmc-vpc-file-custom-sc
    
  3. Cree la PVC.

    oc apply -f my-pvc.yaml
    
  4. Cree un pod que monte la PVC.

    apiVersion: v1
    kind: Pod
    metadata:
      name: security-context-demo
    spec:
      securityContext:
        runAsUser: 3000
        runAsGroup: 1000
      volumes:
      - name: sec-ctx-vol
        persistentVolumeClaim:
            claimName: my-pvc
      containers:
      - name: sec-ctx-demo
        image: busybox:1.28
        command: [ "sh", "-c", "sleep 1h" ]
        volumeMounts:
        - name: sec-ctx-vol
          mountPath: /data/demo
        securityContext:
          allowPrivilegeEscalation: false
    
  5. Comprueba que el pod esté en funcionamiento.

    oc get pods
    

Configuración del cifrado KMS para File Storage for VPC

Utilice un proveedor de servicios de gestión de claves (KMS), como IBM® Key Protect o Hyper Protect Crypto Services, para crear una clave raíz privada que utilizará en su instancia de File Storage for VPC para cifrar los datos a medida que se escriben en el almacenamiento. Una vez creada la clave raíz privada, crea tu propia clase de almacenamiento o un secreto de Kubernetes con tu clave raíz y, a continuación, utiliza esta clase de almacenamiento o este secreto para aprovisionar tu instancia de File Storage for VPC.

  1. Crea una instancia del proveedor KMS que desees utilizar.

  2. Crea una clave raíz en tu instancia de KMS.

  3. Complete los requisitos previos para el cifrado gestionado por el cliente y autorice a File Storage for VPC a acceder a IBM® Key Protect. Asegúrese de dar File Storage for VPC al menos Reader acceso a su instancia KMS.

  4. Cree una clase de almacenamiento personalizada y especifique los detalles de su KMS.

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: custom-sc-encrypted
      labels:
        app.kubernetes.io/name: ibm-vpc-file-csi-driver
    provisioner: vpc.file.csi.ibm.io
    mountOptions:
      - hard
      - nfsvers=4.1
      - sec=sys
    parameters:
        profile: "dp2"
        billingType: "hourly" # hourly or monthly
        encrypted: "true"
        encryptionKey: "" # Specify the root key CRN.
        resourceGroup: "" # Resource group ID. By default, the resource group of the cluster will be used from storage-secrete-store secret.
        isENIEnabled: "true" # VPC File Share VNI feature will be used by all PVCs created with this storage class.
        securityGroupIDs: "" # By default cluster security group i.e kube-<clusterID> will be used. User can provide their own comma separated SGs.
        subnetID: "" # User can provide subnetID in which the VNI will be created. Zone and region are mandatory for this. If not provided CSI driver will use the subnetID available in the cluster's VPC zone.
        region: "" # VPC CSI driver will select a region from cluster node's topology. The user can override this default.
        zone: "" # VPC CSI driver will select a region from cluster node's topology. The user can override this default.
        primaryIPID: "" # Existing ID of reserved IP from the same subnet as the file share zone. Zone and region are mandatory for this. SubnetID is not mandatory for this.
        primaryIPAddress: "" # IPAddress for VNI to be created in the subnet of the zone. Zone, region and subnetID are mandatory for this.
        tags: "" # User can add a list of tags "a, b, c" that will be used at the time of provisioning file share, by default CSI driver has its own tags.
        uid: "0" # The initial user identifier for the file share, by default its root.
        gid: "0" # The initial group identifier for the file share, by default its root.
        classVersion: "1"
    reclaimPolicy: "Delete"
    allowVolumeExpansion: true
    
  5. Cree la clase de almacenamiento.

    oc apply -f encrypted-class.yaml
    
  6. Guarde el YAML siguiente en un archivo denominado my-pvc.yaml.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-pvc
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      storageClassName: custom-sc-encrypted
    
  7. Cree la PVC.

    oc apply -f my-pvc.yaml
    
  8. Guarde la siguiente configuración de despliegue en el archivo denominado deployment.yaml y haga referencia a la PVC que ha creado en el paso anterior.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
      labels:
        app: my-deployment
    spec:
      selector:
        matchLabels:
          app: busybox
      template:
        metadata:
          labels:
            app: busybox
        spec:
          containers:
          - name: busybox
            image: busybox:1.28
            command: [ "sh", "-c", "sleep 1h" ]
            volumeMounts:
            - name: my-vol
              mountPath: /data/demo # Mount path for the application.
          volumes:
          - name: my-vol
            persistentVolumeClaim:
              claimName: my-pvc # Your PVC name.
    
    volumeMounts.mountPath
    En la sección de montajes de volúmenes de contenedor, especifique la vía de acceso absoluta del directorio en el que está montado el volumen dentro del contenedor. Los datos que se escriben en la vía de acceso de montaje se almacenan en el directorio root de la instancia de File Storage for VPC físicos. Si desea compartir un volumen entre diferentes aplicaciones, puede especificar subrutas del volumen para cada una de sus aplicaciones.
    volumeMounts.name
    En la sección de montajes de volúmenes de contenedor, especifique el nombre del volumen que se va a montar en el pod.
    volume.name
    En la sección de volúmenes, especifique el nombre del volumen que se va a montar en el pod. Normalmente, este nombre es el mismo que volumeMounts.name.
  9. Cree el despliegue.

    oc apply -f deployment.yaml
    

Configuración del cifrado en tránsito (EIT)

Para configurar el cifrado en tránsito para File Storage for VPC, consulta « Cifrado en tránsito para IBM Cloud File Storage for VPC ». Este tema abarca tanto los recursos compartidos de archivos zonales (perfil « dp2 ») como los recursos compartidos de archivos regionales (perfil « rfs », versión beta).

Actualización de las solicitudes y los límites de recursos de los contenedores

Puedes personalizar las solicitudes y los límites de recursos de CPU y memoria para los contenedores que se ejecutan en el complemento « File Storage for VPC ». Ajustar estos valores puede ayudarte a optimizar el rendimiento en clústeres de gran tamaño o en entornos con recursos limitados.

Los parámetros siguen el patrón de nomenclatura <ContainerName>CPULimit, <ContainerName>CPURequest, <ContainerName>MemoryLimit y <ContainerName>MemoryRequest. Aplícalos a los contenedores del controlador y del servidor de nodos.

  1. Edita el mapa de configuración « addon-vpc-file-csi-driver-configmap » y añade los parámetros de recurso para los contenedores que quieras ajustar. En el siguiente ejemplo se configuran los valores de CPU y memoria para los contenedores del controlador y del servidor de nodos.

    oc edit cm addon-vpc-file-csi-driver-configmap -n kube-system
    

    Valores de ejemplo:

    controllerCPULimit: "200m"
    controllerCPURequest: "100m"
    controllerMemoryLimit: "256Mi"
    controllerMemoryRequest: "128Mi"
    nodeServerCPULimit: "200m"
    nodeServerCPURequest: "100m"
    nodeServerMemoryLimit: "256Mi"
    nodeServerMemoryRequest: "128Mi"
    
  2. Comprueba que los cambios en el recurso se hayan aplicado correctamente consultando el mapa de configuración « file-csi-driver-status ». Busca un evento de « Successfully set container resources » en la sección « events ».

    oc describe cm file-csi-driver-status -n kube-system
    

    Salida de ejemplo:

    events:
    ----
    - description: Successfully set container resources
      event: Change container resources
      timestamp: "2026-06-26 08:32:05"
    

Limitación del acceso de compartición de archivos por agrupación de nodos trabajadores, zona o nodo trabajador

El comportamiento predeterminado del complemento de clúster File Storage for VPC es que los pods de cualquier nodo pueden acceder a las comparticiones de archivos. También puede aplicar un control más granular sobre cómo los pods acceden a los compartimientos de archivos. Por ejemplo, puede limitar el acceso de compartición de archivos sólo a los pods de un nodo específico, en una zona específica, en una agrupación de nodos trabajadores específica. Revise los siguientes casos de ejemplo para ver cómo puede configurar el acceso de pod a las comparticiones de archivos.

Cuando se crea un PVC, se crea un objetivo de uso compartido de archivos por PVC y se reserva una IP VNI en esa subred de la zona. Esto significa que el número máximo de PVC para el almacenamiento de archivos de VPC depende de las direcciones IP disponibles en esa subred.

Si utiliza las siguientes características de VNI para limitar el acceso de pod a sus comparticiones de archivos, es posible que su app no esté altamente disponible.

Antes de empezar

Para limitar el acceso de compartición de archivos por nodo, zona o grupo de recursos, primero debe crear un grupo de seguridad de VPC personalizado.

  1. Liste los clústeres y anote el ID de clúster donde desea desplegar el almacenamiento de archivos.

    ibmcloud ks cluster ls
    
  2. Obtenga los datos de su pool de trabajadores.

    ibmcloud ks worker-pool ls --cluster CLUSTER
    
  3. Obtén los detalles de tu subred.

    ibmcloud ks worker-pool get WORKER_POOL --cluster CLUSTER | grep -A 3 Subnets
    
  4. Obtenga sus CIDR de subred. Repite este paso para cada subred. Este rango CIDR se utilizará más adelante.

    ibmcloud is subnet SUBNET_ID | grep "IPv4 CIDR"
    
  5. Liste los grupos de seguridad y anote el grupo de seguridad de ID kube-<clusterID> para el clúster. Necesitará el ID de grupo de seguridad más adelante al añadir reglas de grupo de seguridad.

    ibmcloud is sg
    

    Salida de ejemplo

    ID                                          Name                                             Rules   Targets   VPC       Resource group
    r006-4aaec88f-4986-4b7c-a737-401f7fef1555   kube-clusterID                       15      0         my-vpc   default
    
  6. Cree un grupo de seguridad personalizado en la misma VPC que el clúster. Puede utilizar este grupo de seguridad para controlar el acceso a los compartimientos de archivos añadiendo reglas de grupo de seguridad.

    ibmcloud is security-group-create my-custom-security-group VPC-ID
    
  7. Cree su propia clase de almacenamiento y especifique el ID del grupo de seguridad personalizado que ha creado anteriormente. Todas las PVC creadas a partir de esta clase de almacenamiento están en el grupo de seguridad personalizado.

  8. Crea un PVC que utilice tu propia clase de almacenamiento.

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: pvc-custom-vni
      spec:
        accessModes:
        - ReadWriteMany
        resources:
          requests:
            storage: 10Gi
        storageClassName: "" # For example: my-custom-storage-class
    
  9. Después de que el PV se enlace a la PVC, obtenga los detalles del PV y anote el valor nfsServerPath para encontrar la dirección IP de VNI.

    kubectl get pv pvc-XXXX -o yaml | grep nfsServerPath
    

    Salida de ejemplo

    nfsServerPath: XXX.XX.XX.XXX:/XX # VNI IP address
    

Limitación del acceso de compartición de archivos a los pods en un nodo trabajador

  1. Asegúrese de haber completado los requisitos previos.

  2. Añada la regla siguiente al grupo de seguridad personalizado que ha creado anteriormente.

    ibmcloud is sg-rulec CUSTOM-SG inbound tcp --port-min 111 --port-max 2049 --remote 10.240.0.20 # Worker node IP
    
  3. Añade la siguiente regla al grupo de seguridad kube-clusterID.

    ibmcloud is sg-rulec kube-<cluster-id> outbound tcp --port-min 111 --port-max 2049 --remote 10.240.0.10 # VNI IP
    
  4. Cree un despliegue que utilice la PVC. Sólo los pods que se despliegan en el nodo trabajador que coincide con la regla que ha creado pueden montar o utilizar la PVC. Los pods desplegados en otros nodos se atascan en el estado creating del contenedor.

Limitación del acceso de compartición de archivos a pods en nodos trabajadores en una sola zona

  1. Asegúrese de haber completado los requisitos previos.

  2. Añada la regla siguiente al grupo de seguridad personalizado que ha creado anteriormente.

    ibmcloud is sg-rulec CUSTOM-SG inbound tcp --port-min 111 --port-max 2049 --remote 10.240.0.0/24 # zone subnet cidr range
    
  3. Añade la siguiente regla al grupo de seguridad kube-clusterID. Especifique la dirección IP de la interfaz de red virtual (VNI).

    ibmcloud is sg-rulec kube-<cluster-ID> outbound tcp --port-min 111 --port-max 2049 --remote 10.240.0.10 # VNI IP
    
  4. Cree un despliegue que utilice la PVC. Sólo los pods desplegados en la zona que se lista en la regla anterior pueden montar la PVC. Los pods que se despliegan en otras zonas no pueden acceder a la PVC y están atascados en el estado creating del contenedor.

Limitación del acceso de compartición de archivos a pods en nodos trabajadores de una única agrupación de nodos trabajadores

  1. Asegúrese de haber completado los requisitos previos.

  2. Cree reglas de entrada para cada rango de subred del grupo de trabajadores.

    ibmcloud is sg-rulec CUSTOM-SG inbound tcp --port-min 111 --port-max 2049 --remote 10.240.0.0/24 # zone 1 subnet cidr range
    ibmcloud is sg-rulec CUSTOM-SG inbound tcp --port-min 111 --port-max 2049 --remote 10.240.1.0/24 # zone 2 subnet cidr range
    
  3. Añade la siguiente regla al grupo de seguridad kube-clusterID. Especifique la dirección IP de la interfaz de red virtual (VNI) como remota o de origen.

    ibmcloud is sg-rulec kube-<cluster-ID> outbound tcp --port-min 111 --port-max 2049 --remote 10.240.0.10 # VNI IP
    
  4. Implementa una aplicación que utilice el PVC que has creado anteriormente. Sólo los pods de las agrupaciones de nodos trabajadores indicadas en la regla anterior pueden montar la PVC. O, si despliega la app en un daemonset, los pods solo se desplegarán correctamente en los nodos trabajadores para los que ha creado reglas de grupo de seguridad. Los pods de las agrupaciones de nodos trabajadores que no están en la agrupación de nodos trabajadores especificada fallan con un error MountVolume.SetUp failed for volume "pvc-184b8c92-33ea-4874-b2ac-17665e53c060" : rpc error: code = DeadlineExceeded desc = context deadline exceeded.

Limitación del acceso de compartición de archivos a pods en nodos trabajadores en varias agrupaciones de nodos trabajadores

  1. Asegúrese de haber completado los requisitos previos.

  2. Añade las siguientes reglas a tu grupo de seguridad personalizado. Especifique las agrupaciones de nodos trabajadores y los rangos CIDR de subred como el remoto o el origen.

    ibmcloud is sg-rulec CUSTOM-SG inbound tcp --port-min 111 --port-max 2049 --remote 10.240.1.0/24 # worker pool 1, zone 1 subnet CIDR range
    ibmcloud is sg-rulec CUSTOM-SG inbound tcp --port-min 111 --port-max 2049 --remote 10.240.1.0/24 # worker pool 1, zone 2 subnet CIDR range
    ibmcloud is sg-rulec CUSTOM-SG inbound tcp --port-min 111 --port-max 2049 --remote 10.241.0.0/24 # worker pool 2, zone 1 subnet CIDR range
    ibmcloud is sg-rulec CUSTOM-SG inbound tcp --port-min 111 --port-max 2049 --remote 10.241.1.0/24 # worker pool 2, zone 2subnet CIDR range
    
  3. Añade la siguiente regla al grupo de seguridad kube-<clusterID>. Especifique la dirección IP de la interfaz de red virtual (VNI) como remota o de origen.

    ibmcloud is sg-rulec kube-<clusterID> outbound tcp --port-min 111 --port-max 2049 --remote 10.240.1.7 # VNI-IP
    
  4. Cree un despliegue que utilice la PVC. Sólo los pods desplegados en la zona indicada en la regla pueden montar la PVC. Los pods desplegados en los nodos trabajadores restringidos se atascan en el estado creating del contenedor.