Optimiza el almacenamiento con Multishares de Filestore para GKE

En esta guía, se muestra cómo usar los recursos compartidos de Filestore para Google Kubernetes Engine con el controlador de CSI de Filestore para GKE.

Antes de comenzar

  1. Antes de comenzar, completa los pasos de configuración necesarios para usar Filestore.

  2. Habilita el controlador de CSI de Filestore para GKE, versión 1.23 o posterior.

    • Las versiones del controlador 1.23 a 1.26 admiten hasta 10 recursos compartidos por instancia.

    • Las versiones del controlador 1.27 o posteriores admiten hasta 80 recursos compartidos por instancia.

    Para conocer los requisitos más recientes del controlador de CSI de Filestore de GKE, consulta Accede a instancias de Filestore con el controlador de CSI de Filestore.

Usa los recursos compartidos de Filestore con varias aplicaciones

En esta sección, se muestra cómo implementar dos aplicaciones, un Deployment y un Statefulset, cada una con una StorageClass de recursos compartidos de Filestore. También verás cómo GKE empaqueta en contenedores (un proceso para empaquetar aplicaciones de manera eficiente en tus nodos de GKE) todos los volúmenes en la misma instancia subyacente de Filestore Enterprise.

  1. Usa la StorageClass que proporciona GKE, enterprise-multishare-rwx, para crear instancias que admitan hasta 10 recursos compartidos.

    • Si deseas crear instancias que admitan hasta 80 recursos compartidos, deberás crear una StorageClass personalizada. Para los fines de esta guía, usarás una StorageClass con un límite de diez recursos compartidos por instancia.

    Después de habilitar el controlador de CSI de Filestore para GKE, los usuarios pueden acceder a la StorageClass Multishare enterprise-multishare-rwx que proporciona GKE con la siguiente configuración. En referencia a esta StorageClass, el controlador de CSI de Filestore para GKE usa el aprovisionamiento de volumen dinámico a fin de crear volúmenes persistentes (PV) automáticamente para reclamaciones de volúmenes persistentes (PVC) nuevas según lo requiera la demanda de carga de trabajo de GKE:

    kubectl describe sc enterprise-multishare-rwx
    Name:                  enterprise-multishare-rwx
    IsDefaultClass:        No
    Annotations:           components.gke.io/component-name=filestorecsi,components.gke.io/component-version=0.7.2,components.gke.io/layer=addon
    Provisioner:           filestore.csi.storage.gke.io
    Parameters:            instance-storageclass-label=enterprise-multishare-rwx,multishare=true,tier=enterprise
    AllowVolumeExpansion:  True
    MountOptions:          <none>
    ReclaimPolicy:         Delete
    VolumeBindingMode:     WaitForFirstConsumer
    Events:                <none>
    

Crea una StorageClass personalizada

Si desea aprovechar el límite de capacidad más reciente de hasta 80 elementos compartidos por instancia de Filestore, crea una StorageClass personalizada en función de lo siguiente plantilla:

  apiVersion: storage.k8s.io/v1
  kind: StorageClass
  metadata:
    name: csi-filestore-multishare-128
  provisioner: filestore.csi.storage.gke.io
  parameters:
    tier: enterprise
    multishare: "true"
    max-volume-size: "128Gi"
    network: default
  allowVolumeExpansion: true

