Experiência
Por natureza, os pods são temporários. Isso significa que o GKE destrói o estado e o valor armazenados em um pod quando é excluído, removido ou reprogramado.
Como um operador de aplicativo, talvez você queira manter cargas de trabalho com estado. Exemplos dessas cargas de trabalho incluem aplicativos que processam artigos do WordPress, apps de mensagens e aplicativos que processam operações de machine learning.
Ao usar o Filestore no GKE, é possível realizar as seguintes operações:
- Implante cargas de trabalho com estado escalonáveis.
- Ative vários pods para que eles tenham
ReadWriteManycomoaccessMode. Assim, vários pods poderão ler e gravar ao mesmo tempo no mesmo armazenamento. - Configure o GKE para ativar volumes em vários pods simultaneamente.
- Persistência de armazenamento quando os pods são removidos
- Ative os pods para compartilhar dados e escalonar facilmente.
Configurar o armazenamento de arquivos gerenciados com o Filestore usando CSI
O GKE oferece uma maneira de implantar e gerenciar automaticamente o driver CSI do Kubernetes Filestore nos clusters.
Usar o CSI do Filestore permite criar ou excluir instâncias do Filestore de forma dinâmica e usá-las nas cargas de trabalho do Kubernetes com um StorageClass ou Deployment.
É possível criar uma nova instância do Filestore criando um PVC que provisione dinamicamente uma instância do Filestore e o PV ou acesse instâncias pré-provisionadas do Filestore em cargas de trabalho do Kubernetes.
Nova instância
Crie o StorageClass
volumeBindingModeé definido comoImmediate, o que permite o provisionamento do volume imediatamente.tieré definido comostandardpara acelerar o tempo de criação da instância do Filestore. Se você precisar de mais armazenamento NFS disponível, snapshots para backup de dados, replicação de dados em várias zonas e outros recursos de nível empresarial, definatiercomoenterprise. Observação: a política de reivindicação para PV criada dinamicamente será definida comoDeletese oreclaimPolicynoStorageClassnão estiver definido.
Criar o recurso
StorageClass:kubectl create -f filestore-storageclass.yamlVerifique se a classe de armazenamento foi criada:
kubectl get scO resultado será assim:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE filestore-sc filestore.csi.storage.gke.io Delete Immediate true 94m
Instância pré-provisionada
Crie o StorageClass
Quando volumeBindingMode é definido como Immediate, ele permite que o provisionamento do volume comece imediatamente.
Criar o recurso
StorageClass:kubectl create -f preprov-storageclass.yamlVerifique se a classe de armazenamento foi criada:
kubectl get scO resultado será assim:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE filestore-sc filestore.csi.storage.gke.io Delete Immediate true 94m
Criar um volume permanente para a instância do Filestore
Verifique se a instância preexistente do Filestore está pronta:
gcloud filestore instances listA resposta será semelhante a esta, em que o valor
STATEéREADY:INSTANCE_NAME: stateful-filestore LOCATION: us-central1-a TIER: ENTERPRISE CAPACITY_GB: 1024 FILE_SHARE_NAME: statefulpath IP_ADDRESS: 10.109.38.98 STATE: READY CREATE_TIME: 2022-04-05T18:58:28Observe
INSTANCE_NAME,LOCATION,FILE_SHARE_NAMEeIP_ADDRESSda instância do Filestore.Preencha as variáveis do console da instância do Filestore:
INSTANCE_NAME=INSTANCE_NAME LOCATION=LOCATION FILE_SHARE_NAME=FILE_SHARE_NAME IP_ADDRESS=IP_ADDRESSSubstitua as variáveis de marcador pelas variáveis do console coletadas acima no arquivo
preprov-pv.yaml:sed "s/<INSTANCE_NAME>/$INSTANCE_NAME/" preprov-pv.yaml > changed.yaml && mv changed.yaml preprov-pv.yaml sed "s/<LOCATION>/$LOCATION/" preprov-pv.yaml > changed.yaml && mv changed.yaml preprov-pv.yaml sed "s/<FILE_SHARE_NAME>/$FILE_SHARE_NAME/" preprov-pv.yaml > changed.yaml && mv changed.yaml preprov-pv.yaml sed "s/<IP_ADDRESS>/$IP_ADDRESS/" preprov-pv.yaml > changed.yaml && mv changed.yaml preprov-pv.yamlCriar o PV
kubectl apply -f preprov-pv.yamlVerifique se o
STATUSdo PV está definido comoBound:kubectl get pvO resultado será assim:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE fileserver 1Ti RWX Delete Bound default/fileserver filestore-sc 46m
Usar um PersistentVolumeClaim para acessar o volume
O manifesto pvc.yaml a seguir faz referência ao StorageClass do driver CSI do Filestore chamado filestore-sc.
Para que vários pods leiam e gravem no volume,
o accessMode está definido como ReadWriteMany.
Implante o PVC:
kubectl create -f pvc.yamlVerifique se o PVC foi criado:
kubectl get pvcO resultado será assim:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE fileserver Bound pvc-aadc7546-78dd-4f12-a909-7f02aaedf0c3 1Ti RWX filestore-sc 92mVerifique se a instância recém-criada do Filestore está pronta:
gcloud filestore instances listO resultado será assim:
INSTANCE_NAME: pvc-5bc55493-9e58-4ca5-8cd2-0739e0a7b68c LOCATION: northamerica-northeast2-a TIER: STANDARD CAPACITY_GB: 1024 FILE_SHARE_NAME: vol1 IP_ADDRESS: 10.29.174.90 STATE: READY CREATE_TIME: 2022-06-24T18:29:19
Criar um leitor e um pod de gravação
Nesta seção, você vai criar um pod de leitura e um pod de gravação. Neste tutorial, usamos implantações do Kubernetes para criar os pods. Uma implantação é um objeto da API Kubernetes que permite executar várias réplicas de pods distribuídos entre os nós de um cluster.
Criar o pod do leitor
O pod do leitor vai ler o arquivo que está sendo gravado pelos pods de gravação. Os pods do leitor verão qual hora e qual réplica de pod de gravação escreveu no arquivo.
O pod do leitor vai ler o caminho /usr/share/nginx/html, que é compartilhado entre todos os pods.
Implante o pod do leitor:
kubectl apply -f reader-fs.yamlConsulte a lista de pods para verificar se as réplicas do leitor estão em execução:
kubectl get podsO resultado será assim:
NAME READY STATUS RESTARTS AGE reader-66b8fff8fd-jb9p4 1/1 Running 0 3m30s
Crie o pod do gravador
O pod de gravador grava periodicamente em um arquivo compartilhado que outros pods de gravador e de leitor podem acessar. O pod de gravador grava a presença gravando o nome do host no arquivo compartilhado.
A imagem usada para o pod do gravador é uma imagem personalizada do Alpine Linux, usada para utilitários e aplicativos de produção. Ela inclui um script indexInfo.html que receberá os metadados do gravador mais recente e manterá a contagem de todos os gravadores exclusivos e o total de gravações.
Neste tutorial, o pod de gravação grava a cada 30 segundos no caminho /html/index.html. Modifique o valor do número sleep
para ter uma frequência de gravação diferente.
Implante o pod de gravador:
kubectl apply -f writer-fs.yamlConsulte a lista de pods para verificar se eles estão em execução:
kubectl get podsO resultado será assim:
NAME READY STATUS RESTARTS AGE reader-66b8fff8fd-jb9p4 1/1 Running 0 3m30s writer-855565fbc6-8gh2k 1/1 Running 0 2m31s writer-855565fbc6-lls4r 1/1 Running 0 2m31s
Expor e acessar a carga de trabalho do leitor em um balanceador de carga de serviço
Para expor uma carga de trabalho fora do cluster, crie um serviço do tipo
LoadBalancer. Esse tipo de serviço cria um balanceador de carga externo com um endereço IP acessível pela Internet.
Crie um serviço do tipo
LoadBalancerchamadoreader-lb:kubectl create -f loadbalancer.yamlObserve a implantação para ver que o GKE atribui um
EXTERNAL-IPao serviçoreader-lb:kubectl get svc --watchQuando
Serviceestiver pronto, a colunaEXTERNAL-IPexibirá o endereço IP público do balanceador de carga:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.8.128.1 <none> 443/TCP 2d21h reader-lb LoadBalancer 10.8.131.79 34.71.232.122 80:32672/TCP 2d20hPressione Ctrl+C para encerrar o processo de observação.
Use um navegador da Web para navegar até o
EXTERNAL-IPatribuído ao balanceador de carga. A página é atualizada a cada 30 segundos. Quanto mais pods de gravadores e menor a frequência, mais entradas serão exibidas.
Para ver mais detalhes sobre o serviço de balanceador de carga, consulte loadbalancer.yaml.
Escalone o gravador
Como o PV accessMode foi definido como ReadWriteMany, o GKE pode escalonar o número de pods para que mais pods de gravação possam gravar nesse volume compartilhado (ou mais leitores podem ler para lê-los).
Aumente os recursos do
writerpara cinco réplicas:kubectl scale deployment writer --replicas=5O resultado será assim:
deployment.extensions/writer scaledVerifique o número de réplicas em execução:
kubectl get podsO resultado será assim:
NAME READY STATUS RESTARTS AGE reader-66b8fff8fd-jb9p4 1/1 Running 0 11m writer-855565fbc6-8dfkj 1/1 Running 0 4m writer-855565fbc6-8gh2k 1/1 Running 0 10m writer-855565fbc6-gv5rs 1/1 Running 0 4m writer-855565fbc6-lls4r 1/1 Running 0 10m writer-855565fbc6-tqwxc 1/1 Running 0 4mUse um navegador da Web para navegar novamente para o
EXTERNAL-IPatribuído ao balanceador de carga.
Neste ponto, você configurou e escalonou seu cluster para aceitar cinco pods de gravador com estado. Onde vários pods de gravação estão gravando no mesmo arquivo simultaneamente. Os pods do leitor também podem ser escalonados facilmente.
Opcional: acessar dados do pod de gravador
Nesta seção, demonstramos como usar uma interface de linha de comando para acessar um pod de leitor ou de gravador. É possível ver o componente compartilhado em que o autor está escrevendo e o leitor está lendo.
Consiga o nome do pod do gravador:
kubectl get podsO resultado será assim:
NAME READY STATUS RESTARTS AGE writer-5465d65b46-7hxv4 1/1 Running 0 20dAnote o nome do host de um pod de gravação (exemplo:
writer-5465d65b46-7hxv4).Execute o seguinte comando para acessar o pod de gravador:
kubectl exec -it WRITER_HOSTNAME -- /bin/shVeja o componente compartilhado no arquivo
indexData.html:cd /html cat indexData.htmlLimpe o arquivo
indexData.html:echo '' > indexData.htmlAtualize o navegador da Web que hospeda o endereço do
EXTERNAL-IPpara ver a alteração.Saia do ambiente:
exit