K8s em Exemplos: Reivindicações de Volume Persistente

PersistentVolumeClaims (PVCs) solicitam storage do cluster. Pods usam PVCs para acessar PVs sem conhecer detalhes de storage. O control plane vincula PVCs a PVs adequados baseado em tamanho, access mode e storage class.

pvc.yaml

PVC especifica requisitos de storage. accessModes define como o volume pode ser montado. storageClassName seleciona o tier de storage. O control plane encontra um PV correspondente.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: app-data
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: standard
pvc-binding.yaml

Binding de PVC corresponde PVCs a PVs. O control plane encontra um PV com: capacidade suficiente (PVC solicita 5Gi, pode vincular a PV de 10Gi), access modes correspondentes, storageClassName correspondente. Uma vez vinculado, o relacionamento é exclusivo.

spec:
  resources:
    requests:
      storage: 5Gi
  storageClassName: standard
pod-pvc.yaml

Use PVCs em Pods via volume mounts. Múltiplos Pods podem referenciar o mesmo PVC se access mode permitir (RWX). O PVC deve existir antes do Pod iniciar, ou Pod fica Pending.

apiVersion: v1
kind: Pod
metadata:
  name: app
spec:
  containers:
    - name: app
      image: my-app:v1
      volumeMounts:
        - name: data
          mountPath: /var/lib/data
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: app-data
pvc-dynamic.yaml

Provisionamento dinâmico cria PVs automaticamente quando PVC é criado. Control plane vê PVC com storageClassName, chama provisioner, cria volume cloud (ex: AWS EBS), cria PV, vincula PVC ao novo PV. Sem necessidade de pré-criar PVs.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dynamic-data
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
  storageClassName: gp3
pvc-expansion.yaml

Expansão de volume permite crescer PVCs. StorageClass deve ter allowVolumeExpansion: true. Edite o PVC para solicitar mais storage. Alguns tipos de storage requerem restart do Pod. Encolhimento não é suportado.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: expandable
provisioner: ebs.csi.aws.com
allowVolumeExpansion: true
pvc-selector.yaml

Selector vincula PVCs a PVs específicos usando labels. Primeiro: PV com labels. Segundo: PVC com selector correspondendo a essas labels. Útil quando você precisa de um PV particular (dados pré-provisionados, tier de performance específico). Bypassa correspondência normal baseada em capacidade.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: fast-ssd
  labels:
    type: ssd
    environment: prod
spec:
  capacity:
    storage: 100Gi
  accessModes: [ReadWriteOnce]
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: prod-data
spec:
  selector:
    matchLabels:
      type: ssd
      environment: prod
  accessModes: [ReadWriteOnce]
  resources:
    requests:
      storage: 50Gi
pvc-clone.yaml

Data sources clonam PVCs existentes ou restauram de snapshots. Primeiro exemplo: clone de PVC existente. Segundo exemplo: restaurar de VolumeSnapshot. Ambos requerem suporte do driver CSI.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cloned-data
spec:
  accessModes: [ReadWriteOnce]
  resources:
    requests:
      storage: 10Gi
  dataSource:
    kind: PersistentVolumeClaim
    name: original-data
---
spec:
  dataSource:
    kind: VolumeSnapshot
    name: data-snapshot
    apiGroup: snapshot.storage.k8s.io
terminal

Debug problemas de PVC verificando status, eventos e storage class. PVCs Pending geralmente significam: nenhum PV correspondente, access mode errado, storage class não existe, ou provisioner falhou.

$ kubectl get pvc
NAME       STATUS   VOLUME    CAPACITY   ACCESS MODES   AGE
app-data   Bound    pv-data   10Gi       RWO            5m
db-data    Pending  <none>    <none>     RWO            2m

$ kubectl describe pvc db-data
Events:
  Type     Reason              Message
  Warning  ProvisioningFailed  waiting for first consumer

$ kubectl patch pvc app-data \
    -p '{"spec":{"resources":{"requests":{"storage":"50Gi"}}}}'
persistentvolumeclaim/app-data patched

$ kubectl describe pvc app-data | grep -A5 Conditions
Conditions:
  Type: FileSystemResizePending
  Status: True
  Message: Waiting for user to restart pod

$ kubectl get storageclass
NAME                 PROVISIONER          DEFAULT
standard             ebs.csi.aws.com      Yes
fast-ssd             ebs.csi.aws.com

Índice | GitHub | Use as setas do teclado para navegar |