Cuando cambies el nombre de la StorageClass, ten en cuenta los siguientes requisitos:

  • El nombre de la StorageClass debe ser un nombre de subdominio DNS válido.

  • El nombre StorageClass de varios recursos también se usa como una etiqueta de instancia y debe seguir los lineamientos para asignar nombres a etiquetas.

  • Si tu aplicación requiere aprovisionamiento de volumen inmediato, incluye el modo de vinculación de volumen Immediate:

    volumeBindingMode: Immediate

    Usa esta especificación, por ejemplo, si no quieres el aprovisionamiento de volumen dependerá de la creación de Pods en el clúster de GKE.

  • A partir de la versión 1.27 del controlador, si deseas asignar más de 10 recursos compartidos por instancia, incluye el parámetro max-volume-size y asígnale uno de los valores aceptados de la primera columna:

    Tamaño máximo del volumen (tamaño del recurso compartido) Cantidad máxima de archivos compartidos por instancia
    128 GiB 80
    256 GiB 40
    512 GiB 20
    1024 GiB 10

    Por ejemplo, agregar el par clave-valor max-volume-size: "128Gi" garantiza que StorageClass asigne hasta 80 recursos compartidos (cada uno desde 10 GiB hasta 128 GiB) a una sola instancia de nivel empresarial de 10 TiB.

    • Esta función es retrocompatible con instancias de Filestore creadas por las versiones 1.23 a 1.26 del controlador de CSI de Filestore para GKE.

    • Las instancias existentes pueden crear PVC o recursos compartidos nuevos, con un tamaño mínimo extendido de 10 GiB.

    • La versión 1.27 o posterior del controlador de CSI de Filestore para GKE reconoce las instancias empresariales heredadas y les asigna un tamaño máximo de recurso compartido predeterminado de 1,024 GiB (1 TiB). Como resultado, las instancias heredadas están limitados a una cantidad máxima de 10 elementos compartidos por instancia.

    Si deseas obtener más información, consulta Recursos compartidos de Filestore para GKE.

  1. Crea una implementación con múltiples réplicas de Pods mediante una sola PVC.

    Crea un archivo de configuración YAML similar al siguiente:

    cat <<EOF | kubectl apply -f -
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-server-multishare
      labels:
        app: nginx
    spec:
      replicas: 5
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            volumeMounts:
            - mountPath: /usr/share/nginx/html
              name: mypvc
          volumes:
          - name: mypvc
            persistentVolumeClaim:
              claimName: test-pvc-fs
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: test-pvc-fs
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: enterprise-multishare-rwx
      resources:
        requests:
          storage: 100Gi
    
    EOF
    
  2. Verifica las réplicas de Pods.

    a. En la línea de comandos, ejecuta el siguiente comando para verificar el estado de la PVC:

    kubectl get pvc
    

    Deberías ver algo similar a la siguiente respuesta:

    NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    test-pvc-fs   Bound    pvc-056d769d-a709-4bb2-b6d3-0361871b27a2   100Gi      RWX            enterprise-multishare-rwx  35m
    

    b. En la línea de comandos, ejecuta el siguiente comando para verificar el estado del pod:

    kubectl get pod
    

    Deberías ver algo similar a la siguiente respuesta:

    NAME                                     READY   STATUS    RESTARTS   AGE
    web-server-multishare-76c9ffb4b5-2dhml   1/1     Running   0          35m
    web-server-multishare-76c9ffb4b5-7mtcb   1/1     Running   0          35m
    web-server-multishare-76c9ffb4b5-csdbd   1/1     Running   0          35m
    web-server-multishare-76c9ffb4b5-rgx82   1/1     Running   0          35m
    web-server-multishare-76c9ffb4b5-zjl27   1/1     Running   0          35m
    
  3. Escala las réplicas.

    a. En la línea de comandos, ejecuta el siguiente comando para editar el Deployment:

    kubectl edit deployment web-server-multishare
    

    b. El archivo se abrirá en la línea de comandos. Busca el campo spec.replicas y actualiza el valor a 10.

    c. En la línea de comandos, ejecuta el siguiente comando para ver el cambio aplicado:

    kubectl get pod
    

    Deberías ver algo similar a la siguiente respuesta:

    NAME                                     READY   STATUS    RESTARTS   AGE
    web-server-multishare-76c9ffb4b5-2dhml   1/1     Running   0          36m
    web-server-multishare-76c9ffb4b5-5ctkf   1/1     Running   0          3s
    web-server-multishare-76c9ffb4b5-7mtcb   1/1     Running   0          36m
    web-server-multishare-76c9ffb4b5-8dwmw   1/1     Running   0          2s
    web-server-multishare-76c9ffb4b5-csdbd   1/1     Running   0          36m
    web-server-multishare-76c9ffb4b5-lndcq   1/1     Running   0          2s
    web-server-multishare-76c9ffb4b5-rgx82   1/1     Running   0          36m
    web-server-multishare-76c9ffb4b5-vtd6p   1/1     Running   0          3s
    web-server-multishare-76c9ffb4b5-xm49s   1/1     Running   0          3s
    web-server-multishare-76c9ffb4b5-zjl27   1/1     Running   0          36m
    

    Observa que se están ejecutando 10 pods.

    d. En la línea de comandos, ejecuta el siguiente comando:

    kubectl get deployment
    

    Deberías ver algo similar a la siguiente respuesta:

    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    web-server-multishare   10/10   10           10          36m
    

    e. En la línea de comandos, ejecuta el siguiente comando para verificar el estado vinculado a la PVC:

    kubectl get pvc
    

    Deberías ver algo similar a la siguiente respuesta:

    NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    test-pvc-fs   Bound    pvc-056d769d-a709-4bb2-b6d3-0361871b27a2   100Gi      RWX            enterprise-multishare-rwx  37m
    

    f. En la línea de comandos, ejecuta el siguiente comando para editar el Deployment:

    kubectl edit deployment web-server-multishare
    

    g. El archivo se abrirá en la línea de comandos. Busca el campo spec.replicas y actualiza el valor a 2.

    h. En la línea de comandos, ejecuta el siguiente comando para ver el cambio aplicado:

    kubectl get pod
    

    Deberías ver algo similar a la siguiente respuesta:

    NAME                                     READY   STATUS    RESTARTS   AGE
    web-server-multishare-76c9ffb4b5-2dhml   1/1     Running   0          38m
    web-server-multishare-76c9ffb4b5-7mtcb   1/1     Running   0          38m
    
  4. Implementa un Statefulset

    Implementa una segunda aplicación que comparta la instancia de Filestore subyacente.

    Para hacerlo, aprovisiona 200 GiB de espacio y valida que use la misma instancia de Filestore subyacente que la primera aplicación.

    Luego, escalarás la aplicación a nueve réplicas con 900 GiB en total (9 réplicas con 100 GiB cada una) y comparte la instancia para verificar que GKE use la misma instancia de Filestore.

    Crea un archivo de configuración YAML similar al siguiente:

    cat <<EOF | kubectl apply -f -
    
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      serviceName: "nginx"
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: registry.k8s.io/nginx-slim:0.8
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: test-pvc-multishare
              mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - metadata:
          name: test-pvc-multishare
        spec:
          accessModes: [ "ReadWriteMany" ]
          storageClassName: enterprise-multishare-rwx
          resources:
            requests:
              storage: 100Gi
    
    EOF
    
    
  5. Verifica las réplicas y los volúmenes del Statefulset.

    En la línea de comandos, ejecuta el siguiente comando:

    kubectl get pod
    

    Deberías ver algo similar a la siguiente respuesta:

    NAME                                     READY   STATUS    RESTARTS   AGE
    web-0                                    1/1     Running   0          4m48s
    web-1                                    1/1     Running   0          3m32s
    web-server-multishare-76c9ffb4b5-2dhml   1/1     Running   0          57m
    web-server-multishare-76c9ffb4b5-7mtcb   1/1     Running   0          57m
    

    Observa que los dos primeros Pods están asociados con el Statefulset. Los últimos dos Pods están asociados con el Deployment.

    En la línea de comandos, ejecuta el siguiente comando:

    kubectl get statefulset
    

    Deberías ver algo similar a la siguiente respuesta:

    NAME   READY   AGE
    web    2/2     2m8s
    

    En la línea de comandos, ejecuta el siguiente comando:

    kubectl get pvc
    

    Deberías ver algo similar a la siguiente respuesta:

    NAME                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    test-pvc-fs                 Bound    pvc-056d769d-a709-4bb2-b6d3-0361871b27a2   100Gi      RWX            enterprise-multishare-rwx   54m
    test-pvc-multishare-web-0   Bound    pvc-7aa21b5a-5343-4547-b7d7-414c16af15a7   100Gi      RWX            enterprise-multishare-rwx   114s
    test-pvc-multishare-web-1   Bound    pvc-8b37cd6e-d764-4d38-80d7-d74228536cfe   100Gi      RWX            enterprise-multishare-rwx   38s
    

    La PVC test-pvc-fs está asociada con el Deployment web-server-multishare.

    Las PVC test-pvc-multishare-web-0 y test-pvc-multishare-web-1 están asociadas con el Statefulset.

  6. Escala las réplicas de Statefulset.

    Aumenta el recuento de réplicas a nueve. A medida que el recuento aumenta, se crean las PVC correspondientes.

    a. En la línea de comandos, ejecuta el siguiente comando:

    kubectl  edit statefulset web
    

    b. El archivo se abrirá en la línea de comandos. Busca el campo spec.replicas y actualiza el valor a 9.

    c. En la línea de comandos, ejecuta el siguiente comando para ver el cambio aplicado:

    kubectl get statefulset
    

    Deberías ver algo similar a la siguiente respuesta:

    NAME   READY   AGE
    web    9/9     13m
    

    d. En la línea de comandos, ejecuta el siguiente comando:

    kubectl get deployment
    

    Deberías ver algo similar a la siguiente respuesta:

    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    web-server-multishare   2/2     2            2           65m
    

    e. En la línea de comandos, ejecuta el siguiente comando:

    kubectl get pvc
    

    Deberías ver algo similar a la siguiente respuesta:

    NAME                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    test-pvc-fs                 Bound    pvc-056d769d-a709-4bb2-b6d3-0361871b27a2   100Gi      RWX            enterprise-multishare-rwx   65m
    test-pvc-multishare-web-0   Bound    pvc-7aa21b5a-5343-4547-b7d7-414c16af15a7   100Gi      RWX            enterprise-multishare-rwx   13m
    test-pvc-multishare-web-1   Bound    pvc-8b37cd6e-d764-4d38-80d7-d74228536cfe   100Gi      RWX            enterprise-multishare-rwx   12m
    test-pvc-multishare-web-2   Bound    pvc-3fcbd132-939f-4364-807a-7c8ac6a3e64e   100Gi      RWX            enterprise-multishare-rwx   5m12s
    test-pvc-multishare-web-3   Bound    pvc-5894afa5-2502-4ee7-9d5c-b7378cb85479   100Gi      RWX            enterprise-multishare-rwx   4m57s
    test-pvc-multishare-web-4   Bound    pvc-ebbe452b-bc8f-4624-a830-a2094cce0d67   100Gi      RWX            enterprise-multishare-rwx   4m36s
    test-pvc-multishare-web-5   Bound    pvc-5a73a698-d174-44cb-a3a1-e767966c3417   100Gi      RWX            enterprise-multishare-rwx   4m20s
    test-pvc-multishare-web-6   Bound    pvc-102da6a9-2ca6-4f9e-9896-8fe14709db7a   100Gi      RWX            enterprise-multishare-rwx   3m55s
    test-pvc-multishare-web-7   Bound    pvc-160e81cd-c5bf-4ae6-966e-518e8249e02d   100Gi      RWX            enterprise-multishare-rwx   3m38s
    test-pvc-multishare-web-8   Bound    pvc-9b52d773-2e9a-40de-881c-dc06945ba3d7   100Gi      RWX            enterprise-multishare-rwx   118s
    
  7. Verifica el estado de la instancia de Filestore.

    Ahora tienes una implementación con dos Pods de réplica y un Statefulset con nueve Pods de réplica, y un total de 10 PVC, cada una con 100 GiB de tamaño. Todos los volúmenes se empaquetan en una sola instancia de recursos compartidos de Filestore.

    a. En la línea de comandos, ejecuta el siguiente comando instances list:

    gcloud beta filestore instances list --project=YOUR_PROJECT_ID --region=REGION
    

    Donde:

    • YOUR_PROJECT_ID es el nombre del proyecto que se usa. Por ejemplo, my-project

    • REGION es el nombre de la región que se usa. Por ejemplo, us-central1

    Deberías ver algo similar a la siguiente respuesta:

    INSTANCE_NAME                            LOCATION     TIER        CAPACITY_GB  FILE_SHARE_NAME  IP_ADDRESS   STATE  CREATE_TIME
    fs-a767cef8-738e-4c8e-b70b-09cbb872d016  us-central1  ENTERPRISE  1024         N/A              10.192.53.2  READY  2022-06-21T21:15:30
    

    b. En la línea de comandos, ejecuta el siguiente comando instances describe:

    gcloud filestore instances describe fs-a767cef8-738e-4c8e-b70b-09cbb872d016 --project=YOUR_PROJECT_ID --region=REGION
    capacityGb: '1024'
    capacityStepSizeGb: '256'
    createTime: '2022-06-21T21:15:30.464237089Z'
    labels:
      storage_gke_io_created-by: filestore_csi_storage_gke_io
      storage_gke_io_storage-class-id: enterprise-multishare-rwx
    maxCapacityGb: '10240'
    maxShareCount: '10'
    multiShareEnabled: true
    name: projects/YOUR_PROJECT_ID/locations/REGION/instances/fs-a767cef8-738e-4c8e-b70b-09cbb872d016
    networks:
    - connectMode: DIRECT_PEERING
      ipAddresses:
      - 10.192.53.2
      modes:
      - MODE_IPV4
      network: csi-filestore-test-network
      reservedIpRange: 10.192.53.0/26
    state: READY
    tier: ENTERPRISE
    
    

    Donde:

    • YOUR_PROJECT_ID es el nombre del proyecto que se usa. Por ejemplo, my-project

    • REGION es el nombre de la región que se usa. Por ejemplo, us-central1

