Otimizar o armazenamento com os compartilhamentos múltiplos do Filestore para o GKE

Neste guia, mostramos como usar os compartilhamentos múltiplos do Filestore para o Google Kubernetes Engine com o driver CSI do Filestore.

Antes de começar

  1. Antes de começar, conclua as etapas de configuração necessárias para usar o Filestore.

  2. Ative o driver CSI do GKE Filestore, versão 1.23 ou posterior:

    • As versões do driver 1.23 a 1.26 permitem até dez compartilhamentos por instância.

    • As versões do driver 1.27 e posteriores permitem até 80 compartilhamentos por instância.

    Para conferir os requisitos mais recentes de driver CSI do GKE Filestore, consulte Acessar instâncias do Filestore com o driver CSI do Filestore.

Usar os multicompartilhamentos do Filestore com vários aplicativos

Essa seção mostra como implantar dois aplicativos, uma Implantação e um Statefulset, cada um usando um StorageClass de compartilhamentos múltiplos do Filestore. Você também vai conferir como os empacotamentos do GKE (um processo para empacotar aplicativos nos nós do GKE com eficiência) em todos os volumes na mesma instância do Filestore Enterprise.

  1. Use o StorageClass fornecido pelo GKE, enterprise-multishare-rwx, para criar instâncias que permitem até dez compartilhamentos.

    • Se você quiser criar instâncias compatíveis com até 80 compartilhamentos, será necessário criar um StorageClass personalizado. Para os fins deste guia, você usará um StorageClass com um limite de 10 compartilhamentos por instância.

    Depois que o driver CSI do GKE Filestore for ativado, os usuários poderão acessar o StorageClass enterprise-multishare-rwx de compartilhamento fornecido pelo GKE com a configuração a seguir. Ao fazer referência a esse StorageClass, o driver CSI do GKE Filestore usa o provisionamento de volume dinâmico para criar automaticamente volumes permanentes (PVs) para novas declarações de volume permanente (PVCs, na sigla em inglês) como o GKE. demanda de carga de trabalho:

    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>
    

Criar um StorageClass personalizado

Se você quiser aproveitar o limite de capacidade mais recente de até 80 compartilhamentos por instância do Filestore, crie um StorageClass personalizado com base no seguinte modelo:

  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

