Contexto
Por natureza, os pods são efémeros. Isto significa que o GKE destrói o estado e o valor armazenados num pod quando este é eliminado, removido ou reagendado.
Como operador de aplicações, pode querer manter cargas de trabalho com estado. Alguns exemplos destas cargas de trabalho incluem aplicações que processam artigos do WordPress, apps de mensagens e apps que processam operações de aprendizagem automática.
Ao usar o Filestore no GKE, pode realizar as seguintes operações:
- Implemente cargas de trabalho com estado que sejam escaláveis.
- Permitir que vários pods tenham o
ReadWriteManycomo o respetivoaccessMode, para que vários pods possam ler e escrever em simultâneo no mesmo armazenamento. - Configure o GKE para montar volumes em vários pods em simultâneo.
- Persistir o armazenamento quando os pods são removidos.
- Permitir que os pods partilhem dados e sejam facilmente dimensionados.
Configure o armazenamento de ficheiros gerido com o Filestore através da CSI
O GKE oferece uma forma de implementar e gerir automaticamente o controlador CSI do Kubernetes Filestore nos seus clusters.
A utilização do CSI do Filestore permite-lhe criar ou eliminar dinamicamente instâncias do Filestore e usá-las em cargas de trabalho do Kubernetes com um StorageClass ou um Deployment.
Pode criar uma nova instância do Filestore criando um PVC que aprovisiona dinamicamente uma instância do Filestore e o PV, ou aceder a instâncias do Filestore pré-aprovisionadas em cargas de trabalho do Kubernetes.
Nova instância
Crie a classe de armazenamento
- O valor de
volumeBindingModeestá definido comoImmediate, o que permite que o aprovisionamento do volume comece imediatamente. tierestá definido comostandardpara um tempo de criação de instância do Filestore mais rápido. Se precisar de um armazenamento NFS disponível mais elevado, instantâneos para cópia de segurança de dados, replicação de dados em várias zonas e outras funcionalidades ao nível empresarial, definatiercomoenterprise. Nota: a política de recuperação para PVs criadas dinamicamente é predefinida comoDeletese oreclaimPolicynoStorageClassnão estiver definido.
Crie o recurso
StorageClass:kubectl create -f filestore-storageclass.yamlVerifique se a classe de armazenamento foi criada:
kubectl get scO resultado é semelhante ao seguinte:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE filestore-sc filestore.csi.storage.gke.io Delete Immediate true 94m
Instância pré-aprovisionada
Crie a classe de armazenamento
Quando volumeBindingMode está definido como Immediate, permite que o aprovisionamento do volume comece imediatamente.
Crie o recurso
StorageClass:kubectl create -f preprov-storageclass.yamlVerifique se a classe de armazenamento foi criada:
kubectl get scO resultado é semelhante ao seguinte:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE filestore-sc filestore.csi.storage.gke.io Delete Immediate true 94m
Crie um volume persistente para a instância do Filestore
Verifique se a instância do Filestore pré-existente está pronta:
gcloud filestore instances listA saída é semelhante à seguinte, 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:28Tome nota do
INSTANCE_NAME,LOCATION,FILE_SHARE_NAMEeIP_ADDRESSda instância do Filestore.Preencha as variáveis da consola da instância do Filestore:
INSTANCE_NAME=INSTANCE_NAME LOCATION=LOCATION FILE_SHARE_NAME=FILE_SHARE_NAME IP_ADDRESS=IP_ADDRESSSubstitua as variáveis dos marcadores de posição pelas variáveis da consola obtidas acima no ficheiro
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.yamlCrie a PV
kubectl apply -f preprov-pv.yamlVerifique se o
STATUSdo PV está definido comoBound:kubectl get pvO resultado é semelhante ao seguinte:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE fileserver 1Ti RWX Delete Bound default/fileserver filestore-sc 46m
Use um PersistentVolumeClaim para aceder ao volume
O manifesto pvc.yaml seguinte faz referência ao StorageClass do controlador CSI do Filestore denominado filestore-sc.
Para que vários Pods leiam e escrevam no volume, o accessMode está definido como ReadWriteMany.
Implemente o PVC:
kubectl create -f pvc.yamlVerifique se o PVC foi criado:
kubectl get pvcO resultado é semelhante ao seguinte:
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 do Filestore recém-criada está pronta:
gcloud filestore instances listO resultado é semelhante ao seguinte:
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
Crie um Pod de leitor e um Pod de escritor
Nesta secção, cria um Pod de leitura e um Pod de escrita. Este tutorial usa implementações do Kubernetes para criar os pods. Uma implementação é um objeto da API Kubernetes que lhe permite executar várias réplicas de pods distribuídas entre os nós num cluster.
Crie o pod leitor
O leitor Pod lê o ficheiro que está a ser escrito pelos escritores Pods. Os pods de leitura veem a hora e a réplica do pod de gravação que escreveu no ficheiro.
O agrupamento de leitores vai ler a partir do caminho /usr/share/nginx/html, que é partilhado entre todos os agrupamentos.
Implemente o pod de leitor:
kubectl apply -f reader-fs.yamlVerifique se as réplicas de leitura estão em execução consultando a lista de pods:
kubectl get podsO resultado é semelhante ao seguinte:
NAME READY STATUS RESTARTS AGE reader-66b8fff8fd-jb9p4 1/1 Running 0 3m30s
Crie o grupo de escritores
O pod de gravação escreve periodicamente num ficheiro partilhado ao qual outros pods de gravação e leitura podem aceder. O Pod de gravação regista a sua presença escrevendo o nome do anfitrião no ficheiro partilhado.
A imagem usada para o pod do escritor é uma imagem personalizada do Alpine Linux, que é usada para utilitários e aplicações de produção. Inclui um script indexInfo.html que obtém os metadados do autor mais recente e mantém a contagem de todos os autores únicos e o total de escritas.
Para este tutorial, o pod de gravação escreve 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.
Implemente o pod do escritor:
kubectl apply -f writer-fs.yamlVerifique se os pods de gravação estão em execução consultando a lista de pods:
kubectl get podsO resultado é semelhante ao seguinte:
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
Exponha e aceda à carga de trabalho do leitor a um balanceador de carga de serviço
Para expor uma carga de trabalho fora do cluster, crie um serviço do tipo
LoadBalancer. Este tipo de serviço cria um balanceador de carga externo com um endereço IP acessível através da Internet.
Crie um serviço do tipo
LoadBalancercom o nomereader-lb:kubectl create -f loadbalancer.yamlMonitorize a implementação para ver se o GKE atribui um
EXTERNAL-IPao serviçoreader-lb:kubectl get svc --watchQuando o
Serviceestiver pronto, a colunaEXTERNAL-IPapresenta 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 2d20hPrima Ctrl+C para terminar o processo de visualização.
Use um navegador de Internet para navegar para o
EXTERNAL-IPatribuído ao equilibrador de carga. A página é atualizada a cada 30 segundos. Quanto mais escritores de podcasts e mais curta for a frequência, mais entradas são apresentadas.
Para ver mais detalhes sobre o serviço de balanceamento de carga, consulte loadbalancer.yaml.
Aumente a escala do compositor
Uma vez que o PV accessMode foi definido como ReadWriteMany, o GKE pode aumentar o número de pods para que mais pods de gravação possam escrever neste volume partilhado (ou mais leitores possam lê-los).
Aumente a escala do
writerpara cinco réplicas:kubectl scale deployment writer --replicas=5O resultado é semelhante ao seguinte:
deployment.extensions/writer scaledValide o número de réplicas em execução:
kubectl get podsO resultado é semelhante ao seguinte:
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 de Internet para navegar novamente para o
EXTERNAL-IPatribuído ao equilibrador de carga.
Neste ponto, configurou e dimensionou o cluster para suportar cinco pods de gravação com estado. Quando vários pods de gravação estão a escrever no mesmo ficheiro em simultâneo. Os leitores Pods também podem ser facilmente expandidos.
Opcional: aceda aos dados do pod de gravação
Esta secção demonstra como usar uma interface de linha de comandos para aceder a um pod de leitura ou escrita. Pode ver o componente partilhado no qual o escritor está a escrever e o leitor está a ler.
Obtenha o nome do agrupamento do escritor:
kubectl get podsO resultado é semelhante ao seguinte:
NAME READY STATUS RESTARTS AGE writer-5465d65b46-7hxv4 1/1 Running 0 20dTome nota do nome de anfitrião de um pod de gravação (exemplo:
writer-5465d65b46-7hxv4).Execute o seguinte comando para aceder ao pod de gravação:
kubectl exec -it WRITER_HOSTNAME -- /bin/shVeja o componente partilhado no ficheiro
indexData.html:cd /html cat indexData.htmlLimpe o ficheiro
indexData.html:echo '' > indexData.htmlAtualize o navegador de Internet que aloja o endereço
EXTERNAL-IPpara ver a alteração.Saia do ambiente:
exit