Expande una PVC y verifica la instancia de Filestore

En esta sección, se muestra cómo expandir una PVC existente y verificar el tamaño de la instancia de Filestore.

  1. Expande una PVC.

    Las PVC, respaldadas por recursos compartidos en una instancia de recursos compartidos de Filestore, pueden crecer al tamaño máximo especificado en el parámetro max-volume-size. Para verificar esto, expande uno de los volúmenes asociados con el Statefulset mientras el Pod lo usa.

    Desde la línea de comandos, ejecuta el siguiente comando para verificar el tamaño actual de la PVC de la réplica 0:

    kubectl get pvc test-pvc-multishare-web-0 -o json
    {
        "apiVersion": "v1",
        "kind": "PersistentVolumeClaim",
        "metadata": {
            "annotations": {
                "pv.kubernetes.io/bind-completed": "yes",
                "pv.kubernetes.io/bound-by-controller": "yes",
                "volume.beta.kubernetes.io/storage-provisioner": "filestore.csi.storage.gke.io",
                "volume.kubernetes.io/storage-provisioner": "filestore.csi.storage.gke.io"
            },
            "creationTimestamp": "2022-06-21T22:07:42Z",
            "finalizers": [
                "kubernetes.io/pvc-protection"
            ],
            "labels": {
                "app": "nginx"
            },
            "name": "test-pvc-multishare-web-0",
            "namespace": "default",
            "resourceVersion": "48395",
            "uid": "7aa21b5a-5343-4547-b7d7-414c16af15a7"
        },
        "spec": {
            "accessModes": [
                "ReadWriteMany"
            ],
            "resources": {
                "requests": {
                    "storage": "100Gi"
                }
            },
            "storageClassName": "enterprise-multishare-rwx",
            "volumeMode": "Filesystem",
            "volumeName": "pvc-7aa21b5a-5343-4547-b7d7-414c16af15a7"
        },
        "status": {
            "accessModes": [
                "ReadWriteMany"
            ],
            "capacity": {
                "storage": "100Gi"
            },
            "phase": "Bound"
        }
    }
    
    
  2. Desde la línea de comandos, ejecuta el siguiente comando para aumentar el tamaño a 500 GiB:

    kubectl edit pvc test-pvc-multishare-web-0
    
  3. El archivo se abrirá en la línea de comandos. Busca el campo spec.resources.requests.storage y actualiza el valor a 500Gi.

  4. En la línea de comandos, ejecuta el siguiente comando para ver el cambio aplicado:

    kubectl get pvc test-pvc-multishare-web-0
    

    Deberías ver algo similar a la siguiente respuesta:

    NAME                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    test-pvc-multishare-web-0   Bound    pvc-7aa21b5a-5343-4547-b7d7-414c16af15a7   500Gi      RWX            enterprise-multishare-rwx   28m
    

    El controlador de CSI de Filestore aceptó la solicitud; primero expande la instancia de Filestore subyacente y, luego, expande el recurso compartido que respalda la PVC.

    En particular, el controlador de CSI de Filestore expandió la instancia a 1536 Gi de forma automática para adaptarse al nuevo tamaño compartido de 500 Gi.

  5. En la línea de comandos, ejecuta el siguiente comando instances describe para verificar la capacidad de la instancia de Filestore:

    gcloud filestore instances describe fs-a767cef8-738e-4c8e-b70b-09cbb872d016 --project=YOUR_PROJECT_ID --region=REGION
    capacityGb: '1536'
    capacityStepSizeGb: '256'
    createTime: '2022-06-21T21:15:30.464237089Z'
    labels:
      storage_gke_io_created-by: filestore_csi_storage_gke_io
      storage_gke_io_storage-class-id: enterprise-multishare-rwx
    maxCapacityGb: '10240'
    maxShareCount: '10'
    multiShareEnabled: true
    name: projects/YOUR_PROJECT_ID/locations/us-central1/instances/fs-a767cef8-738e-4c8e-b70b-09cbb872d016
    networks:
    - connectMode: DIRECT_PEERING
      ipAddresses:
      - 10.192.53.2
      modes:
      - MODE_IPV4
      network: csi-filestore-test-network
      reservedIpRange: 10.192.53.0/26
    state: READY
    tier: ENTERPRISE
    

    Donde:

    • YOUR_PROJECT_ID es el nombre del proyecto que se usa. Por ejemplo, my-project

    • REGION es el nombre de la región que se usa. Por ejemplo, us-central1

