Atividade 06 - Storage

Configurando StorageClass com NFS no Kubernetes

Instalar o nfs-subdir-external-provisioner, configurar um StorageClass e criar um PVC usando armazenamento NFS.

Pré-requisitos

Cluster Kubernetes com acesso ao servidor NFS 10.5.16.5

A pasta /nfs deve estar criada e com permissões de escrita no servidor NFS

Passo 1: Instalar o provisionador

helm install nfs-client nfs-subdir-external-provisioner \
  --repo https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/ \
  --set nfs.server=10.5.16.5 \
  --set nfs.path=/nfs \
  --set storageClass.name=nfs-client \
  --set storageClass.defaultClass=true \
  --namespace nfs-provisioner \
  --create-namespace

Passo 2: Verificar StorageClass criada

kubectl get storageclass

Você deve ver uma StorageClass chamada nfs-client definida como padrão.

Exercício 1: Criando um PersistentVolumeClaim utilizando o StorageClass

Objetivo: Criar manualmente um volume persistente e vinculá-lo a um Pod.

1 - Crie um PVC com o arquivo pvc.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: meu-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

2 - Aplique o arquivo:

kubectl apply -f pvc.yaml

4 - Verifique se o PVC foi vinculado ao PV:

kubectl get pv,pvc

Exercício 2: Usando um PVC em um Pod

1 - Crie um Pod com o seguinte arquivo pod-com-volume.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: pod-com-volume
spec:
  containers:
    - name: nginx
      image: nginx
      volumeMounts:
        - name: volume-dados
          mountPath: /usr/share/nginx/html
  volumes:
    - name: volume-dados
      persistentVolumeClaim:
        claimName: meu-pvc

2 - Aplique o Pod:

kubectl apply -f pod-com-volume.yaml

3 - Acesse o Pod e escreva algo no volume:

kubectl exec -it pod-com-volume -- /bin/bash
echo "Olá, Kubernetes!" > /usr/share/nginx/html/index.html
exit

4 - Delete o Pod, recrie e veja se o conteúdo permanece.

Exercício 3: Criando um PVC em um StatefulSet

1 - Crie o statefulset-com-pvc.yaml com o volumeClaimTemplate

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-statefulset
spec:
  serviceName: "my-service"
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: registry.nuvem.unicamp.br/curso-kubernetes/nginx
        volumeMounts:
        - name: my-volume
          mountPath: /data
  volumeClaimTemplates:
  - metadata:
      name: my-volume # Esse nome deve ser o mesmo nome do volumeMounts no container
    spec:
      accessModes:
        - ReadWriteOnce # Ou ReadWriteMany, ReadOnlyMany
      resources:
        requests:
          storage: 1Gi

2 - Aplique e verifique:

kubectl apply -f statefulset-com-pvc.yaml
kubectl get pvc,pv

Projeto

Adicione um volume persistente no StatefulSet do banco de dados, de modo que mantenha os dados do banco.