Otimize o desempenho e o custo do armazenamento com os conjuntos de armazenamento Hyperdisk


Esta página descreve como os seus clusters do Google Kubernetes Engine (GKE) podem agrupar e partilhar a capacidade de armazenamento, o débito e os IOPS entre discos através da utilização de pools de armazenamento do GKE Hyperdisk.

Vista geral

Os conjuntos de armazenamento agrupam logicamente os dispositivos de armazenamento físico, o que lhe permite segmentar os seus recursos. Pode aprovisionar Hyperdisks do Google Cloud nestes conjuntos de armazenamento, criando essencialmente conjuntos de armazenamento de Hyperdisks. Os pools de armazenamento Hyperdisk oferecem capacidade, débito e IOPS pré-aprovisionados que os discos do cluster do GKE podem partilhar.

Pode usar os conjuntos de armazenamento Hyperdisk para gerir os seus recursos de armazenamento de forma mais eficiente e rentável. Isto permite-lhe tirar partido das tecnologias de eficiência, como a eliminação de duplicados e o aprovisionamento reduzido.

Neste guia, usa a zona us-east4-c para criar o conjunto de armazenamento equilibrado do Hyperdisk e outros recursos.

Considerações de planeamento

Tenha em consideração os seguintes requisitos e limitações antes de aprovisionar e consumir o seu conjunto de armazenamento Hyperdisk.

Criar e gerir pools de armazenamento

Aplicam-se os seguintes requisitos e limitações:

Aprovisionamento de discos de arranque em conjuntos de armazenamento

Aplicam-se os seguintes requisitos e limitações:

Aprovisionamento de disco anexado em conjuntos de armazenamento

Aplicam-se os seguintes requisitos e limitações:

  • A versão mínima do GKE necessária para o aprovisionamento de discos anexados em pools de armazenamento é a 1.29.2-gke.1035000 e posterior.
  • Certifique-se de que o controlador CSI do Persistent Disk do Compute Engine está ativado. O controlador de disco persistente do Compute Engine está ativado por predefinição em novos clusters do Autopilot e Standard, e não pode ser desativado nem editado em clusters do Autopilot. Para ativar o controlador, consulte o artigo Ativar o controlador CSI do Persistent Disk do Compute Engine num cluster existente.
  • Certifique-se de que o conjunto de armazenamento está, pelo menos, numa das localizações dos nós do cluster e nas localizações dos nós do conjunto de nós.
  • Só pode aprovisionar discos ligados Hyperdisk Throughput e Hyperdisk Balanced em pools de armazenamento. O tipo do disco anexado tem de corresponder ao tipo do conjunto de armazenamento. Para mais informações, consulte o artigo Tipos de pools de armazenamento Hyperdisk.
  • Numa StorageClass, só é permitido 1 conjunto de armazenamento por zona.
  • Numa StorageClass, todos os conjuntos de armazenamento têm de ter o tipo de conjunto de armazenamento.
  • Certifique-se de que o tipo de máquina que executa o seu pod suporta a associação do tipo de disco que está a usar do conjunto de armazenamento. Para mais informações, consulte o artigo Suporte de tipos de máquinas Hyperdisk.

Quota

Ao criar um conjunto de armazenamento do Hyperdisk, pode configurá-lo com o aprovisionamento padrão ou avançado para capacidade e desempenho. Se quiser aumentar a quota de capacidade, débito ou IOPS, peça uma quota superior para o filtro de quota relevante.

Para mais informações, consulte os artigos Veja as quotas do seu projeto e Peça um ajuste de quota.