Aprovisionamiento dinámico en una VPC compartida

El controlador de CSI de Filestore para GKE admite el aprovisionamiento dinámico de volúmenes en un proyecto de servicio en una VPC compartida. La siguiente sección muestra cómo usar el controlador de CSI de Filestore para aprovisionar volúmenes de forma dinámica en instancias de recursos compartidos de Filestore en un proyecto de servicio en una red de VPC compartida.

  1. Completa los pasos de configuración para una red de VPC compartida y el acceso privado a servicios.

  2. Crear una StorageClass para aprovisionar de forma dinámica volúmenes respaldados por un Instancia de Filestore de varios recursos compartidos en una VPC compartida.

    Ejecuta el siguiente comando para implementar un recurso StorageClass:

    cat <<EOF | kubectl apply -f -
    
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-filestore-multishare-sharedvpc
    provisioner: filestore.csi.storage.gke.io
    parameters:
      network: "projects/HOST_PROJECT_ID/global/networks/SHARED_VPC_NAME"
      connect-mode: PRIVATE_SERVICE_ACCESS
      tier: enterprise
      multishare: "true"
    allowVolumeExpansion: true
    
    EOF
    

    Donde:

    • HOST_PROJECT_ID es el ID o el nombre del proyecto host de la red de VPC compartida. Por ejemplo, my-host-project

    • SHARED_VPC_NAME es el nombre de la red de VPC compartida. Por ejemplo, my-shared-vpc

    Si deseas implementar el recurso dentro de un rango de direcciones IP reservado, agrega la siguiente línea a los parámetros que se usaron en el comando:

    reserved-ip-range: RESERVED_NAME
    

    En el ejemplo anterior, RESERVED_NAME es el nombre del rango de direcciones IP reservado dentro del cual se puede aprovisionar una instancia de Filestore. Por ejemplo, filestore-reserved-ip-range Si se especifica un rango de IP reservado, debe ser un rango de direcciones con nombre en lugar de un valor CIDR directo.

    Para obtener más información, consulta Asigna rangos de direcciones IP o Configura un rango de direcciones IP reservado. Para ver un ejemplo de cómo crear un nombre reservado con la consola de Google Cloud, consulta Crea una asignación de IP.

  3. Crea una implementación.

    Ejecuta el siguiente comando para crear un recurso Deployment:

    cat <<EOF | kubectl apply -f -
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-server-multishare
      labels:
        app: nginx
    spec:
      replicas: 5
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            volumeMounts:
            - mountPath: /usr/share/nginx/html
              name: mypvc
          volumes:
          - name: mypvc
            persistentVolumeClaim:
              claimName: test-pvc-fs-sharedvpc
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: test-pvc-fs-sharedvpc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: csi-filestore-multishare-sharedvpc
      resources:
        requests:
          storage: 100Gi
    
    EOF
    