Ao renomear o StorageClass, considere os seguintes requisitos:

  • O nome do StorageClass precisa ser um nome de subdomínio de DNS válido.

  • O nome StorageClass de compartilhamentos múltiplos também é usado como um rótulo de instância e precisa seguir as diretrizes de nomenclatura de rótulos.

  • Se o aplicativo exigir provisionamento imediato de volume, inclua o modo de vinculação de volume Immediate:

    volumeBindingMode: Immediate

    Use essa especificação, por exemplo, se você não quiser que o provisionamento de volume dependa da criação do pod no cluster do GKE.

  • A partir da versão do driver 1.27, se você quiser atribuir mais de dez compartilhamentos por instância, inclua o parâmetro max-volume-size e atribua a ele um dos valores aceitos na primeira coluna:

    Tamanho máximo do volume (tamanho do compartilhamento) Número máximo de compartilhamentos por instância
    128 GiB 80
    256 GiB 40
    512 GiB 20
    1.024 GiB 10

    Por exemplo, adicionar o par de chave-valor max-volume-size: "128Gi" garante que o StorageClass mapeie até 80 compartilhamentos, cada um variando de 10 GiB a 128 GiB de tamanho, para uma única instância de nível empresarial de 10 TiB.

    • Esse recurso é compatível com versões anteriores das instâncias do Filestore criadas pelo driver CSI do Filestore nas versões 1.23 a 1.26.

    • As instâncias atuais podem criar novos PVCs, ou compartilhamentos, com o tamanho de compartilhamento mínimo estendido de 10 GiB.

    • A versão 1.27 do driver CSI do GKE Filestore reconhece instâncias corporativas legadas e atribui a elas o tamanho máximo de compartilhamento padrão de 1.024 GiB (1 TiB). Com isso, as instâncias legadas são limitadas a uma contagem máxima de dez compartilhamentos por instância.

    Para mais informações, consulte Multicompartilhamentos do Filestore para o GKE.

  1. Crie uma implantação com várias réplicas de pod usando um único PVC.

    Crie um arquivo de configuração YAML semelhante ao seguinte:

    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. Verifique as réplicas do pod.

    a. Na linha de comando, execute o seguinte comando para verificar o status do PVC:

    kubectl get pvc
    

    Você verá algo parecido com a seguinte resposta:

    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. Na linha de comando, execute o seguinte comando para verificar o status do pod:

    kubectl get pod
    

    Você verá algo parecido com a seguinte resposta:

    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. Réplicas de escalonamento.

    a. Na linha de comando, execute o seguinte para editar a implantação:

    kubectl edit deployment web-server-multishare
    

    b. O arquivo será aberto na linha de comando. Encontre o campo spec.replicas e atualize o valor para 10.

    c. Na linha de comando, execute o seguinte comando para conferir a alteração aplicada:

    kubectl get pod
    

    Você verá algo parecido com a seguinte resposta:

    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
    

    Observe que dez pods estão em execução.

    d. Na linha de comando, execute o seguinte comando:

    kubectl get deployment
    

    Você verá algo parecido com a seguinte resposta:

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

    e. Na linha de comando, execute o seguinte comando para verificar o status da vinculação de PVC:

    kubectl get pvc
    

    Você verá algo parecido com a seguinte resposta:

    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. Na linha de comando, execute o seguinte para editar a implantação:

    kubectl edit deployment web-server-multishare
    

    g. O arquivo será aberto na linha de comando. Encontre o campo spec.replicas e atualize o valor para 2.

    h. Na linha de comando, execute o seguinte comando para conferir a alteração aplicada:

    kubectl get pod
    

    Você verá algo parecido com a seguinte resposta:

    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. Implantar um Statefulset.

    Implante um segundo aplicativo que compartilhe a instância do Filestore.

    Para fazer isso, provisione 200 GiB de espaço e confirme se ele usa a mesma instância do Filestore do primeiro aplicativo.

    Em seguida, você escalonará o aplicativo para nove réplicas usando 900 GiB no total (9 réplicas usando 100 GiB cada) e verificará se o GKE usa a mesma instância do Filestore ao compartilhá-la.

    Crie um arquivo de configuração YAML semelhante ao seguinte:

    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. Verifique as réplicas e os volumes do Statefulset.

    Na linha de comando, execute o seguinte comando:

    kubectl get pod
    

    Você verá algo parecido com a seguinte resposta:

    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
    

    Os dois primeiros pods esterão associados ao Statefulset. Os dois últimos pods estarão associados à implantação.

    Na linha de comando, execute o seguinte comando:

    kubectl get statefulset
    

    Você verá algo parecido com a seguinte resposta:

    NAME   READY   AGE
    web    2/2     2m8s
    

    Na linha de comando, execute o seguinte comando:

    kubectl get pvc
    

    Você verá algo parecido com a seguinte resposta:

    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
    

    O test-pvc-fs do PVC está associado ao web-server-multishare de implantação.

    Os PVCs test-pvc-multishare-web-0 e test-pvc-multishare-web-1 estão associados ao Statefulset.

  6. Escalone as réplicas do Statefulset.

    Aumente a contagem de réplicas para nove. À medida que a contagem aumenta, os PVCs correspondentes são criados.

    a. Na linha de comando, execute o seguinte comando:

    kubectl  edit statefulset web
    

    b. O arquivo será aberto na linha de comando. Encontre o campo spec.replicas e atualize o valor para 9.

    c. Na linha de comando, execute o seguinte comando para conferir a alteração aplicada:

    kubectl get statefulset
    

    Você verá algo parecido com a seguinte resposta:

    NAME   READY   AGE
    web    9/9     13m
    

    d. Na linha de comando, execute o seguinte comando:

    kubectl get deployment
    

    Você verá algo parecido com a seguinte resposta:

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

    e. Na linha de comando, execute o seguinte comando:

    kubectl get pvc
    

    Você verá algo parecido com a seguinte resposta:

    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. Verifique o estado da instância do Filestore.

    Agora, você tem uma implantação com dois pods de réplica e um Statefulset com nove pods de réplica, além do total de dez PVCs, cada um com tamanho de 100 GiB. Todos os volumes são agrupados em uma única instância de compartilhamento múltiplo do Filestore.

    a. Na linha de comando, execute o seguinte comando instances list:

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

    em que:

    • YOUR_PROJECT_ID é o nome do projeto que está sendo usado. Por exemplo, my-project.

    • REGION é o nome da região que está sendo usada. Por exemplo, us-central1.

    Você verá algo parecido com a seguinte resposta:

    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. Na linha de comando, execute o seguinte 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
    
    

    em que:

    • YOUR_PROJECT_ID é o nome do projeto que está sendo usado. Por exemplo, my-project.

    • REGION é o nome da região que está sendo usada. Por exemplo, us-central1.

Expanda um PVC e verifique a instância do Filestore