Use os seguintes filtros de quota para pools de armazenamento equilibrado Hyperdisk:

  • HDB-STORAGE-POOL-TOTAL-ADVANCED-CAPACITY-per-project-region: para aumentar a capacidade com o aprovisionamento avançado de capacidade.
  • HDB-STORAGE-POOL-TOTAL-ADVANCED-IOPS-per-project-region: para aumentar as IOPS com o aprovisionamento de desempenho avançado.
  • HDB-STORAGE-POOL-TOTAL-ADVANCED-THROUGHPUT-per-project-region: para aumentar o débito com o aprovisionamento de desempenho avançado.
  • HDB-TOTAL-GB-per-project-region: para aumentar a capacidade com o aprovisionamento de capacidade padrão.
  • HDB-TOTAL-IOPS-per-project-region: para aumentar as IOPS com o aprovisionamento de desempenho padrão.
  • HDB-TOTAL-THROUGHPUT-per-project-region: para aumentar o débito com o aprovisionamento de desempenho padrão.

Use os seguintes filtros de quota para pools de armazenamento de débito do Hyperdisk:

  • HDT-STORAGE-POOL-TOTAL-ADVANCED-CAPACITY-per-project-region: para aumentar a capacidade com o aprovisionamento avançado de capacidade.
  • HDT-STORAGE-POOL-TOTAL-ADVANCED-THROUGHPUT-per-project-region: para aumentar o débito com o aprovisionamento de desempenho avançado.
  • HDT-TOTAL-GB-per-project-region: para aumentar a capacidade com o aprovisionamento de capacidade padrão.
  • HDT-TOTAL-THROUGHPUT-per-project-region: para aumentar o débito com o aprovisionamento de desempenho padrão.

Por exemplo, se quiser aumentar a capacidade total dos Hyperdisk Balanced Storage Pools com aprovisionamento de capacidade avançado, por projeto e por região, peça uma quota mais elevada para o seguinte filtro:

hdb-storage-pool-total-advanced-capacity-per-project-region.

Preços

Consulte os preços dos conjuntos de armazenamento Hyperdisk para ver detalhes dos preços.

Antes de começar

Antes de começar, certifique-se de que realizou as seguintes tarefas:

  • Ative a API Google Kubernetes Engine.
  • Ative a API Google Kubernetes Engine
  • Se quiser usar a CLI gcloud para esta tarefa, instale-a e, em seguida, inicialize-a. Se instalou anteriormente a CLI gcloud, execute gcloud components update para obter a versão mais recente.

Crie um conjunto de armazenamento Hyperdisk

Crie um conjunto de armazenamento Hyperdisk antes de aprovisionar discos de arranque ou discos anexados nesse conjunto de armazenamento. Para mais informações, consulte o artigo Crie pools de armazenamento Hyperdisk.

Certifique-se de que cria pools de armazenamento numa das zonas suportadas.

Por exemplo, use o seguinte comando para criar um Hyperdisk Balanced Storage Pool com capacidade avançada e desempenho avançado, e aprovisionar 10 TB de capacidade, 10 000 IOPS/s e 1024 MBps de débito na zona us-east4-c:

export PROJECT_ID=PROJECT_ID
export ZONE=us-east4-c
gcloud compute storage-pools create pool-$ZONE \
    --provisioned-capacity=10tb --storage-pool-type=hyperdisk-balanced \
    --zone=$ZONE --project=$PROJECT_ID --capacity-provisioning-type=advanced \
    --performance-provisioning-type=advanced --provisioned-iops=10000 \
    --provisioned-throughput=1024

Substitua PROJECT_ID pelo ID do projeto da sua Google Cloud conta.

Inspecione zonas de pool de armazenamento

  • Para clusters do Autopilot e clusters Standard com o aprovisionamento automático de nós ativado, pode criar um conjunto de armazenamento em qualquer zona na região do cluster. Se não existir nenhum conjunto de nós na zona onde criou o conjunto de armazenamento, os pods permanecem no estado Pending até que o GKE Cluster Autoscaler possa aprovisionar um novo conjunto de nós nessa zona.

  • Para clusters padrão sem aprovisionamento automático de nós, crie pools de armazenamento nas zonas de nós predefinidas do cluster, uma vez que as pools de armazenamento são recursos zonais. Pode definir as zonas dos nós do cluster com a flag --node-locations.

    • Para clusters zonais, se não especificar o --node-locations, todos os nós são criados na zona principal do cluster.
    • Para clusters regionais, se não especificar o --node-locations, o GKE distribui os nós de trabalho em três zonas escolhidas aleatoriamente na região.

