Neste guia, mostramos como usar o Multishare do Filestore para o Google Kubernetes Engine com o driver CSI do Filestore do GKE.
Antes de começar
Antes de começar, conclua as etapas de configuração necessárias para usar o Filestore.
Ative o Driver CSI do GKE Filestore (GKE versão 1.23 ou posterior).
Usar o Multishare do Filestore com vários aplicativos
Nesta seção, mostramos como implantar dois aplicativos, um Deployment e um Statefulset, cada um usando um StorageClass do Filestore multicompartilhamentos. Você também vai ver como os pacotes do GKE (um processo para empacotar aplicativos nos nós do GKE com eficiência) todos os volumes na mesma instância subjacente do Filestore Enterprise.
Use o StorageClass fornecido pelo GKE ou crie um StorageClass personalizado.
Depois que o driver CSI do GKE Filestore for ativado, os usuários poderão acessar o StorageClass de vários compartilhamentos fornecido pelo GKE
enterprise-multishare-rwx
com a configuração a seguir. Com referência a esse StorageClass, o driver CSI do GKE Filestore usa o provisionamento de volume dinâmico para criar automaticamente PersistentVolumes para novos pedidos de PersistentVolume. Isso exige a demanda de carga de trabalho do 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>
Se necessário, os usuários podem criar um StorageClass personalizado com base nesse modelo, considerando os seguintes requisitos de nomenclatura:
O nome do StorageClass precisa ser um nome de subdomínio de DNS válido.
O nome de StorageClass de vários compartilhamentos também é usado como um rótulo de instância e precisa seguir as diretrizes de nomenclatura de rótulo.
Criar uma implantação com várias réplicas de pods 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
Verifique as réplicas de pods.
a. Na linha de comando, execute o seguinte comando para verificar o status do PVC:
$ kubectl get pvc
Você verá algo semelhante a esta 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 semelhante a esta 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
Réplicas de escalonamento
a. Na linha de comando, execute o seguinte comando 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 para10
.c. Na linha de comando, execute o seguinte comando para ver a alteração aplicada:
$ kubectl get pod
Você verá algo semelhante a esta 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:
$ kubectl get deployment
Você verá algo semelhante a esta resposta:
NAME READY UP-TO-DATE AVAILABLE AGE web-server-multishare 10/10 10 10 36m
. Na linha de comando, execute o seguinte comando para verificar o status do PVC vinculado:
$ kubectl get pvc
Você verá algo semelhante a esta 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 comando 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 para2
.h. Na linha de comando, execute o seguinte comando para ver a alteração aplicada:
$ kubectl get pod
Você verá algo semelhante a esta 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
Implante um Statefulset.
Implante um segundo aplicativo que compartilhe a instância subjacente do Filestore.
Para fazer isso, provisione 200 GiB de espaço e verifique se ele usa a mesma instância do Filestore subjacente que o 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 compartilhando a instância.
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: k8s.gcr.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
Verifique réplicas e volumes do Statefulset.
Na linha de comando, execute o seguinte:
$ kubectl get pod
Você verá algo semelhante a esta 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
Observe que os dois primeiros pods estão associados ao Statefulset. Os dois últimos pods estão associados à implantação.
Na linha de comando, execute o seguinte:
$ kubectl get statefulset
Você verá algo semelhante a esta resposta:
NAME READY AGE web 2/2 2m8s
Na linha de comando, execute o seguinte:
$ kubectl get pvc
Você verá algo semelhante a esta 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 aoweb-server-multishare
da implantação.Os PVCs
test-pvc-multishare-web-0
etest-pvc-multishare-web-1
estão associados ao Statefulset.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:
$ kubectl edit statefulset web
b. O arquivo será aberto na linha de comando. Encontre o campo
spec.replicas
e atualize o valor para9
.c. Na linha de comando, execute o seguinte comando para ver a alteração aplicada:
$ kubectl get statefulset
Você verá algo semelhante a esta resposta:
NAME READY AGE web 9/9 13m
d. Na linha de comando, execute o seguinte:
$ kubectl get deployment
Você verá algo semelhante a esta resposta:
NAME READY UP-TO-DATE AVAILABLE AGE web-server-multishare 2/2 2 2 65m
. Na linha de comando, execute o seguinte:
$ kubectl get pvc
Você verá algo semelhante a esta 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
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 10 PVCs, cada um com 100 GiB de tamanho. Todos os volumes são agrupados em uma única instância do Multishare do Filestore.
a. Na linha de comando, execute o seguinte comando
instances list
:$ gcloud beta filestore instances list --project=YOUR_PROJECT_ID --region=REGION
onde:
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 semelhante a esta 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
onde:
Expandir um PVC e verificar a instância do Filestore
Nesta seção, mostramos como expandir um PVC atual e verificar o tamanho da instância do Filestore.
Expanda um PVC.
Os PVCs, apoiados por compartilhamentos em uma instância do Multishare do Filestore, podem crescer para um tamanho máximo de 1 TiB. Para verificar isso, expanda um dos volumes associados ao Statefulset enquanto o pod o está usando.
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" } }
Na linha de comando, execute o seguinte comando para aumentar o tamanho para 500 GiB:
$ kubectl edit pvc test-pvc-multishare-web-0
O arquivo será aberto na linha de comando. Encontre o campo
spec.resources.requests.storage
e atualize o valor para500Gi
.Na linha de comando, execute o seguinte comando para ver a alteração aplicada:
$ kubectl get pvc test-pvc-multishare-web-0
Você verá algo semelhante a esta 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 subjacente do Filestore e, em seguida, expandindo o compartilhamento do suporte ao PVC.
Especificamente, o driver CSI do Filestore ampliou automaticamente a instância para 1.536 Gi para acomodar o novo tamanho de compartilhamento de 500 Gi.
Na linha de comando, execute o comando
instances describe
a seguir 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
onde:
Provisionamento dinâmico em uma VPC compartilhada
O driver CSI do Filestore para GKE é compatível com 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 em instâncias de compartilhamento múltiplo do Filestore em um projeto de serviço em uma rede VPC compartilhada.
Conclua as etapas de configuração para uma rede VPC compartilhada e o acesso a serviços particulares.
Crie um StorageClass para provisionar dinamicamente volumes com base em uma instância de compartilhamentos 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
onde:
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 VPC compartilhada. Por exemplo,
my-shared-vpc
.
Se você quiser implantar o recurso em um intervalo de endereços IP reservado, adicione a linha a seguir aos parâmetros usados no comando:
reserved-ip-range: RESERVED_NAME
Em que RESERVED_NAME é o nome do intervalo de endereços IP reservado em que 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 ver um exemplo de como criar um nome reservado usando o console do Google Cloud, consulte Criar uma alocação de IP.
Crie uma implantação.
Execute este 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 de arquivos do Filestore ativadas para CMEK. Nesta seção, você verá como configurar uma chave de criptografia gerenciada pelo cliente (CMEK) para sua instância do Filestore.
Os detalhes da chave gerenciada pelo cliente podem ser fornecidos no StorageClass. Todas as instâncias criadas dinamicamente pelo driver CSI do Filestore, que fazem referência a esse StorageClass, terão a CMEK ativada.
Crie um StorageClass ativado pela 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
onde:
Crie uma implantação.
b. Execute este 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
Mapear PVCs para instâncias do Filestore
Nesta seção, você verá como mapear seus PVCs para suas instâncias do Filestore.
Com as instâncias do Multishare do Filestore, cada PVC é hospedado em uma
instância do Filestore pelo driver CSI do Filestore. Os
detalhes da instância subjacente do Filestore que hospeda o volume e
o compartilhamento que representa o volume do Kubernetes são capturados no campo volumeHandle
da especificação de volumes permanentes. O formato do identificador de volume é
este:
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, PV, instância do Filestore e um compartilhamento
do Filestore.
Na linha de comando, execute o seguinte:
$ kubectl get pv -o jsonpath='{range .items[*]}{"pv="}{.metadata.name}{",pvc="}{.spec.claimRef.name}{",volumeHandle="}{.spec.csi.volumeHandle}{"\n"}{end}'
Você verá algo semelhante a esta 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
onde:
- YOUR_PROJECT_ID é o nome do projeto que está sendo usado. Por exemplo,
my-project
.
Observe que dois volumes permanentes no cluster estão hospedados em uma única instância do Filestore.
A seguir
- Criar uma instância em uma rede VPC compartilhada em projetos de serviço.
- Compare as vantagens relativas de armazenamento em blocos, de arquivos e objetos.
- Opções de armazenamento para cargas de trabalho de HPC no Google Cloud.