Kubernetes – Provisionamento de Volumes Persistentes – NFS CSI driver
Nos últimos anos, o Kubernetes solidificou a sua posição como a plataforma líder para a orquestração de contentores, tornando mais simples a implementação e administração de aplicações em ambientes de contentores. Quando se trata de armazenamento em ambientes Kubernetes, o Driver CSI (Container Storage Interface) NFS assume um papel fundamental. Este artigo concentra-se em guiar o leitor na instalação e utilização eficaz do Driver CSI NFS, permitindo-lhe tirar o máximo partido desta poderosa integração e simplificar a administração de armazenamento para as suas cargas de trabalho em contentores.
À medida que nos aprofundamos na implementação prática, iremos desvendar passo a passo como configurar e utilizar o Driver CSI NFS no seu cluster Kubernetes. Pretendemos simplificar o processo, para que possa concentrar-se no que realmente importa: executar as suas aplicações em contentores de forma eficiente.
Requisitos
Aqueles que estão a seguir os artigos sobre como montar um cluster Kubernetes já têm naturalmente esses requisitos cumpridos. No entanto, para os leitores que acedem diretamente a este artigo, é fundamental garantir que estes critérios estejam satisfeitos.
- Cluster Kubernetes Funcional: Antes de instalar e utilizar o driver CSI NFS, é necessário ter um cluster Kubernetes totalmente funcional em execução. Isso inclui um plano de controlo (geralmente um ou mais nós mestres) e nós de trabalho onde os contentores serão executados.
- Acesso ao Cluster: Deve ter acesso ao cluster Kubernetes, geralmente através de uma configuração kubeconfig que permite autenticar-se e interagir com o cluster.
- Servidor NFS: Deve ter um servidor NFS funcional configurado e acessível a partir dos nós de trabalho do seu cluster Kubernetes. Isso inclui a configuração correta de partilhas NFS, permissões de acesso e a capacidade de montar os volumes NFS nos nós de trabalho.
- Permissões e Acesso: Certifique-se de que as permissões e credenciais adequadas estão configuradas para permitir que o Kubernetes aceda ao servidor NFS.
- Espaço Livre no Servidor NFS: Verifique se o servidor NFS tem espaço livre suficiente para acomodar os volumes que pretende criar no cluster Kubernetes.
- Conectividade de Rede: Garanta que existe conectividade de rede adequada entre os nós de trabalho do cluster Kubernetes e o servidor NFS. Isso inclui a configuração de regras de firewall, roteamento e DNS, se necessário.
Certifique-se de que todos esses requisitos estão cumpridos antes de iniciar a instalação e configuração do driver CSI NFS no seu cluster Kubernetes. Isso garantirá uma integração suave e eficaz do armazenamento NFS com o Kubernetes.
Instalação do Driver CSI NFS
Para instalar o driver CSI NFS, siga as seguintes etapas na máquina Kube-master, que faz parte do control plane do seu cluster.
Execute o seguinte comando para baixar e executar o script de instalação do driver CSI NFS. Certifique-se de ter as permissões adequadas para a execução:
curl -skSL https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/v4.4.0/deploy/install-driver.sh | bash -s v4.4.0 --
Este comando baixa e executa o script de instalação do driver CSI NFS na versão 4.4.0 diretamente do GitHub.
Aqui está um exemplo da saída que você pode esperar após a execução do script de instalação:
Installing NFS CSI driver, version: v4.4.0 ...
serviceaccount/csi-nfs-controller-sa created
serviceaccount/csi-nfs-node-sa created
clusterrole.rbac.authorization.k8s.io/nfs-external-provisioner-role created
clusterrolebinding.rbac.authorization.k8s.io/nfs-csi-provisioner-binding created
csidriver.storage.k8s.io/nfs.csi.k8s.io created
deployment.apps/csi-nfs-controller created
daemonset.apps/csi-nfs-node created
NFS CSI driver installed successfully.
Após a conclusão da instalação, verifique se o driver foi instalado com sucesso executando os seguintes comandos:
kubectl -n kube-system get pod -o wide -l app=csi-nfs-controller
kubectl -n kube-system get pod -o wide -l app=csi-nfs-node
Esses comandos exibirão uma lista de pods com informações relacionadas ao driver CSI NFS, incluindo o estado “Running”. Aguarde até que todos os pods apresentem o estado “Running” antes de prosseguir.
Aqui está uma amostra de saída para a verificação bem-sucedida:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
csi-nfs-controller-847cc594cf-9t6nc 4/4 Running 0 23m 192.168.16.178 kube-master <none> <none>
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
csi-nfs-node-72wsc 3/3 Running 0 23m 192.168.16.178 kube-master <none> <none>
csi-nfs-node-79zzb 3/3 Running 0 23m 192.168.16.207 kube-node1 <none> <none>
csi-nfs-node-q2n9g 3/3 Running 0 23m 192.168.16.203 kube-node2 <none> <none>
O provisionamento dos containers pode levar algum tempo, podendo chegar a até 30 minutos, dependendo dos recursos disponíveis.
Após confirmar que todos os pods estão em estado “Running”, o driver CSI NFS estará instalado e configurado no seu cluster Kubernetes, pronto para ser utilizado.
Criação de uma Classe de Armazenamento
Antes de alocar armazenamento para nossas aplicações, é necessário criar pelo menos uma classe de armazenamento. Essa classe será usada pelo driver CSI NFS para atender aos pedidos de volumes das nossas aplicações.
Para usar a pasta compartilhada “/mnt/k8s” no nosso sistema de armazenamento NFS, vamos configurar a classe de armazenamento, informando ao driver CSI NFS o nosso servidor de armazenamento, que possui o nome de host “kube-storage,” e a pasta compartilhada que desejamos usar para esta classe.
O comando a seguir, juntamente com o manifesto, configura a classe de armazenamento:
kubectl create -f - <<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-csi
provisioner: nfs.csi.k8s.io
parameters:
server: kube-storage
share: /mnt/k8s
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
- nfsvers=4.1
EOF
A execução deste comando deverá retornar o seguinte resultado:
storageclass.storage.k8s.io/nfs-csi created
Neste momento, a nossa classe de armazenamento está configurada e pronta para ser usada com os nossos volumes.
É importante ter em conta na criação de classes a escolha de um nome muito bem definido para não provocar confusão no futuro.
A propriedade “reclaimPolicy” da classe deve ser pensada, com ela definimos o que acontece aos dados dos volumes desta classe de armazenamento quando removemos um determinado volume do nosso cluster.
Podemos usar “Delete” o valor por defeito, onde define que quando removemos uma volume o conteúdo do volume é destruído bem como o diretório destinado ao volume ou usar “Retain” definindo que devemos manter o conteúdo deste volume intacto.
Para listarmos as classes de armazenamento disponíveis, corremos o seguinte comando:
kubectl get StorageClass
Este comando deverá retornar algo identifico, vai depender das classes de armazenamento disponíveis:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-csi nfs.csi.k8s.io Delete Immediate false 4s
Criação de um Pedido de Volume Persistente (Persistent Volume Claim – PVC)
O Driver CSI NFS oferece a flexibilidade de provisionamento dinâmico e estático de volumes. O provisionamento dinâmico é geralmente preferido, pois liberta os administradores da tarefa de criar e provisionar manualmente volumes para aplicações futuras. No entanto, pode haver cenários em que o provisionamento estático seja necessário, e o driver CSI NFS suporta ambos os modos.
Para solicitar e configurar um volume persistente dinâmico, que é o modo que abordaremos neste artigo, execute o seguinte comando com o manifesto incorporado:
kubectl create -f - <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs-dynamic
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: nfs-csi
EOF
Este comando fez um pedido ao driver CSI NFS para criar um volume dinâmico com o nome “pvc-nfs-dynamic”. Os nomes são importantes, quando trabalhamos com vários volumes. Definir um bom nome que não provoque duvida quando necessitamos de ter ações sobre um determinado volume é sempre boa ideia. Isto permite nos ter uma maior segurança quando necessitamos eliminar um determinado volume.
A execução deste comando deverá retornar a seguinte mensagem:
persistentvolumeclaim/pvc-nfs-dynamic created
Neste momento, estamos prontos para utilizar este volume nas nossas aplicações. O volume será provisionado automaticamente conforme necessário.
Para podermos listar os volumes existentes no nosso cluster corremos o seguinte comando:
kubectl get pvc
Este comando deverá dependendo dos volumes existentes, retornar algo idêntico ao seguinte:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-nfs-dynamic Bound pvc-b004b775-3d64-430f-87db-e9165e75f2a9 10Gi RWX nfs-csi 33s
Visto que os dados guardados em volumes persistentes, normalmente são dados que queremos guardar para o futuro e não só quando uma determinada aplicação corre, devemos ter cuidado a remover os volumes persistentes.
Para remover o volume que acabamos de criar, pois era apenas de teste, corremos o seguinte comando:
kubectl delete pvc pvc-nfs-dynamic
Este comando deverá retornar o seguinte:
persistentvolumeclaim "pvc-nfs-dynamic" deleted
Ao removermos o volume, neste caso removemos também o diretório “pvc-b004b775-3d64-430f-87db-e9165e75f2a9” destinado para o volume. Isto acontece devido à classe de armazenamento que criamos ter “reclaimPolicy: Delete” como parâmetro.
Implantação de uma Aplicação de Teste com Uso de Volume
Para testar o funcionamento adequado dos volumes, realizaremos a implantação de uma aplicação de teste que fará uso desse volume. Isso nos permitirá verificar se o volume está sendo criado, provisionado e montado corretamente na aplicação.
Vamos utilizar a aplicação de teste fornecida pelo próprio driver CSI NFS. Para isso, execute o seguinte comando com o manifesto incorporado:
kubectl create -f - <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-deployment-nfs
spec:
accessModes:
- ReadWriteMany # In this example, multiple Pods consume the same PVC.
resources:
requests:
storage: 10Gi
storageClassName: nfs-csi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nfs
spec:
replicas: 1
selector:
matchLabels:
name: deployment-nfs
template:
metadata:
name: deployment-nfs
labels:
name: deployment-nfs
spec:
nodeSelector:
"kubernetes.io/os": linux
containers:
- name: deployment-nfs
image: mcr.microsoft.com/oss/nginx/nginx:1.19.5
command:
- "/bin/bash"
- "-c"
- set -euo pipefail; while true; do echo $(hostname) $(date) >> /mnt/nfs/outfile; sleep 1; done
volumeMounts:
- name: nfs
mountPath: "/mnt/nfs"
volumes:
- name: nfs
persistentVolumeClaim:
claimName: pvc-deployment-nfs
EOF
A execução deste comando deverá retornar a seguinte mensagem:
persistentvolumeclaim/pvc-deployment-nfs created
deployment.apps/deployment-nfs create
Agora, concluímos a implantação da aplicação e a solicitação do volume persistente. Vamos verificar se o ficheiro “outfile” foi criado em nosso armazenamento e se está sendo atualizado pela aplicação de teste.
Para confirmar a criação do ficheiro e a atualização contínua pelo aplicação de teste, execute o seguinte comando na máquina “kube-storage”:
find /mnt/k8s -name "outfile" | xargs ls -lah
Esse comando deverá retornar um resultado semelhante ao seguinte:
-rw-r--r-- 1 nobody nogroup 153K set 21 23:08 /mnt/k8s/pvc-62242ca9-0200-4b3f-a586-71258bd59e69/outfile
Esse resultado confirma que o ficheiro foi criado e que está recebendo atualizações contínuas da aplicação de teste, uma vez por segundo.
Agora, para evitar que o ficheiro continue a ser atualizado continuamente, pode remover a aplicação de teste com o seguinte comando:
kubectl delete deployment deployment-nfs
Neste caso devemos remover também o volume de teste, pois sabemos que não necessitamos dele:
kubectl delete pvc pvc-deployment-nfs
Com isso, o ambiente foi configurado, testado e confirmado. Agora está pronto para criar volumes para aplicações com finalidades mais específicas e funcionais, usando uma nomenclatura apropriada para evitar confusão futura.
Conclusão
Nos últimos anos, o Kubernetes estabeleceu-se firmemente como a principal plataforma para orquestração de contentores, simplificando a implementação e administração de aplicações em ambientes de contentores. No mundo do armazenamento em ambientes Kubernetes, o Driver CSI (Container Storage Interface) NFS desempenha um papel fundamental, permitindo uma administração de armazenamento eficiente para as suas cargas de trabalho em contentores.
Este artigo concentrou-se em orientar o leitor na instalação e utilização eficaz do Driver CSI NFS, simplificando o processo para que possa concentrar-se no que realmente importa: executar as suas aplicações em contentores de forma eficiente.
Antes de prosseguir com a instalação do Driver CSI NFS, certificou-se de que o seu cluster Kubernetes estava operacional e que tinha acesso a ele. Também garantiu que um servidor NFS funcional estava configurado e acessível a partir dos nós do seu cluster Kubernetes.
Durante a instalação, baixou e executou o script de instalação do Driver CSI NFS diretamente do GitHub, configurando-o com êxito. Verificou a instalação com comandos que listaram os pods relacionados ao driver CSI NFS, observando o estado “Running”.
Em seguida, criou uma classe de armazenamento que permitiu a alocação de armazenamento para as suas aplicações. A configuração desta classe envolveu a definição do servidor de armazenamento NFS e da pasta compartilhada desejada.
Posteriormente, criou um Pedido de Volume Persistente (PVC) para solicitar um volume NFS. Isso permitiu o provisionamento dinâmico do volume conforme necessário para as suas aplicações.
Para testar a integração do armazenamento, implantou uma aplicação de teste que utilizava esse volume. Verificou o funcionamento adequado, confirmou a criação do ficheiro de saída e a atualização contínua pela aplicação.
Finalmente, para evitar atualizações contínuas, removeu a aplicação de teste, deixando o ambiente pronto para criar volumes para aplicações específicas e funcionais.
Ao seguir este guia passo a passo, está agora preparado para utilizar o Driver CSI NFS de forma eficaz no seu cluster Kubernetes, simplificando a administração de armazenamento para as suas cargas de trabalho em contentores. O armazenamento é essencial para as suas aplicações, e o Driver CSI NFS torna esse processo mais conveniente e eficiente.