Para inspecionar as zonas de nós predefinidas de um cluster, execute o seguinte comando:

gcloud container clusters describe CLUSTER_NAME  | yq '.locations'

Substitua CLUSTER_NAME pelo nome do cluster que está a criar durante o aprovisionamento de um disco de arranque ou um disco anexado.

Aprovisione um disco de arranque do GKE num conjunto de armazenamento Hyperdisk

Pode aprovisionar um disco de arranque do GKE num conjunto de armazenamento Hyperdisk quando realizar qualquer uma das seguintes ações:

  • Quando cria um novo cluster do GKE
  • Quando cria um novo node pool
  • Quando atualiza um node pool existente

Quando cria um cluster

Para criar um cluster do GKE com discos de arranque aprovisionados num conjunto de armazenamento, use o seguinte comando:

gcloud container clusters create CLUSTER_NAME \
    --disk-type=DISK_TYPE --storage-pools=STORAGE_POOL,[...] \
    --node-locations=ZONE,[...] --machine-type=MACHINE_TYPE \
    --location=CONTROL_PLANE_LOCATION

Substitua o seguinte:

  • CLUSTER_NAME: indique um nome exclusivo para o cluster que está a criar.
  • DISK_TYPE: defina este valor como hyperdisk-balanced. Se deixar em branco, o tipo de disco é predefinido como Hyperdisk Balanced.
  • STORAGE_POOL,[...]: uma lista separada por vírgulas dos caminhos dos recursos do conjunto de armazenamento (por exemplo, projects/my-project/zones/us-east4-c/storagePools/pool-us-east4-c) onde os discos de arranque do cluster vão ser aprovisionados. Certifique-se de que as zonas nos caminhos dos recursos do conjunto de armazenamento correspondem às zonas em --node-locations.
  • ZONE,[...]: uma lista separada por vírgulas de zonas onde a área de cobertura do seu nó deve ser replicada. Para clusters regionais, pode especificar regiões. Todas as zonas têm de estar na mesma região que o cluster, especificada pela flag --location.
  • MACHINE_TYPE: o tipo de máquina suportado que quer usar para os seus nós.
  • CONTROL_PLANE_LOCATION: a localização do Compute Engine do plano de controlo do seu cluster. Indique uma região para clusters regionais ou uma zona para clusters zonais.

Quando cria um node pool

Para criar um node pool do GKE com discos de arranque aprovisionados num conjunto de armazenamento, use o seguinte comando:

gcloud container node-pools create NODE_POOL_NAME \
    --disk-type=DISK_TYPE --storage-pools=STORAGE_POOL,[...] \
    --node-locations=ZONE,[...] --machine-type=MACHINE_TYPE \
    --location=CONTROL_PLANE_LOCATION --cluster=CLUSTER_NAME

Substitua o seguinte:

  • NODE_POOL_NAME: indique um nome exclusivo para o grupo de nós que está a criar.
  • DISK_TYPE: defina este valor como hyperdisk-balanced. Se deixar em branco, o tipo de disco é predefinido como Hyperdisk Balanced.
  • STORAGE_POOL,[...]: uma lista separada por vírgulas dos caminhos dos recursos do conjunto de armazenamento (por exemplo, projects/my-project/zones/us-east4-c/storagePools/pool-us-east4-c) onde os discos de arranque do cluster vão ser aprovisionados. Certifique-se de que as zonas nos caminhos dos recursos do conjunto de armazenamento correspondem aos valores em --node-locations.
  • ZONE,[...]: uma lista separada por vírgulas de zonas onde a área de cobertura do seu nó deve ser replicada. Todas as zonas têm de estar na mesma região que o cluster, especificada pela flag -location.
  • MACHINE_TYPE: o tipo de máquina suportado que quer usar para os seus nós.
  • CONTROL_PLANE_LOCATION: a localização do Compute Engine do plano de controlo do seu cluster. Indique uma região para clusters regionais ou uma zona para clusters zonais.
  • CLUSTER_NAME: um cluster existente onde está a criar o node pool.

