Otimize o armazenamento com o Filestore Multishares para GKE

Este guia mostra como usar partilhas múltiplas do Filestore para o Google Kubernetes Engine com o controlador CSI do Filestore do GKE.

Antes de começar

  1. Antes de começar, conclua os passos de configuração necessários para usar o Filestore.

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

    • As versões 1.23 a 1.26 dos controladores suportam até 10 partilhas por instância.

    • As versões 1.27 ou posteriores dos controladores suportam até 80 partilhas por instância.

    Para ver os requisitos mais recentes do controlador CSI do GKE Filestore, consulte o artigo Aceda a instâncias do Filestore com o controlador CSI do Filestore.

Use partilhas múltiplas do Filestore com várias aplicações

Esta secção mostra como implementar duas aplicações, uma implementação e um conjunto com estado, cada uma a usar uma StorageClass de partilhas múltiplas do Filestore. Também verá como o GKE agrupa os contentores (um processo para agrupar eficientemente as aplicações nos seus nós do GKE) todos os volumes na mesma instância empresarial subjacente do Filestore.

  1. Use a StorageClass fornecida pelo GKE, enterprise-multishare-rwx, para criar instâncias que suportam até 10 partilhas.

    • Se quiser criar instâncias que suportem até 80 partilhas, tem de criar uma StorageClass personalizada. Para os fins deste guia, vai usar uma StorageClass com um limite de dez partilhas por instância.

    Depois de o controlador CSI do GKE Filestore estar ativado, os utilizadores podem aceder à StorageClass de partilha múltipla fornecida pelo GKE enterprise-multishare-rwx com a seguinte configuração. Ao fazer referência a esta StorageClass, o controlador CSI do GKE Filestore usa o aprovisionamento dinâmico de volumes para criar automaticamente volumes persistentes (PVs) para novas reivindicações de volumes persistentes (PVCs) conforme a procura de cargas de trabalho do GKE exige:

    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>
    

Crie uma StorageClass personalizada

Se quiser tirar partido do limite de capacidade mais recente de até 80 partilhas por instância do Filestore, crie uma StorageClass personalizada 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 mudar o nome da StorageClass, considere os seguintes requisitos:

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

  • O nome da StorageClass de partilha múltipla também é usado como uma etiqueta de instância e deve seguir as diretrizes de nomenclatura de etiquetas.

  • Se a sua aplicação exigir o aprovisionamento imediato de volume, inclua o Immediate modo de associação de volume:

    volumeBindingMode: Immediate

    Use esta especificação, por exemplo, se não quiser que o aprovisionamento de volumes dependa da criação de pods no cluster do GKE.

  • A partir da versão 1.27 do controlador, se quiser atribuir mais de 10 ações por instância, inclua o parâmetro max-volume-size e atribua-lhe um dos valores aceites da primeira coluna:

    Tamanho máximo do volume (tamanho da partilha) Número máximo de partilhas por instância
    128 GiB 80
    256 GiB 40
    512 GiB 20
    1024 GiB 10

    Por exemplo, a adição do par chave-valor max-volume-size: "128Gi" garante que a StorageClass é mapeada para 80 partilhas, cada uma com um tamanho que varia entre 10 GiB e 128 GiB, para uma única instância de nível empresarial de 10 TiB.

    • Esta capacidade é retrocompatível com instâncias do Filestore criadas pelas versões 1.23 a 1.26 do controlador CSI do Filestore do GKE.

    • As instâncias existentes podem criar novos PVCs ou partilhas com o tamanho mínimo de partilha alargado de 10 GiB.

    • A versão 1.27 ou posterior do controlador CSI do GKE Filestore reconhece instâncias empresariais antigas e atribui-lhes um tamanho máximo de partilha predefinido de 1024 GiB (1 TiB). Como resultado, as instâncias antigas estão limitadas a um máximo de 10 partilhas por instância.

    Para mais informações, consulte o artigo Partilhas múltiplas do Filestore para o GKE.

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

    Crie um ficheiro 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 de pods.

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

    kubectl get pvc
    

    Deve ver algo semelhante à 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 comandos, execute o seguinte comando para verificar o estado do pod:

    kubectl get pod
    

    Deve ver algo semelhante à 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 à escala.

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

    kubectl edit deployment web-server-multishare
    

    b. O ficheiro é aberto na linha de comandos. Encontre o campo spec.replicas e atualize o valor para 10.

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

    kubectl get pod
    

    Deve ver algo semelhante à 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
    

    Repare que estão a ser executados 10 agrupamentos.

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

    kubectl get deployment
    

    Deve ver algo semelhante à seguinte resposta:

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

    e. Na linha de comandos, execute o seguinte comando para verificar o estado de associação do PVC:

    kubectl get pvc
    

    Deve ver algo semelhante à 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 comandos, execute o seguinte comando para editar a implementação:

    kubectl edit deployment web-server-multishare
    

    g. O ficheiro é aberto na linha de comandos. Encontre o campo spec.replicas e atualize o valor para 2.

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

    kubectl get pod
    

    Deve ver algo semelhante à 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. Implemente um Statefulset.

    Implemente uma segunda aplicação que partilhe a instância do Filestore subjacente.

    Para tal, aprovisione 200 GiB de espaço e valide se usa a mesma instância subjacente do Filestore que a primeira aplicação.

    Em seguida, vai dimensionar a aplicação para nove réplicas com um total de 900 GiB (9 réplicas com 100 GiB cada) e verificar se o GKE usa a mesma instância do Filestore partilhando a instância.

    Crie um ficheiro 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 comandos, execute o seguinte comando:

    kubectl get pod
    

    Deve ver algo semelhante à 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
    

    Repare que os dois primeiros pods estão associados ao Statefulset. Os dois últimos pods estão associados à implementação.

    Na linha de comandos, execute o seguinte comando:

    kubectl get statefulset
    

    Deve ver algo semelhante à seguinte resposta:

    NAME   READY   AGE
    web    2/2     2m8s
    

    Na linha de comandos, execute o seguinte comando:

    kubectl get pvc
    

    Deve ver algo semelhante à 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 PVC test-pvc-fs está associado à implementação web-server-multishare.

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

  6. Aumente a escala das réplicas do Statefulset.

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

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

    kubectl  edit statefulset web
    

    b. O ficheiro é aberto na linha de comandos. Encontre o campo spec.replicas e atualize o valor para 9.

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

    kubectl get statefulset
    

    Deve ver algo semelhante à seguinte resposta:

    NAME   READY   AGE
    web    9/9     13m
    

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

    kubectl get deployment
    

    Deve ver algo semelhante à seguinte resposta:

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

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

    kubectl get pvc
    

    Deve ver algo semelhante à 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. Valide o estado da instância do Filestore.

    Agora, tem uma implementação com dois pods de réplica, um Statefulset com nove pods de réplica e um total de 10 PVCs, cada um com 100 GiB. Todos os volumes estão compactados numa única instância de partilha múltipla do Filestore.

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

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

    where:

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

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

    Deve ver algo semelhante à 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 comandos, 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
    
    

    where:

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

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