Instancias de Filestore con CMEK habilitada

Puedes crear volúmenes de GKE alojados en instancias de recursos compartidos de Filestore con CMEK habilitada. En esta sección, verás cómo configurar una clave de encriptación administrada por el cliente (CMEK) para tu instancia de Filestore.

Los detalles de la clave administrada por el cliente se pueden proporcionar en la StorageClass. Cualquier instancia que el controlador de CSI de Filestore cree de forma dinámica, que haga referencia a esta StorageClass, tendrá habilitada la CMEK.

  1. Crea una StorageClass con CMEK habilitada.

    a. Ejecuta el siguiente comando:

    cat <<EOF | kubectl apply -f -
    
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-filestore-multishare-cmek
    provisioner: filestore.csi.storage.gke.io
    parameters:
      tier: enterprise
      multishare: "true"
      instance-encryption-kms-key: projects/KEY_PROJECT_ID/locations/REGION/keyRings/RING_NAME/cryptoKeys/KEY_NAME
    
    allowVolumeExpansion: true
    
    EOF
    

    Donde:

    • KEY_PROJECT_ID es el nombre del proyecto en el que se encuentra la clave. Por ejemplo, my-key-project

    • REGION es el nombre de la región que se usa. Por ejemplo, us-central1

    • RING_NAME es el nombre del llavero de claves. Por ejemplo, my-key-ring-name

    • KEY_NAME es el nombre de la clave. Por ejemplo, my-key-name

  2. Crea una implementación.

    b. Ejecuta el siguiente comando para crear un recurso Deployment:

    cat <<EOF | kubectl apply -f -
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-server-multishare
      labels:
        app: nginx
    spec:
      replicas: 5
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            volumeMounts:
            - mountPath: /usr/share/nginx/html
              name: mypvc
          volumes:
          - name: mypvc
            persistentVolumeClaim:
              claimName: test-pvc-fs-cmek
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: test-pvc-fs-cmek
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: csi-filestore-multishare-cmek
      resources:
        requests:
          storage: 100Gi
    
    EOF
    