Quando atualiza um node pool

Pode usar um comando update para adicionar ou substituir conjuntos de armazenamento num conjunto de nós. Não é possível usar este comando para remover pools de armazenamento de um pool de nós.

Para atualizar um node pool do GKE de modo que os respetivos discos de arranque sejam aprovisionados num conjunto de armazenamento, use o seguinte comando.

gcloud container node-pools update NODE_POOL_NAME \
  --storage-pools=STORAGE_POOL,[...] \
  --location=CONTROL_PLANE_LOCATION --cluster=CLUSTER_NAME
  • NODE_POOL_NAME: o nome de um conjunto de nós existente que quer atualizar para usar um conjunto de armazenamento.
  • STORAGE_POOL,[...]: uma lista separada por vírgulas de caminhos de recursos do conjunto de armazenamento existentes (por exemplo, projects/my-project/zones/us-east4-c/storagePools/pool-us-east4-c). Certifique-se de que as zonas nos caminhos de recursos do conjunto de armazenamento correspondem à zona do conjunto de nós que está a atualizar.
  • CONTROL_PLANE_LOCATION: a localização do Compute Engine do plano de controlo do seu cluster. Indique uma região para clusters regionais ou uma zona para clusters zonais.
  • CLUSTER_NAME: o nome do cluster do GKE ao qual este conjunto de nós pertence.

Esta alteração requer a recriação dos nós, o que pode causar interrupções nas cargas de trabalho em execução. Para ver detalhes sobre esta alteração específica, procure a linha correspondente na tabela alterações manuais que recriam os nós através de uma estratégia de atualização de nós sem respeitar as políticas de manutenção. Para saber mais sobre as atualizações de nós, consulte o artigo Planeamento de interrupções de atualizações de nós.

Aprovisione um disco anexado do GKE num conjunto de armazenamento do Hyperdisk

Nesta secção:

  • Cria um novo cluster do GKE com discos anexados aprovisionados num conjunto de armazenamento.
  • Crie uma StorageClass para aprovisionar dinamicamente um PersistentVolume (PV) quando um Pod o pede através de um PersistentVolumeClaim (PVC). Para que um PV consuma os recursos partilhados do conjunto de armazenamento, especifique o conjunto de armazenamento através do parâmetro storage-pools na sua StorageClass. A StorageClass é então usada num PVC para aprovisionar o volume Hyperdisk Balanced que vai ser usado pelo pod.
  • Crie um PVC para pedir um PV, um fragmento de armazenamento do Hyperdisk, para um pod do seu cluster do GKE. Isto permite-lhe beneficiar dos recursos partilhados do conjunto de armazenamento.
  • Crie uma implementação que use um PVC para garantir que a sua aplicação tem acesso ao armazenamento persistente, mesmo após reinícios e reagendamentos de pods.

Crie um cluster do GKE

Antes de começar, reveja as considerações para o aprovisionamento de um disco anexado.

Piloto automático

Para criar um cluster do Autopilot através da CLI gcloud, consulte o artigo Crie um cluster do Autopilot.

Exemplo:

gcloud container clusters create-auto CLUSTER_NAME --location=CONTROL_PLANE_LOCATION

Substitua o seguinte:

  • CLUSTER_NAME: indique um nome exclusivo para o cluster que está a criar.
  • CONTROL_PLANE_LOCATION: a região do Compute Engine do plano de controlo do seu cluster.

Para selecionar um tipo de máquina suportado, especifica o cloud.google.com/compute-class: PerformancenodeSelector enquanto cria uma implementação. Para ver uma lista das séries de máquinas do Compute Engine disponíveis com a classe de computação de desempenho, consulte o artigo Séries de máquinas suportadas.

Standard

Para criar um cluster zonal padrão com a CLI gcloud, consulte o artigo Criar um cluster zonal.