Expanda um PVC e valide a instância do Filestore

Esta secção mostra como expandir um PVC existente e validar o tamanho da instância do Filestore.

  1. Expanda um PVC.

    Os PVCs, suportados por partilhas numa instância de partilha múltipla do Filestore, podem crescer até ao tamanho máximo especificado no parâmetro max-volume-size. Para validar esta situação, expanda um dos volumes associados ao Statefulset enquanto o pod o estiver a usar.

    Na linha de comandos, 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 comandos, execute o seguinte comando para aumentar o tamanho para 500 GiB:

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

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

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

    Deve ver algo semelhante à 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 controlador CSI do Filestore aceitou o pedido, primeiro, expandindo a instância do Filestore subjacente e, em seguida, expandindo a partilha que suporta o PVC.

    Especificamente, o controlador CSI do Filestore expandiu automaticamente a instância para 1536 Gi para acomodar o novo tamanho da partilha de 500 Gi.

  5. Na linha de comandos, 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
    

    where:

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

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

Aprovisionamento dinâmico numa VPC partilhada

O controlador CSI do Filestore para o GKE suporta o aprovisionamento dinâmico de volumes num projeto de serviço numa VPC partilhada. A secção seguinte mostra como usar o controlador CSI do Filestore para aprovisionar dinamicamente volumes em instâncias de partilha múltipla do Filestore num projeto de serviço numa rede de VPC partilhada.

  1. Conclua os passos de configuração para uma rede de VPC partilhada e acesso a serviços privados.

  2. Crie uma StorageClass para aprovisionar dinamicamente volumes suportados por uma instância de partilhas múltiplas do Filestore numa VPC partilhada.

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

    where:

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

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

    Se quiser implementar o seu recurso num intervalo de endereços IP reservados, adicione a seguinte linha aos parâmetros usados no comando:

    reserved-ip-range: RESERVED_NAME
    

    Onde RESERVED_NAME é o nome do intervalo de endereços IP reservados no qual é possível aprovisionar uma instância do Filestore. Por exemplo, filestore-reserved-ip-range. Se for especificado um intervalo de IPs reservado, tem de ser um intervalo de endereços com nome em vez de um valor CIDR direto.

    Para mais informações, consulte os artigos Atribua intervalos de endereços IP ou Configure um intervalo de endereços IP reservados. Para ver um exemplo de como criar um nome reservado através da Google Cloud consola, consulte o artigo Crie uma atribuição de IP.

  3. Crie uma implementaçã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 com CMEK ativadas

Pode criar volumes do GKE alojados em instâncias de partilha múltipla do Filestore com CMEK ativada. Nesta secção, vai ver como configurar uma chave de encriptação gerida pelo cliente (CMEK) para a sua instância do Filestore.

Os detalhes da chave gerida pelo cliente podem ser fornecidos na StorageClass. Qualquer instância criada dinamicamente pelo controlador CSI do Filestore, que faça referência a esta StorageClass, terá a CMEK ativada.

  1. Crie uma StorageClass com CMEK ativada.

    a. Execute o seguinte 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
    

    where:

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

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

    • RING_NAME o nome do conjunto de chaves. Por exemplo, my-key-ring-name.

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

  2. Crie uma implementaçã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
    

Mapeie PVCs para instâncias do Filestore

Nesta secção, vai ver como mapear os seus PVCs para as suas instâncias do Filestore.

Com as instâncias de partilha múltipla do Filestore, cada PVC é alojado numa instância do Filestore pelo controlador CSI do Filestore. Os detalhes da instância do Filestore subjacente que aloja o volume e a partilha que representa o volume do Kubernetes são capturados no campo volumeHandle da especificação de volumes persistentes. O formato do identificador de volume é o seguinte:

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

Pode usar o seguinte comando kubectl para determinar rapidamente os mapeamentos entre um PVC, um PV, uma instância do Filestore e uma partilha do Filestore.

Na linha de comandos, execute o seguinte comando:

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

Deve ver algo semelhante à 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

where:

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

Repare que dois volumes persistentes no cluster estão alojados numa única instância do Filestore.

O que se segue?