Asignar PVC a instancias de Filestore

En esta sección, verás cómo asignar tus PVC a las instancias de Filestore.

Con las instancias de recursos compartidos de Filestore, cada PVC se aloja en una instancia de Filestore mediante el controlador de CSI de Filestore. Los detalles de la instancia subyacente de Filestore que aloja el volumen y el recurso compartido que representa el volumen de Kubernetes se capturan en el campo volumeHandle de la especificación de los volúmenes persistentes. El formato del controlador de volumen es el siguiente:

modeMultishare/<storageclass-prefix>/<project>/<region>/<filestore-instance-name>/<filestore-share-name>

El siguiente comando de kubectl se puede usar para determinar con rapidez las asignaciones entre una PVC, un PV, una instancia de Filestore y un recurso compartido de Filestore.

En la línea de comandos, ejecuta el siguiente comando:

kubectl get pv -o jsonpath='{range .items[*]}{"pv="}{.metadata.name}{",pvc="}{.spec.claimRef.name}{",volumeHandle="}{.spec.csi.volumeHandle}{"\n"}{end}'

Deberías ver algo similar a la siguiente respuesta:

pv=pvc-67ad9abd-f25e-4130-b7ca-64d28bd29525,pvc=test-pvc-multishare,volumeHandle=modeMultishare/csi-filestore-multishare-sharedvpc/YOUR_PROJECT_ID/us-central1/fs-2109f680-3f04-4ada-b4bc-2a1c7fc47b88/pvc_67ad9abd_f25e_4130_b7ca_64d28bd29525

pv=pvc-c80f4de0-9916-4957-b8ae-b21206650ac0,pvc=test-pvc-fs-sharedvpc,volumeHandle=modeMultishare/csi-filestore-multishare-sharedvpc/YOUR_PROJECT_ID/us-central1/fs-2109f680-3f04-4ada-b4bc-2a1c7fc47b88/pvc_c80f4de0_9916_4957_b8ae_b21206650ac0

Donde:

  • YOUR_PROJECT_ID es el nombre del proyecto que se usa. Por ejemplo, my-project

Observa que dos volúmenes persistentes en el clúster se alojan en una sola instancia de Filestore.

¿Qué sigue?