Para criar um cluster regional padrão com a CLI gcloud, consulte o artigo Criar um cluster regional.

Exemplo:

gcloud container clusters create CLUSTER_NAME --location=CONTROL_PLANE_LOCATION --project=PROJECT_ID --machine-type=MACHINE_TYPE --disk-type="DISK_TYPE"

Substitua o seguinte:

  • CLUSTER_NAME: indique um nome exclusivo para o cluster que está a criar.
  • CONTROL_PLANE_LOCATION: a localização do Compute Engine do plano de controlo do seu cluster. Indique uma região para clusters regionais ou uma zona para clusters zonais.
  • PROJECT_ID: o ID do projeto da sua Google Cloud conta.
  • MACHINE_TYPE: o tipo de máquina suportado que quer usar para os seus nós.
  • DISK_TYPE: defina este valor como hyperdisk-balanced. Se deixar em branco, o tipo de disco é predefinido como Hyperdisk Balanced.

Crie uma StorageClass

No Kubernetes, para indicar que quer que o seu PV seja criado num conjunto de armazenamento, use uma StorageClass. Para saber mais, consulte o artigo StorageClasses.

Para criar uma nova StorageClass com o nível de débito ou IOPS pretendido:

  • Use pd.csi.storage.gke.io no campo de aprovisionamento.
  • Especifique o tipo de armazenamento Hyperdisk Balanced.
  • Especifique o parâmetro storage-pools com o valor como uma lista de pools de armazenamento específicos que quer usar. Cada conjunto de armazenamento na lista tem de ser especificado no formato: projects/PROJECT_ID/zones/ZONE/storagePools/STORAGE_POOL_NAME.
  • Opcionalmente, especifique os parâmetros de desempenho provisioned-throughput-on-create e provisioned-iops-on-create.

Cada tipo de Hyperdisk tem valores predefinidos para o desempenho determinado pelo tamanho do disco inicial aprovisionado. Quando cria uma StorageClass, pode especificar opcionalmente os seguintes parâmetros, consoante o tipo de Hyperdisk. Se omitir estes parâmetros, o GKE usa as predefinições do tipo de disco com base na capacidade.

Parâmetro Tipo de Hyperdisk Utilização
provisioned-throughput-on-create Hyperdisk Balanced, Hyperdisk Throughput Expresse o valor de débito em MiB/s usando o qualificador "Mi"; por exemplo, se o débito necessário for de 250 MiB/s, especifique "250Mi" ao criar a StorageClass.
provisioned-iops-on-create Hyperdisk Balanced, Hyperdisk IOPS O valor de IOPS deve ser expresso sem qualificadores. Por exemplo, se precisar de 7000 IOPS, especifique "7000" quando criar a StorageClass.

Para orientações sobre os valores permitidos para a taxa de transferência ou as IOPS, consulte o artigo Planeie o nível de desempenho do seu volume do Hyperdisk.

Use o manifesto seguinte para criar e aplicar uma StorageClass denominada storage-pools-sc para o aprovisionamento dinâmico de um PV no conjunto de armazenamento projects/my-project/zones/us-east4-c/storagePools/pool-us-east4-c:

kubectl apply -f - <<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: storage-pools-sc
provisioner: pd.csi.storage.gke.io
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
parameters:
  type: hyperdisk-balanced
  provisioned-throughput-on-create: "140Mi"
  provisioned-iops-on-create: "3000"
  storage-pools: projects/my-project/zones/us-east4-c/storagePools/pool-us-east4-c
EOF

Ao usar o volumeBindingMode: WaitForFirstConsumer nesta StorageClass, a associação e o aprovisionamento de um PVC são atrasados até que seja criado um Pod que use o PVC. Esta abordagem garante que a PV não é aprovisionada prematuramente e que existe uma correspondência de zonas entre a PV e o agrupamento que a consome. Se as respetivas zonas não corresponderem, o Pod permanece no estado Pending.

Crie um PersistentVolumeClaim (PVC)

