Este guia mostra como usar os Multicompartilhamentos do Filestore para o Google Kubernetes Engine com o driver CSI do GKE Filestore.
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 os Multicompartilhamentos do Filestore com vários aplicativos
Esta seção mostra como implantar dois aplicativos, um Implantação e um Statefulset, cada um usando um StorageClass Multicompartilhamentos do Filestore. Você também verá como o GKE empacota pacotes (um processo para empacotar aplicativos nos nós do GKE com eficiência) em todos os volumes na mesma instância 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
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), já que a demanda de carga 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>
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 StorageClass de vários compartilhamentos também é usado como um rótulo de instância e precisa seguir as diretrizes de nomenclatura de rótulos.
Criar uma implantação com várias réplicas de pod usando um único PVC.
Crie um arquivo de configuração YAML semelhante a este:
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 do pod.
a. Na linha de comando, execute o seguinte comando para verificar o status do PVC:
$ kubectl get pvc
Você verá algo como 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 como 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
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 como 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:
$ kubectl get deployment
Você verá algo como a seguinte 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 da vinculação de PVC:
$ kubectl get pvc
Você verá algo como 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 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 como 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
Implantar um Statefulset.
Implantar 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 subjacente ao 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.
Crie um arquivo de configuração YAML semelhante a este:
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 as réplicas e os volumes do Statefulset.
Na linha de comando, execute o seguinte:
$ kubectl get pod
Você verá algo como 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
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 como a seguinte resposta:
NAME READY AGE web 2/2 2m8s
Na linha de comando, execute o seguinte:
$ kubectl get pvc
Você verá algo como 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 aoweb-server-multishare
de 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 como a seguinte resposta:
NAME READY AGE web 9/9 13m
d. Na linha de comando, execute o seguinte:
$ kubectl get deployment
Você verá algo como a seguinte 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 como 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
Verificar 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. Todos os volumes são empacotados 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
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 como 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
onde:
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.
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 ele estiver sendo usado pelo pod.
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 como 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 subjacente 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.
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
onde:
Provisionamento dinâmico em uma VPC compartilhada
O driver CSI do Filestore para GKE é compatível com o 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 Multishare 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 acesso a serviços particulares.
Crie um StorageClass para provisionar dinamicamente volumes com suporte de uma instância de Multicompartilhamentos 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 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 seguinte linha 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 CIDR direto.Para mais informações, consulte Alocar intervalos de endereços IP ou Como configurar um intervalo de endereços IP reservado. 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. Qualquer instância criada dinamicamente pelo driver CSI do Filestore, que faz referência a esse StorageClass, terá a CMEK ativada.
Crie 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
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 os PVCs para as 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 do Filestore subjacente 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 é 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:
$ kubectl get pv -o jsonpath='{range .items[*]}{"pv="}{.metadata.name}{",pvc="}{.spec.claimRef.name}{",volumeHandle="}{.spec.csi.volumeHandle}{"\n"}{end}'
Você verá algo como 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
onde:
- YOUR_PROJECT_ID é o nome do projeto que está sendo usado. Por exemplo,
my-project
.
Observe que dois volumes permanentes no cluster sã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, arquivos e objetos.
- Opções de armazenamento para cargas de trabalho de HPC no Google Cloud.