Nesta seção, mostramos como expandir um PVC atual e verificar o tamanho da instância do Filestore.

  1. Expanda um PVC.

    Os PVCs, apoiados por compartilhamentos em uma instância de compartilhamento múltiplo do Filestore, podem crescer até o tamanho máximo especificado no parâmetro max-volume-size. Para verificar isso, expanda um dos volumes associados ao Statefulset enquanto o pod estiver usando-o.

    Na linha de comando, execute o seguinte comando para verificar o tamanho atual do PVC da 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. Na linha de comando, execute o seguinte comando para aumentar o tamanho para 500 GiB:

    kubectl edit pvc test-pvc-multishare-web-0
    
  3. O arquivo será aberto na linha de comando. Encontre o campo spec.resources.requests.storage e atualize o valor para 500Gi.

  4. Na linha de comando, execute o seguinte comando para conferir a alteração aplicada:

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

    Você verá algo parecido com a seguinte resposta:

    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
    

    O driver CSI do Filestore aceitou a solicitação, primeiro expandindo a instância do Filestore e, em seguida, expandindo o compartilhamento do PVC.

    Especificamente, o driver CSI do Filestore expandiu automaticamente a instância para 1.536 Gi para acomodar o novo tamanho de compartilhamento de 500 Gi.

  5. Na linha de comando, execute o seguinte comando instances describe para verificar a capacidade da instância do 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
    

    em que:

    • YOUR_PROJECT_ID é o nome do projeto que está sendo usado. Por exemplo, my-project.

    • REGION é o nome da região que está sendo usada. Por exemplo, us-central1.

Provisionamento dinâmico em uma VPC compartilhada

O driver CSI do Filestore para GKE oferece suporte ao provisionamento dinâmico de volumes em um projeto de serviço em uma VPC compartilhada. A seção a seguir mostra como usar o driver CSI do Filestore para provisionar dinamicamente volumes nas instâncias de compartilhamento múltiplo do Filestore em um projeto de serviço em uma rede VPC compartilhada.

  1. Conclua as etapas de configuração para uma rede VPC compartilhada e acesso a serviços particulares.

  2. Crie um StorageClass para provisionar dinamicamente volumes com suporte de uma instância de compartilhamento múltiplo do Filestore em uma VPC compartilhada.

    Execute o seguinte comando para implantar um 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
    

    em que:

    • HOST_PROJECT_ID é o ID ou o nome do projeto host da rede VPC compartilhada. Por exemplo, my-host-project.

    • SHARED_VPC_NAME o nome da rede rede VPC compartilhada. Por exemplo, my-shared-vpc.

    Se você quiser implantar o recurso em um intervalo de endereços IP reservado, adicione a seguinte linha aos parâmetros usados no comando:

    reserved-ip-range: RESERVED_NAME
    

    Quando RESERVED_NAME é o nome do intervalo de endereços IP reservado, uma instância do Filestore pode ser provisionada. Por exemplo, filestore-reserved-ip-range. Se um intervalo de IP reservado for especificado, ele precisará ser um intervalo de endereços nomeado em vez de um valor de CIDR direto.

    Para mais informações, consulte Alocar intervalos de endereços IP ou Como configurar um intervalo de endereços IP reservados. Para conferir um exemplo de como criar um nome reservado usando o console do Google Cloud, consulte Criar uma alocação de IP.

  3. Crie uma implantação.

    Execute o seguinte comando para criar um 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
    

Instâncias do Filestore ativadas para CMEK

É possível criar volumes do GKE hospedados em instâncias de compartilhamento múltiplo do Filestore ativadas para CMEK. Nesta seção, você verá como configurar uma chave de criptografia gerenciada pelo cliente (CMEK) para a instância do Filestore.

Os detalhes da chave gerenciada pelo cliente podem ser obtidos no StorageClass. Qualquer instância criada dinamicamente pelo driver CSI do Filestore, que faz referência a esse StorageClass, terá a CMEK ativada.

  1. Criar um StorageClass habilitado para CMEK.

    a. Execute este 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
    

    em que:

    • KEY_PROJECT_ID é o nome do projeto em que a chave está localizada. Por exemplo, my-key-project.

    • REGION é o nome da região que está sendo usada. Por exemplo, us-central1.

    • RING_NAME é o nome do keyring. Por exemplo, my-key-ring-name.

    • KEY_NAME é o nome da chave. Por exemplo, my-key-name.

  2. Crie uma implantação.

    b. Execute o seguinte comando para criar um 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
    

Associar PVCs a instâncias do Filestore

Nesta seção, você verá como associar os PVCs às instâncias do Filestore.

Com as instâncias de compartilhamento múltiplo do Filestore, cada PVC é hospedado em uma instância do Filestore pelo driver CSI do Filestore. Os detalhes da instância do Filestore que hospeda o volume e a parcela que representa o volume do Kubernetes são capturados no campo volumeHandle da especificação de volumes permanentes. O formato do identificador de volume é o seguinte:

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

O comando kubectl a seguir pode ser usado para determinar rapidamente os mapeamentos entre um PVC, um PV, uma instância do Filestore e um compartilhamento do Filestore.

Na linha de comando, execute o seguinte comando:

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

Você verá algo parecido com a seguinte resposta:

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

em que:

  • YOUR_PROJECT_ID é o nome do projeto que está sendo usado. Por exemplo, my-project.

Os dois volumes permanentes no cluster são hospedados em uma única instância do Filestore.

A seguir