Crie um PVC que faça referência à storage-pools-sc StorageClass que criou.

Use o seguinte manifesto para criar um PVC denominado my-pvc, com 2048 GiB como a capacidade de armazenamento de destino para o volume Hyperdisk Balanced:

kubectl apply -f - <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  storageClassName: storage-pools-sc
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2048Gi
EOF

Crie uma implementação que use o PVC

Prática recomendada:

Quando usar pods com volumes persistentes, use um controlador de carga de trabalho, como uma implementação ou um StatefulSet.

Para garantir que os pods podem ser agendados num conjunto de nós com uma série de máquinas que suporta o Hyperdisk Balanced, configure uma implementação com o cloud.google.com/machine-family seletor de nós. Para mais informações, consulte o suporte de tipos de máquinas para hiperdiscos. Usa a série de máquinas c3 na seguinte implementação de exemplo.

Crie e aplique o seguinte manifesto para configurar um pod para implementar um servidor Web do Postgres com o PVC criado na secção anterior:

Piloto automático

Nos clusters do Autopilot, especifique o cloud.google.com/compute-class: PerformancenodeSelector para aprovisionar um volume do Hyperdisk Balanced. Para mais informações, consulte o artigo Peça um nó dedicado para um pod.

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
spec:
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      nodeSelector:
        cloud.google.com/machine-family: c3
        cloud.google.com/compute-class: Performance
      containers:
      - name: postgres
        image: postgres:14-alpine
        args: [ "sleep", "3600" ]
        volumeMounts:
        - name: sdk-volume
          mountPath: /usr/share/data/
      volumes:
      - name: sdk-volume
        persistentVolumeClaim:
          claimName: my-pvc
EOF

Standard

Em clusters padrão sem o aprovisionamento automático de nós ativado, certifique-se de que um conjunto de nós com a série de máquinas especificada está em funcionamento antes de criar a implementação. Caso contrário, o pod não é agendado.

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
spec:
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      nodeSelector:
        cloud.google.com/machine-family: c3
      containers:
      - name: postgres
        image: postgres:14-alpine
        args: [ "sleep", "3600" ]
        volumeMounts:
        - name: sdk-volume
          mountPath: /usr/share/data/
      volumes:
      - name: sdk-volume
        persistentVolumeClaim:
          claimName: my-pvc
EOF

Confirme que a implementação foi criada com êxito:

  kubectl get deployment

As instâncias do Hyperdisk podem demorar alguns minutos a concluir o aprovisionamento e apresentar o estado READY.

Confirme se o disco anexado está aprovisionado

  1. Verifique se o seu PVC denominado my-pvc foi associado com êxito a um PV:

    kubectl get pvc my-pvc
    

    O resultado é semelhante ao seguinte:

    
    NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
    my-pvc        Bound    pvc-1ff52479-4c81-4481-aa1d-b21c8f8860c6   2Ti        RWO            storage-pools-sc   2m24s
    
  2. Verifique se o volume foi aprovisionado conforme especificado na StorageClass e no PVC:

    gcloud compute storage-pools list-disks pool-us-east4-c --zone=us-east4-c
    

    O resultado é semelhante ao seguinte:

    NAME                                      STATUS  PROVISIONED_IOPS  PROVISIONED_THROUGHPUT  SIZE_GB
    pvc-1ff52479-4c81-4481-aa1d-b21c8f8860c6  READY   3000              140                     2048
    

Crie instantâneos e restaure discos anexados em conjuntos de armazenamento

Não é permitido mover discos para dentro ou para fora de um conjunto de armazenamento. Para mover um disco para dentro ou para fora de um conjunto de armazenamento, recrie o disco a partir de um instantâneo. Para mais informações, consulte o artigo Altere o tipo de disco.

Nesta secção:

Crie um ficheiro de teste

Para criar e validar um ficheiro de teste:

  1. Obtenha o nome do pod da implementação do Postgres:

    kubectl get pods -l app=postgres
    

    O resultado é semelhante ao seguinte:

    NAME                         READY   STATUS    RESTARTS   AGE
    postgres-78fc84c9ff-77vx6   1/1     Running   0          44s
    
  2. Crie um ficheiro de teste hello.txt no pod:

    kubectl exec postgres-78fc84c9ff-77vx6 \
      -- sh -c 'echo "Hello World!" > /usr/share/data/hello.txt'
    
  3. Verifique se o ficheiro de teste foi criado:

    kubectl exec postgres-78fc84c9ff-77vx6 \
      -- sh -c 'cat /usr/share/data/hello.txt'
    Hello World!
    

Crie um instantâneo de volume e elimine o ficheiro de teste

Para criar e validar um instantâneo:

  1. Crie uma VolumeSnapshotClass que especifique como o instantâneo dos seus volumes deve ser tirado e gerido:

    kubectl apply -f - <<EOF
    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: my-snapshotclass
    driver: pd.csi.storage.gke.io
    deletionPolicy: Delete
    EOF
    
  2. Crie um VolumeSnapshot e tire o instantâneo do volume associado à my-pvc PersistentVolumeClaim:

    kubectl apply -f - <<EOF
    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: my-snapshot
    spec:
      volumeSnapshotClassName: my-snapshotclass
      source:
        persistentVolumeClaimName: my-pvc
    EOF
    
  3. Verifique se o conteúdo da imagem instantânea do volume foi criado:

    kubectl get volumesnapshotcontents
    

    O resultado é semelhante ao seguinte:

    NAME                                               READYTOUSE   RESTORESIZE     DELETIONPOLICY   DRIVER                  VOLUMESNAPSHOTCLASS   VOLUMESNAPSHOT   VOLUMESNAPSHOTNAMESPACE   AGE
    snapcontent-e778fde2-5f1c-4a42-a43d-7f9d41d093da   false        2199023255552   Delete           pd.csi.storage.gke.io   my-snapshotclass      my-snapshot      default                   33s
    
  4. Confirme se a captura instantânea está pronta a usar:

    kubectl get volumesnapshot \
      -o custom-columns='NAME:.metadata.name,READY:.status.readyToUse'
    

    O resultado é semelhante ao seguinte:

    NAME          READY
    my-snapshot   true
    
  5. Elimine o ficheiro de teste original hello.txt que foi criado no pod postgres-78fc84c9ff-77vx6:

    kubectl exec postgres-78fc84c9ff-77vx6 \
        -- sh -c 'rm /usr/share/data/hello.txt'
    

Restaure o instantâneo de volume

Para restaurar a imagem instantânea de volume e os dados, siga estes passos:

  1. Crie um novo PVC que restaure os dados a partir de uma captura instantânea e garanta que o novo volume é aprovisionado no mesmo conjunto de armazenamento (storage-pools-sc) que o volume original. Aplique o seguinte manifesto:

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-restore
    spec:
      dataSource:
        name: my-snapshot
        kind: VolumeSnapshot
        apiGroup: snapshot.storage.k8s.io
      storageClassName: storage-pools-sc
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 2048Gi
    EOF
    
  2. Atualize a implementação existente denominada postgres para que use o PVC recém-restaurado que acabou de criar. Aplique o seguinte manifesto:

    kubectl apply -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: postgres
    spec:
      selector:
        matchLabels:
          app: postgres
      template:
        metadata:
          labels:
            app: postgres
        spec:
          nodeSelector:
            cloud.google.com/machine-family: c3
          containers:
          - name: postgres
            image: google/cloud-sdk:slim
            args: [ "sleep", "3600" ]
            volumeMounts:
            - name: sdk-volume
              mountPath: /usr/share/data/
          volumes:
          - name: sdk-volume
            persistentVolumeClaim:
              claimName: pvc-restore
    EOF
    
  3. Obtenha o nome do pod recém-criado que faz parte da postgres implementação:

    kubectl get pods -l app=postgres
    

    O resultado é semelhante ao seguinte:

    NAME                         READY   STATUS        RESTARTS   AGE
    postgres-59f89cfd8c-42qtj   1/1     Running       0          40s
    
  4. Verifique se o ficheiro hello.txt, que foi eliminado anteriormente, existe agora no novo Pod (postgres-59f89cfd8c-42qtj) após restaurar o volume a partir da captura de ecrã:

    kubectl exec postgres-59f89cfd8c-42qtj \
     -- sh -c 'cat /usr/share/data/hello.txt'
    Hello World!
    

    Isto valida que o processo de instantâneo e restauro foi concluído com êxito e que os dados do instantâneo foram restaurados para o novo PV acessível ao Pod.

  5. Confirme que o volume criado a partir da imagem instantânea está localizado no seu conjunto de armazenamento:

    kubectl get pvc pvc-restore
    

    O resultado é semelhante ao seguinte:

    NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
    pvc-restore   Bound    pvc-b287c387-bc51-4100-a00e-b5241d411c82   2Ti        RWO            storage-pools-sc   2m24s
    
  6. Verifique se o novo volume é aprovisionado conforme especificado na StorageClass e no PVC:

    gcloud compute storage-pools list-disks pool-us-east4-c --zone=us-east4-c
    

    O resultado é semelhante ao seguinte, onde pode ver o novo volume pvc-b287c387-bc51-4100-a00e-b5241d411c82 aprovisionado no mesmo conjunto de armazenamento.

    
    NAME                                      STATUS  PROVISIONED_IOPS  PROVISIONED_THROUGHPUT  SIZE_GB
    pvc-1ff52479-4c81-4481-aa1d-b21c8f8860c6  READY   3000              140                     2048
    pvc-b287c387-bc51-4100-a00e-b5241d411c82  READY   3000              140                     2048
    

    Isto garante que o volume restaurado beneficia dos recursos e das capacidades partilhados do conjunto.

Migre volumes existentes para um conjunto de armazenamento

Use a funcionalidade de instantâneo e restauro para migrar volumes que existam fora de um conjunto de armazenamento para um conjunto de armazenamento.

Certifique-se de que as seguintes condições são cumpridas:

  • O seu novo PVC pvc-restore faz referência a uma StorageClass que especifica o parâmetro storage-pools, que aponta para o conjunto de armazenamento para o qual quer mover o volume.
  • O PV de origem cuja captura está a ser feita deve estar associado a um PVC com uma StorageClass que não especifica o parâmetro storage-pools.

Depois de restaurar a partir de uma captura instantânea para um novo volume, pode eliminar o PVC e o PV de origem.

Limpar

Para evitar incorrer em custos na sua conta do Google Cloud , elimine os recursos de armazenamento que criou neste guia. Primeiro, elimine todos os discos no conjunto de armazenamento e, em seguida, elimine o conjunto de armazenamento.

Elimine o disco de arranque

Quando elimina um nó (reduzindo o número de nós do conjunto de nós) ou um conjunto de nós completo, os discos de arranque associados são eliminados automaticamente. Também pode eliminar o cluster para eliminar automaticamente os discos de arranque de todos os conjuntos de nós no mesmo.

Para mais informações, consulte:

Elimine o disco anexado

Para eliminar o disco anexado aprovisionado num conjunto de armazenamento Hyperdisk:

  1. Elimine o pod que usa o PVC:

    kubectl delete deployments postgres
    
  2. Elimine o PVC que usa a StorageClass do Hyperdisk Storage Pool.

    kubectl delete pvc my-pvc
    

    Confirme que o PVC pvc-1ff52479-4c81-4481-aa1d-b21c8f8860c6 foi eliminado:

    gcloud compute storage-pools list-disks pool-us-east4-c --zone=us-east4-c
    

Elimine o pool de armazenamento do Hyperdisk

Elimine o conjunto de armazenamento do Hyperdisk com o seguinte comando:

gcloud compute storage-pools delete pool-us-east4-c --zone=us-east4-c --project=my-project

O que se segue?