CKA · Módulo 8CKA · Module 8CKA · Modulo 8 K8s v1.34 Storage 10%

Storage: darle memoria a algo diseñado para morirse

Storage: giving memory to something designed to die

Storage: dare memoria a qualcosa progettato per morire

El filesystem de un container es descartable: se reinicia y no queda nada. Kubernetes resuelve la persistencia con una indirección — el pod pide almacenamiento (PVC), el cluster lo entrega (PV) — y con eso el dev nunca toca la infraestructura.

A container's filesystem is disposable: it restarts and nothing remains. Kubernetes solves persistence with an indirection — the pod asks for storage (PVC), the cluster delivers it (PV) — and with that the developer never touches the infrastructure.

Il filesystem di un container è usa e getta: si riavvia e non resta nulla. Kubernetes risolve la persistenza con un'indirezione — il pod chiede storage (PVC), il cluster lo consegna (PV) — e così il dev non tocca mai l'infrastruttura.

Duración60 min
Duration60 min
Durata60 min
DominioStorage
DomainStorage
DominioStorage
Peso10%
Weight10%
Peso10%
RequiereM4 (pods, StatefulSets)
RequiresM4 (pods, StatefulSets)
RichiedeM4 (pod, StatefulSet)
El dominio más chico del examen (10%) y el más mecánico: casi todo es PV + PVC + pod que la monta, y las tareas suelen consistir en escribir esos tres YAML sin equivocarse en los campos que tienen que coincidir. La trampa no está en la teoría sino en los matcheos: si el accessMode, el storageClassName o el tamaño no cuadran, la PVC queda en Pending para siempre y el pod también. Este módulo apunta a que reconozcas ese síntoma en diez segundos.
The smallest domain in the exam (10%) and the most mechanical: it is nearly all PV + PVC + a pod mounting it, and tasks usually come down to writing those three YAMLs without botching the fields that must line up. The trap is not the theory but the matching: if accessMode, storageClassName or the size do not fit, the PVC stays Pending forever and so does the pod. This module aims to have you recognise that symptom in ten seconds.
Il dominio più piccolo dell'esame (10%) e il più meccanico: è quasi tutto PV + PVC + un pod che lo monta, e i task di solito si riducono a scrivere quei tre YAML senza sbagliare i campi che devono combaciare. La trappola non è la teoria ma le corrispondenze: se accessMode, storageClassName o la dimensione non tornano, la PVC resta Pending per sempre e così il pod. Questo modulo punta a farti riconoscere quel sintomo in dieci secondi.
Modelo mental del módulo
Module mental model
Modello mentale del modulo
PVC = PEDIDO  →  PV = OFERTA  →  el pod monta la PVC
PVC = REQUEST  →  PV = SUPPLY  →  the pod mounts the PVC
PVC = RICHIESTA  →  PV = OFFERTA  →  il pod monta la PVC
El pod nunca referencia un PV: referencia una PVC, y Kubernetes se encarga de bindear esa PVC a un PV que satisfaga el pedido. Es el mismo patrón de indirección que ya viste en Services (selector → endpoints): el consumidor describe lo que necesita, el cluster resuelve con qué.
The pod never references a PV: it references a PVC, and Kubernetes takes care of binding that PVC to a PV satisfying the request. It is the same indirection pattern you saw in Services (selector → endpoints): the consumer describes what it needs, the cluster decides with what.
Il pod non referenzia mai un PV: referenzia una PVC, e Kubernetes si occupa di legare quella PVC a un PV che soddisfi la richiesta. È lo stesso pattern di indirezione visto nei Service (selector → endpoint): il consumatore descrive cosa gli serve, il cluster decide con cosa.
8.1
Volumes
emptyDir, hostPath, ConfigMap/Secret como volumen.
emptyDir, hostPath, ConfigMap/Secret as volumes.
emptyDir, hostPath, ConfigMap/Secret come volume.
8.2
PersistentVolumes y Claims
PersistentVolumes and Claims
PersistentVolume e Claim
El binding, los campos que tienen que coincidir.
The binding, and the fields that must line up.
Il binding, e i campi che devono combaciare.
8.3
StorageClasses
Provisioning dinámico, default class, volumeBindingMode.
Dynamic provisioning, default class, volumeBindingMode.
Provisioning dinamico, default class, volumeBindingMode.
8.4
Access modes y reclaim
Access modes and reclaim
Access mode e reclaim
RWO/ROX/RWX/RWOP, Retain/Delete, expansión.
RWO/ROX/RWX/RWOP, Retain/Delete, expansion.
RWO/ROX/RWX/RWOP, Retain/Delete, espansione.
8.5
Cuando no bindea
When it does not bind
Quando non lega
El diagnóstico de PVC Pending, paso a paso.
Diagnosing a Pending PVC, step by step.
Diagnosticare una PVC Pending, passo per passo.
★
Práctica · 8 ejercicios
Practice · 8 exercises
Pratica · 8 esercizi
Del emptyDir al PV reciclado, más los dos Pending que caen siempre.
From emptyDir to a recycled PV, plus the two Pendings that always show up.
Dall'emptyDir al PV riciclato, più i due Pending che cadono sempre.
8.1
Lo básico · 10 min
The basics · 10 min
Le basi · 10 min

Volumes: el almacenamiento atado al pod

Volumes: storage tied to the pod

Volume: lo storage legato al pod

Vive y muere con el pod — pero sobrevive al container.
It lives and dies with the pod — but outlives the container.
Vive e muore col pod — ma sopravvive al container.
Práctica · Los dos que se toman
Practice · The two that get examined
Pratica · I due che cadono

emptyDir: scratch compartido

emptyDir: shared scratch space

emptyDir: scratch condiviso

apiVersion: v1
kind: Pod
metadata: {name: par}
spec:
  containers:
  - name: escritor
    image: busybox
    command: ["sh","-c","while true; do date >> /data/log; sleep 5; done"]
    volumeMounts:
    - name: compartido      # matchea volumes[].name# matches volumes[].name# corrisponde a volumes[].name
      mountPath: /data
  - name: lector
    image: busybox
    command: ["sh","-c","tail -f /in/log"]
    volumeMounts:
    - name: compartido
      mountPath: /in         # puede ser OTRA ruta# can be ANOTHER path# può essere UN ALTRO percorso
  volumes:
  - name: compartido
    emptyDir: {}

emptyDir en RAM

emptyDir in RAM

emptyDir in RAM

  volumes:
  - name: cache
    emptyDir:
      medium: Memory      # tmpfs: rápido, cuenta como memoria del pod# tmpfs: fast, counts as the pod's memory# tmpfs: veloce, conta come memoria del pod
      sizeLimit: 128Mi

hostPath: un directorio del nodo

hostPath: a directory on the node

hostPath: una directory del nodo

  volumes:
  - name: nodo
    hostPath:
      path: /var/log
      type: Directory        # DirectoryOrCreate, File, Socket...

ConfigMap y Secret también son volumes (M4)

ConfigMaps and Secrets are volumes too (M4)

Anche ConfigMap e Secret sono volume (M4)

  volumes:
  - name: cfg
    configMap: {name: app-config}
  - name: cred
    secret: {secretName: db-pass}

Verificar el montaje

Verifying the mount

Verificare il mount

k exec par -c lector -- df -h /in
k exec par -c lector -- ls -l /in
k describe pod par | grep -A5 Mounts
⚠
hostPath ata el pod a ese nodo concreto: si el scheduler lo mueve, el contenido no viaja con él. Y monta el filesystem del host dentro del container, que es un agujero de seguridad enorme. Sirve para labs, DaemonSets de logging y agentes de nodo — nunca para datos de una app.
hostPath ties the pod to that specific node: if the scheduler moves it, the content does not travel with it. And it mounts the host filesystem inside the container, which is a huge security hole. It is for labs, logging DaemonSets and node agents — never for an app's data.
hostPath lega il pod a quel nodo specifico: se lo scheduler lo sposta, il contenuto non lo segue. E monta il filesystem dell'host dentro il container, che è un enorme buco di sicurezza. Serve per i lab, i DaemonSet di logging e gli agenti di nodo — mai per i dati di un'app.
Teoría · Ciclos de vida
Theory · Lifecycles
Teoria · Cicli di vita

Tres ciclos de vida distintos

Three different lifecycles

Tre cicli di vita diversi

AlmacenamientoSobrevive a
StorageSurvives
StorageSopravvive a
Filesystem del containernada (se pierde al reiniciar)
Container filesystemnothing (lost on restart)
Filesystem del containernulla (perso al riavvio)
emptyDirreinicio del container
emptyDira container restart
emptyDiril riavvio del container
hostPathborrado del pod (no al cambio de nodo)
hostPathpod deletion (not a node change)
hostPathla cancellazione del pod (non il cambio di nodo)
PV / PVCtodo: pod, nodo, cluster
PV / PVCeverything: pod, node, cluster
PV / PVCtutto: pod, nodo, cluster

emptyDir, con precisión

emptyDir, precisely

emptyDir, con precisione

Se crea vacío cuando el pod se asigna a un nodo y se borra cuando el pod se elimina de ese nodo. Un container que crashea y se reinicia lo vuelve a ver intacto — por eso es el mecanismo natural para compartir datos entre containers de un mismo pod, y para initContainers que preparan algo que el container principal después lee.

It is created empty when the pod is assigned to a node and is deleted when the pod is removed from that node. A container that crashes and restarts sees it intact — which is why it is the natural mechanism for sharing data between containers of one pod, and for initContainers preparing something the main container later reads.

Viene creato vuoto quando il pod è assegnato a un nodo e viene cancellato quando il pod è rimosso da quel nodo. Un container che crasha e riparte lo ritrova intatto — per questo è il meccanismo naturale per condividere dati fra container dello stesso pod, e per gli initContainer che preparano qualcosa che il container principale poi legge.

La regla del montaje

The mounting rule

La regola del mount

El nombre en volumeMounts[].name tiene que coincidir con volumes[].name. El mountPath puede ser distinto en cada container: el mismo volumen se ve en rutas diferentes. Es el error más tonto y más frecuente del tema.

The name in volumeMounts[].name must match volumes[].name. The mountPath can differ per container: the same volume shows up at different paths. It is the silliest and most frequent mistake here.

Il nome in volumeMounts[].name deve corrispondere a volumes[].name. Il mountPath può differire per container: lo stesso volume compare in percorsi diversi. È l'errore più sciocco e più frequente del tema.

Por qué el volumen se define en el pod

Why the volume is defined on the pod

Perché il volume si definisce sul pod

Porque el volumen es del pod, no del container: los containers de un pod comparten red y pueden compartir volumes. Cada uno decide en qué ruta lo monta — o si lo monta.

Because the volume belongs to the pod, not the container: containers in a pod share the network and can share volumes. Each one decides at which path it mounts it — or whether it mounts it at all.

Perché il volume è del pod, non del container: i container di un pod condividono la rete e possono condividere volumi. Ognuno decide su quale percorso montarlo — o se montarlo.

★
Si el enunciado dice "compartir datos entre containers del mismo pod" o "directorio temporal", la respuesta es emptyDir. Si dice "los datos tienen que sobrevivir al pod", es PVC. Esa sola distinción te ordena la mitad del dominio.
If the wording says "share data between containers of the same pod" or "temporary directory", the answer is emptyDir. If it says "the data must survive the pod", it is a PVC. That single distinction sorts out half the domain.
Se il testo dice "condividere dati fra container dello stesso pod" o "directory temporanea", la risposta è emptyDir. Se dice "i dati devono sopravvivere al pod", è una PVC. Quella sola distinzione mette in ordine metà del dominio.
8.2
El corazón del dominio · 20 min
The heart of the domain · 20 min
Il cuore del dominio · 20 min

PersistentVolumes & PersistentVolumeClaims

La oferta, el pedido y el binding entre los dos.
The supply, the request and the binding between them.
L'offerta, la richiesta e il binding fra le due.
Práctica · Los tres YAML
Practice · The three YAMLs
Pratica · I tre YAML

1. El PV (lo crea el admin)

1. The PV (created by the admin)

1. Il PV (lo crea l'admin)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-datos           # cluster-scoped: SIN namespace# cluster-scoped: NO namespace# cluster-scoped: SENZA namespace
spec:
  capacity:
    storage: 1Gi
  accessModes: [ReadWriteOnce]
  persistentVolumeReclaimPolicy: Retain
  storageClassName: manual
  hostPath:                 # en labs; en la nube sería un CSI# in labs; in the cloud it would be a CSI# nei lab; in cloud sarebbe un CSI
    path: /mnt/datos

2. La PVC (la crea el dev)

2. The PVC (created by the dev)

2. La PVC (la crea il dev)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-datos
  namespace: default       # la PVC SÍ tiene namespace# a PVC DOES have a namespace# una PVC HA un namespace
spec:
  accessModes: [ReadWriteOnce]   # debe caber en el PV# must fit within the PV# deve stare dentro il PV
  storageClassName: manual     # debe coincidir# must match# deve corrispondere
  resources:
    requests:
      storage: 500Mi            # <= capacity del PV# <= the PV's capacity# <= la capacity del PV

3. El pod que la monta

3. The pod that mounts it

3. Il pod che la monta

spec:
  containers:
  - name: app
    image: nginx
    volumeMounts:
    - name: datos
      mountPath: /usr/share/nginx/html
  volumes:
  - name: datos
    persistentVolumeClaim:
      claimName: pvc-datos   # el pod pide la PVC, no el PV# the pod asks for the PVC, not the PV# il pod chiede la PVC, non il PV

Verificar el binding

Verifying the binding

Verificare il binding

k get pv,pvc
# pv/pv-datos    1Gi   RWO  Retain  Bound  default/pvc-datos
# pvc/pvc-datos  Bound  pv-datos  1Gi  RWO  manual

k describe pvc pvc-datos     # eventos si NO bindea# events if it does NOT bind# eventi se NON lega

# Comprobar que persiste de verdad# Check it really persists# Verificare che persista davvero
k exec app -- sh -c 'echo hola > /usr/share/nginx/html/i.html'
k delete pod app && k apply -f pod.yaml
k exec app -- cat /usr/share/nginx/html/i.html
★
La PVC recibe la capacidad completa del PV, no la que pidió: pedís 500Mi contra un PV de 1Gi y terminás con 1Gi bindeado y el PV entero consumido. No hay subdivisión: la relación PV↔PVC es uno a uno.
The PVC receives the PV's full capacity, not what it asked for: request 500Mi against a 1Gi PV and you end up with 1Gi bound and the whole PV consumed. There is no subdivision: the PV↔PVC relationship is one to one.
La PVC riceve la capacità completa del PV, non quella richiesta: chiedi 500Mi contro un PV da 1Gi e ti ritrovi 1Gi legato e l'intero PV consumato. Non c'è suddivisione: la relazione PV↔PVC è uno a uno.
Teoría · El binding
Theory · The binding
Teoria · Il binding

Quién es quién

Who is who

Chi è chi

PVPVC
ScopeClusterNamespace
ScopeClusterNamespace
ScopeClusterNamespace
Lo creaAdmin (o la SC)El dev
Created byAdmin (or the SC)The developer
Creato daAdmin (o la SC)Il dev
ExpresaLo que hayLo que se necesita
ExpressesWhat existsWhat is needed
EsprimeCiò che c'èCiò che serve
AnálogoEl discoEl vale por un disco
AnalogyThe diskThe voucher for a disk
AnalogiaIl discoIl buono per un disco

Los cuatro criterios del match

The four matching criteria

I quattro criteri di corrispondenza

El control plane bindea una PVC a un PV si se cumplen todos:

The control plane binds a PVC to a PV if all of these hold:

Il control plane lega una PVC a un PV se valgono tutti:

  • storageClassName idéntico (incluido el caso "vacío en los dos").
  • accessModes: el PV ofrece al menos los que la PVC pide.
  • capacity ≥ requests.storage.
  • El PV está Available, y si tiene claimRef, apunta a esa PVC.
  • Identical storageClassName (including the "empty on both" case).
  • accessModes: the PV offers at least what the PVC asks for.
  • capacity ≥ requests.storage.
  • The PV is Available, and if it has a claimRef, it points at that PVC.
  • storageClassName identico (incluso il caso "vuoto in entrambi").
  • accessModes: il PV offre almeno quelli che la PVC chiede.
  • capacity ≥ requests.storage.
  • Il PV è Available, e se ha un claimRef, punta a quella PVC.

Si no hay candidato, la PVC queda Pending — y el pod que la use queda Pending también, con un evento de tipo FailedScheduling.

With no candidate, the PVC stays Pending — and any pod using it stays Pending too, with a FailedScheduling event.

Senza candidati, la PVC resta Pending — e ogni pod che la usa resta Pending, con un evento FailedScheduling.

Fases del PV

PV phases

Fasi del PV

FaseSignifica
PhaseMeans
FaseSignifica
AvailableLibre, esperando una claim
AvailableFree, waiting for a claim
AvailableLibero, in attesa di una claim
BoundAsignado a una PVC
BoundAssigned to a PVC
BoundAssegnato a una PVC
ReleasedLa PVC se borró, los datos siguen ahí
ReleasedThe PVC was deleted, the data is still there
ReleasedLa PVC è stata cancellata, i dati sono ancora lì
FailedFalló la recuperación automática
FailedAutomatic reclamation failed
FailedIl recupero automatico è fallito

Released no es Available

Released is not Available

Released non è Available

Con Retain, al borrar la PVC el PV queda Released y no se reutiliza solo: conserva el claimRef de la PVC muerta. Para reciclarlo hay que editar el PV y borrar ese claimRef, o borrarlo y recrearlo.

With Retain, deleting the PVC leaves the PV Released and it does not get reused on its own: it keeps the dead PVC's claimRef. To recycle it you edit the PV and remove that claimRef, or delete and recreate it.

Con Retain, cancellando la PVC il PV resta Released e non si riusa da solo: conserva il claimRef della PVC morta. Per riciclarlo modifichi il PV e togli quel claimRef, oppure lo cancelli e lo ricrei.

StatefulSets: volumeClaimTemplates

StatefulSets: volumeClaimTemplates

StatefulSet: volumeClaimTemplates

Un StatefulSet (M4) no usa una PVC compartida: declara un volumeClaimTemplates y el controller crea una PVC por réplica (datos-web-0, datos-web-1…). Esas PVC no se borran al borrar el StatefulSet: es a propósito, para no perder datos.

A StatefulSet (M4) does not use a shared PVC: it declares volumeClaimTemplates and the controller creates one PVC per replica (datos-web-0, datos-web-1…). Those PVCs are not deleted when you delete the StatefulSet: that is deliberate, so data is not lost.

Uno StatefulSet (M4) non usa una PVC condivisa: dichiara volumeClaimTemplates e il controller crea una PVC per replica (datos-web-0, datos-web-1…). Quelle PVC non vengono cancellate quando cancelli lo StatefulSet: è voluto, per non perdere dati.

VisorExplorerVisore · los 3 criterios del binding, uno por unothe 3 binding criteria, one by onei 3 criteri del binding, uno per uno

Los tres tienen que dar ✓ al mismo tiempo. Con que uno falle, la PVC queda Pending — y el pod que la use, también.

All three must be ✓ at once. One failure and the PVC stays Pending — and so does any pod using it.

Tutti e tre devono dare ✓ insieme. Basta che uno fallisca e la PVC resta Pending — e con lei ogni pod che la usa.

8.3
Automatizar · 15 min
Automating · 15 min
Automatizzare · 15 min

StorageClasses y provisioning dinámico

StorageClasses and dynamic provisioning

StorageClass e provisioning dinamico

Que el PV lo cree el cluster, no vos.
Let the cluster create the PV, not you.
Che il PV lo crei il cluster, non tu.
Práctica · Dinámico
Practice · Dynamic
Pratica · Dinamico

Ver qué hay

See what exists

Vedere cosa c'è

k get sc
# NAME                PROVISIONER            RECLAIM  VOLUMEBINDINGMODE
# standard (default)  rancher.io/local-path  Delete   WaitForFirstConsumer

k describe sc standard

Una StorageClass

A StorageClass

Una StorageClass

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: rapido
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/no-provisioner   # local: sin dinámico# local: no dynamic# local: niente dinamico
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer

PVC dinámica: sin PV previo

Dynamic PVC: no PV beforehand

PVC dinamica: senza PV preesistente

apiVersion: v1
kind: PersistentVolumeClaim
metadata: {name: pvc-din}
spec:
  storageClassName: rapido    # el provisioner crea el PV solo# the provisioner creates the PV itself# il provisioner crea il PV da solo
  accessModes: [ReadWriteOnce]
  resources: {requests: {storage: 2Gi}}

Los tres valores de storageClassName

The three values of storageClassName

I tre valori di storageClassName

# (a) omitido → usa la StorageClass DEFAULT si existe# (a) omitted → uses the DEFAULT StorageClass if one exists# (a) omesso → usa la StorageClass DEFAULT se esiste
spec:
  accessModes: [ReadWriteOnce]

# (b) "" (vacío) → DESACTIVA el dinámico: solo binding manual# (b) "" (empty) → DISABLES dynamic: manual binding only# (b) "" (vuoto) → DISATTIVA il dinamico: solo binding manuale
  storageClassName: ""

# (c) un nombre → esa clase, sí o sí# (c) a name → that class, no exceptions# (c) un nome → quella classe, senza eccezioni
  storageClassName: rapido

Cambiar la default

Changing the default

Cambiare la default

k patch sc standard -p \
  '{"metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
⚠
La diferencia entre omitir storageClassName y ponerlo en "" es enorme y se toma: omitido dispara la clase default (y con ella el provisioning automático); "" lo apaga y obliga a que exista un PV manual esperándola. Si un ejercicio dice "sin dynamic provisioning", va "".
The difference between omitting storageClassName and setting it to "" is enormous and it gets examined: omitted triggers the default class (and with it automatic provisioning); "" switches that off and demands a manual PV waiting for it. If an exercise says "no dynamic provisioning", it is "".
La differenza fra omettere storageClassName e metterlo a "" è enorme e cade all'esame: omesso attiva la classe default (e con essa il provisioning automatico); "" lo spegne e impone che esista un PV manuale ad attenderla. Se un esercizio dice "senza dynamic provisioning", è "".
Teoría · Estático vs dinámico
Theory · Static vs dynamic
Teoria · Statico contro dinamico

Los dos mundos

The two worlds

I due mondi

EstáticoDinámico
StaticDynamic
StaticoDinamico
Quién crea el PVEl admin, a manoEl provisioner
Who creates the PVThe admin, by handThe provisioner
Chi crea il PVL'admin, a manoIl provisioner
CuándoAntes de la PVCAl crear la PVC
WhenBefore the PVCWhen the PVC is created
QuandoPrima della PVCAlla creazione della PVC
Requiere SCNoSí
Requires an SCNoYes
Richiede una SCNoSì
Dónde se veLabs, bare-metal, CKANube, producción
Where you see itLabs, bare metal, CKACloud, production
Dove si vedeLab, bare metal, CKACloud, produzione

Qué es un provisioner

What a provisioner is

Cos'è un provisioner

El componente que habla con el sistema de almacenamiento real. Hoy son drivers CSI (Container Storage Interface): ebs.csi.aws.com, disk.csi.azure.com, rancher.io/local-path… El valor especial kubernetes.io/no-provisioner significa "esta clase existe solo para agrupar/etiquetar PVs manuales, no crea nada".

The component that talks to the real storage system. Today these are CSI drivers (Container Storage Interface): ebs.csi.aws.com, disk.csi.azure.com, rancher.io/local-path… The special value kubernetes.io/no-provisioner means "this class exists only to group/label manual PVs, it creates nothing".

Il componente che parla col sistema di storage reale. Oggi sono driver CSI (Container Storage Interface): ebs.csi.aws.com, disk.csi.azure.com, rancher.io/local-path… Il valore speciale kubernetes.io/no-provisioner significa "questa classe esiste solo per raggruppare/etichettare PV manuali, non crea nulla".

volumeBindingMode: el que sorprende

volumeBindingMode: the surprising one

volumeBindingMode: quello che sorprende

  • Immediate: el PV se crea y bindea apenas aparece la PVC, sin saber dónde correrá el pod.
  • WaitForFirstConsumer: espera a que un pod use la PVC y recién ahí aprovisiona, en la zona/nodo correctos.
  • Immediate: the PV is created and bound as soon as the PVC appears, with no idea where the pod will run.
  • WaitForFirstConsumer: it waits for a pod to use the PVC and only then provisions, in the right zone/node.
  • Immediate: il PV viene creato e legato appena compare la PVC, senza sapere dove girerà il pod.
  • WaitForFirstConsumer: aspetta che un pod usi la PVC e solo allora effettua il provisioning, nella zona/nodo giusti.

Por eso una PVC en Pending con este modo puede ser normal: mientras ningún pod la monte, no pasa nada. No pierdas cinco minutos "arreglando" algo que está esperando a propósito — el evento del describe lo dice: waiting for first consumer.

So a Pending PVC under this mode can be normal: while no pod mounts it, nothing happens. Do not lose five minutes "fixing" something that is waiting on purpose — the describe event says it: waiting for first consumer.

Perciò una PVC Pending con questa modalità può essere normale: finché nessun pod la monta, non succede nulla. Non perdere cinque minuti ad "aggiustare" qualcosa che sta aspettando di proposito — l'evento del describe lo dice: waiting for first consumer.

reclaimPolicy heredada

Inherited reclaimPolicy

reclaimPolicy ereditata

Los PV creados dinámicamente heredan el reclaimPolicy de la StorageClass, que por defecto es Delete: borrar la PVC borra el PV y el disco. En producción con datos que importan, se cambia a Retain.

Dynamically created PVs inherit the StorageClass's reclaimPolicy, which defaults to Delete: deleting the PVC deletes the PV and the disk. In production with data that matters, you switch it to Retain.

I PV creati dinamicamente ereditano il reclaimPolicy della StorageClass, che di default è Delete: cancellare la PVC cancella il PV e il disco. In produzione con dati che contano, si passa a Retain.

★
Truco de lectura rápida: en k get sc, la clase default aparece con el sufijo (default) al lado del nombre. Si no hay ninguna y una PVC omite storageClassName, esa PVC no bindea nunca.
Quick-reading trick: in k get sc, the default class shows a (default) suffix next to its name. If there is none and a PVC omits storageClassName, that PVC never binds.
Trucco di lettura rapida: in k get sc, la classe default compare col suffisso (default) accanto al nome. Se non ce n'è nessuna e una PVC omette storageClassName, quella PVC non lega mai.
8.4
Los campos · 15 min
The fields · 15 min
I campi · 15 min

Access modes, reclaim policies y expansión

Access modes, reclaim policies and expansion

Access mode, reclaim policy ed espansione

Cuatro siglas y tres políticas que hay que saber de memoria.
Four acronyms and three policies you must know by heart.
Quattro sigle e tre policy da sapere a memoria.
Práctica · Operaciones
Practice · Operations
Pratica · Operazioni

Access modes en el YAML

Access modes in the YAML

Access mode nello YAML

accessModes:
- ReadWriteOnce        # RWO  — un nodo, lectura+escritura# RWO  — one node, read+write# RWO  — un nodo, lettura+scrittura
# - ReadOnlyMany       # ROX  — muchos nodos, solo lectura# - ReadOnlyMany       # ROX  — many nodes, read only# - ReadOnlyMany       # ROX  — molti nodi, sola lettura
# - ReadWriteMany      # RWX  — muchos nodos, lectura+escritura# - ReadWriteMany      # RWX  — many nodes, read+write# - ReadWriteMany      # RWX  — molti nodi, lettura+scrittura
# - ReadWriteOncePod   # RWOP — UN SOLO POD (GA desde 1.29)# - ReadWriteOncePod   # RWOP — ONE SINGLE POD (GA since 1.29)# - ReadWriteOncePod   # RWOP — UN SOLO POD (GA dalla 1.29)

Reclaim policy

Reclaim policy

Reclaim policy

persistentVolumeReclaimPolicy: Retain      # | Delete

# Cambiarla en un PV existente# Change it on an existing PV# Cambiarla su un PV esistente
k patch pv pv-datos -p \
  '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'

Reciclar un PV en Released

Recycling a Released PV

Riciclare un PV in Released

k get pv
# pv-datos  ...  Released  default/pvc-vieja

# Sacarle el claimRef para que vuelva a Available# Strip its claimRef so it goes back to Available# Togliergli il claimRef perché torni Available
k patch pv pv-datos -p '{"spec":{"claimRef":null}}'

Expandir una PVC

Expanding a PVC

Espandere una PVC

# 1. La SC tiene que permitirlo# 1. The SC must allow it# 1. La SC deve permetterlo
k get sc rapido -o jsonpath='{.allowVolumeExpansion}'

# 2. Editar SOLO hacia arriba (achicar no se puede)# 2. Edit UPWARDS only (shrinking is impossible)# 2. Modificare SOLO verso l'alto (ridurre non si può)
k edit pvc pvc-din       # resources.requests.storage: 5Gi
k patch pvc pvc-din -p \
  '{"spec":{"resources":{"requests":{"storage":"5Gi"}}}}'

k get pvc pvc-din -w   # puede pedir reinicio del pod# may require a pod restart# può richiedere un riavvio del pod

Borrar en el orden correcto

Deleting in the right order

Cancellare nell'ordine giusto

# Pod primero, PVC después: al revés se queda colgado# Pod first, PVC second: the other way round it hangs# Prima il pod, poi la PVC: al contrario resta appeso
k delete pod app
k delete pvc pvc-datos
⚠
Si borrás una PVC que un pod todavía usa, queda en Terminating para siempre: un finalizer (kubernetes.io/pvc-protection) la retiene hasta que no haya consumidores. No es un cuelgue: borrá el pod y la PVC se va sola.
If you delete a PVC a pod is still using, it sits in Terminating forever: a finalizer (kubernetes.io/pvc-protection) holds it until there are no consumers. It is not a hang: delete the pod and the PVC goes on its own.
Se cancelli una PVC che un pod sta ancora usando, resta in Terminating per sempre: un finalizer (kubernetes.io/pvc-protection) la trattiene finché non ci sono consumatori. Non è un blocco: cancella il pod e la PVC se ne va da sola.
Teoría · Qué significa cada uno
Theory · What each one means
Teoria · Cosa significa ciascuno

Access modes: se cuentan NODOS

Access modes: NODES are counted

Access mode: si contano i NODI

ModoAbrev.Alcance
ModeShortReach
ModalitàSiglaPortata
ReadWriteOnceRWOUn nodo, R/W
ReadWriteOnceRWOOne node, R/W
ReadWriteOnceRWOUn nodo, R/W
ReadOnlyManyROXVarios nodos, solo lectura
ReadOnlyManyROXSeveral nodes, read only
ReadOnlyManyROXPiù nodi, sola lettura
ReadWriteManyRWXVarios nodos, R/W
ReadWriteManyRWXSeveral nodes, R/W
ReadWriteManyRWXPiù nodi, R/W
ReadWriteOncePodRWOPUn solo pod, R/W
ReadWriteOncePodRWOPOne single pod, R/W
ReadWriteOncePodRWOPUn solo pod, R/W

El "Once" de RWO cuenta nodos, no pods: varios pods del mismo nodo pueden montar el mismo volumen RWO. Si necesitás exclusividad real de un pod, eso es RWOP, que existe justamente porque la gente asumía mal lo de RWO.

The "Once" in RWO counts nodes, not pods: several pods on the same node can mount the same RWO volume. If you need true single-pod exclusivity, that is RWOP, which exists precisely because people kept misreading RWO.

Il "Once" di RWO conta nodi, non pod: più pod dello stesso nodo possono montare lo stesso volume RWO. Se serve vera esclusività di un pod, è RWOP, che esiste proprio perché si fraintendeva RWO.

Y no todos los backends soportan todo: un disco de bloque (EBS, local) es RWO; RWX necesita un filesystem de red (NFS, CephFS, EFS). El modo declarado no crea la capacidad: la describe.

And not every backend supports everything: a block disk (EBS, local) is RWO; RWX needs a network filesystem (NFS, CephFS, EFS). The declared mode does not create the capability: it describes it.

E non tutti i backend supportano tutto: un disco a blocchi (EBS, local) è RWO; RWX richiede un filesystem di rete (NFS, CephFS, EFS). La modalità dichiarata non crea la capacità: la descrive.

Reclaim: qué pasa al borrar la PVC

Reclaim: what happens when the PVC is deleted

Reclaim: cosa succede cancellando la PVC

PolíticaEl PV…Los datos…
PolicyThe PV…The data…
PolicyIl PV…I dati…
Retainqueda Releasedse conservan
Retainbecomes Releasedare kept
Retaindiventa Releasedsi conservano
Deletese borrase borran
Deleteis deletedare deleted
Deleteviene cancellatovengono cancellati
Recycledeprecado, no lo uses
Recycledeprecated, do not use it
Recycledeprecato, non usarlo

Default: Retain para PVs creados a mano, Delete para los dinámicos (lo que dicte la SC).

Defaults: Retain for hand-made PVs, Delete for dynamic ones (whatever the SC dictates).

Default: Retain per i PV creati a mano, Delete per quelli dinamici (secondo la SC).

Expansión

Expansion

Espansione

Solo hacia arriba, solo si la SC tiene allowVolumeExpansion: true. Algunos drivers hacen la expansión del filesystem en caliente; otros dejan la PVC en la condición FileSystemResizePending hasta que el pod se reinicie.

Upwards only, and only if the SC has allowVolumeExpansion: true. Some drivers grow the filesystem online; others leave the PVC in the FileSystemResizePending condition until the pod restarts.

Solo verso l'alto, e solo se la SC ha allowVolumeExpansion: true. Alcuni driver espandono il filesystem a caldo; altri lasciano la PVC nella condizione FileSystemResizePending finché il pod non si riavvia.

★
Los enunciados esconden el access mode en el lenguaje: "varios pods en distintos nodos escriben" → RWX. "Que ningún otro pod pueda montarlo" → RWOP. "Una base de datos con su disco" → RWO. Traducí la frase antes de escribir el YAML.
The wording hides the access mode in plain language: "several pods on different nodes write" → RWX. "So no other pod can mount it" → RWOP. "A database with its disk" → RWO. Translate the sentence before writing the YAML.
Il testo nasconde l'access mode nel linguaggio: "più pod su nodi diversi scrivono" → RWX. "Che nessun altro pod possa montarlo" → RWOP. "Un database col suo disco" → RWO. Traduci la frase prima di scrivere lo YAML.
8.5
Diagnóstico · 10 min
Diagnosis · 10 min
Diagnosi · 10 min

Cuando la PVC no bindea

When the PVC does not bind

Quando la PVC non lega

El 95% del troubleshooting de storage cabe en cinco causas.
95% of storage troubleshooting fits in five causes.
Il 95% del troubleshooting di storage sta in cinque cause.
Práctica · La secuencia
Practice · The sequence
Pratica · La sequenza

Pod Pending por storage

Pod Pending because of storage

Pod Pending per lo storage

# 1. ¿Por qué no se schedulea el pod?# 1. Why is the pod not scheduled?# 1. Perché il pod non viene schedulato?
k describe pod app | tail -20
# FailedScheduling: pod has unbound immediate PersistentVolumeClaims

# 2. El estado de la PVC# 2. The PVC's state# 2. Lo stato della PVC
k get pvc
# pvc-datos  Pending

# 3. LA respuesta suele estar acá# 3. THE answer is usually right here# 3. LA risposta di solito è qui
k describe pvc pvc-datos
# no persistent volumes available for this claim
# | waiting for first consumer    ← esto NO es un error# | waiting for first consumer    ← this is NOT an error# | waiting for first consumer    ← questo NON è un errore
# | storageclass "x" not found

# 4. Comparar oferta y pedido, campo por campo# 4. Compare supply and request, field by field# 4. Confrontare offerta e richiesta, campo per campo
k get pv -o custom-columns=\
NAME:.metadata.name,CAP:.spec.capacity.storage,\
MODES:.spec.accessModes,SC:.spec.storageClassName,ST:.status.phase

Bindea pero el pod no arranca

It binds but the pod does not start

Lega ma il pod non parte

k describe pod app | grep -A10 Events
# FailedMount / MountVolume.SetUp failed
# → la ruta del hostPath no existe en ESE nodo# → the hostPath path does not exist on THAT node# → il percorso dell'hostPath non esiste su QUEL nodo
# → el nodo no puede alcanzar el backend (NFS, CSI)# → the node cannot reach the backend (NFS, CSI)# → il nodo non raggiunge il backend (NFS, CSI)
# → permisos: revisar securityContext.fsGroup# → permissions: check securityContext.fsGroup# → permessi: controllare securityContext.fsGroup

Forzar un binding exacto (claimRef)

Forcing an exact binding (claimRef)

Forzare un binding esatto (claimRef)

# En el PV, reservarlo de antemano para una PVC concreta# On the PV, reserve it in advance for one specific PVC# Sul PV, riservarlo in anticipo per una PVC specifica
spec:
  claimRef:
    name: pvc-datos
    namespace: default
Teoría · Las cinco causas
Theory · The five causes
Teoria · Le cinque cause

Checklist de PVC Pending

Pending-PVC checklist

Checklist della PVC Pending

CausaCómo se ve
CauseHow it looks
CausaCome appare
storageClassName distintono PV available
Different storageClassNameno PV available
storageClassName diversono PV available
Pide más de lo que hayno PV available
Asks for more than existsno PV available
Chiede più di quel che c'èno PV available
accessMode no ofrecidono PV available
accessMode not offeredno PV available
accessMode non offertono PV available
La SC no existestorageclass not found
The SC does not existstorageclass not found
La SC non esistestorageclass not found
WaitForFirstConsumerwaiting for first consumer
WaitForFirstConsumerwaiting for first consumer
WaitForFirstConsumerwaiting for first consumer

Los campos son inmutables (casi todos)

The fields are immutable (nearly all)

I campi sono immutabili (quasi tutti)

Una PVC ya creada casi no se edita: no podés cambiarle la StorageClass ni los access modes. Si te equivocaste, se borra y se recrea. Lo único ampliable es el tamaño, y solo hacia arriba.

An already-created PVC is barely editable: you cannot change its StorageClass or its access modes. If you got it wrong, delete and recreate. The only thing you can grow is the size, and only upwards.

Una PVC già creata è quasi immodificabile: non puoi cambiarne la StorageClass né gli access mode. Se hai sbagliato, si cancella e si ricrea. L'unica cosa ampliabile è la dimensione, e solo verso l'alto.

El orden mental correcto

The right mental order

L'ordine mentale corretto

Siempre de arriba hacia abajo: pod → PVC → PV → backend. Los eventos de cada nivel te dicen si el problema está ahí o más abajo. Es el mismo método que vas a formalizar en el Módulo 9.

Always top-down: pod → PVC → PV → backend. Each level's events tell you whether the problem is there or further down. It is the same method you will formalise in Module 9.

Sempre dall'alto verso il basso: pod → PVC → PV → backend. Gli eventi di ogni livello ti dicono se il problema è lì o più in basso. È lo stesso metodo che formalizzerai nel Modulo 9.

★
Ante un pod Pending, mirá primero si tiene una PVC. Si la tiene, el problema es de storage el 90% de las veces — y k describe pvc te lo dice literalmente en el último evento. Es la ruta más corta a los puntos de este dominio.
Facing a Pending pod, first check whether it has a PVC. If it does, the problem is storage 90% of the time — and k describe pvc literally tells you so in the last event. It is the shortest path to this domain's points.
Davanti a un pod Pending, guarda prima se ha una PVC. Se ce l'ha, il problema è lo storage nel 90% dei casi — e k describe pvc te lo dice letteralmente nell'ultimo evento. È la via più breve ai punti di questo dominio.
★
Cierre del módulo
Module wrap-up
Chiusura del modulo

Lo que te llevás del Módulo 8

What you take from Module 8

Cosa porti via dal Modulo 8

Resumen · Comandos clave
Summary · Key commands
Riassunto · Comandi chiave
# Ver el estado del mundo# See the state of the world# Vedere lo stato del mondo
k get pv,pvc,sc
k get sc                       # cuál dice (default)# which one says (default)# quale dice (default)
k describe pvc mi-pvc           # EL comando del dominio# THE command of this domain# IL comando del dominio

# Crear (no hay imperativo: se escriben a mano)# Create (no imperative: written by hand)# Creare (nessun imperativo: si scrivono a mano)
k explain pv.spec --recursive | less
k explain pvc.spec --recursive | less

# Operaciones# Operations# Operazioni
k patch pv mi-pv -p '{"spec":{"claimRef":null}}'
k patch pvc mi-pvc -p \
  '{"spec":{"resources":{"requests":{"storage":"5Gi"}}}}'

# Verificar dentro del pod# Verify inside the pod# Verificare dentro il pod
k exec app -- df -h /ruta
k exec app -- touch /ruta/test

# Comparación rápida PV vs PVC# Quick PV vs PVC comparison# Confronto rapido PV contro PVC
k get pv -o custom-columns=NAME:.metadata.name,\
SC:.spec.storageClassName,MODES:.spec.accessModes,ST:.status.phase
Teoría · Lo esencial
Theory · The essentials
Teoria · L'essenziale

Las 6 ideas que no se negocian

The 6 non-negotiable ideas

Le 6 idee non negoziabili

  • El pod monta una PVC, nunca un PV. El PV es cluster-scoped; la PVC vive en un namespace.
  • Para bindear tienen que coincidir storageClassName, accessModes y tamaño. Uno solo que falle deja la PVC en Pending.
  • Relación uno a uno: la PVC se queda con el PV entero, pida lo que pida.
  • storageClassName omitido usa la default; "" apaga el provisioning dinámico. No son lo mismo.
  • Retain conserva los datos y deja el PV en Released (hay que limpiar el claimRef); Delete borra el disco.
  • emptyDir muere con el pod; hostPath ata al nodo; solo PV/PVC persisten de verdad.
  • The pod mounts a PVC, never a PV. The PV is cluster-scoped; the PVC lives in a namespace.
  • To bind, storageClassName, accessModes and size must line up. One failure leaves the PVC Pending.
  • One-to-one relationship: the PVC takes the whole PV, whatever it asked for.
  • An omitted storageClassName uses the default; "" switches dynamic provisioning off. They are not the same.
  • Retain keeps the data and leaves the PV Released (you must clear the claimRef); Delete destroys the disk.
  • emptyDir dies with the pod; hostPath ties you to a node; only PV/PVC truly persist.
  • Il pod monta una PVC, mai un PV. Il PV è cluster-scoped; la PVC vive in un namespace.
  • Per legare devono combaciare storageClassName, accessModes e dimensione. Basta uno che fallisca e la PVC resta Pending.
  • Relazione uno a uno: la PVC prende l'intero PV, qualunque cosa abbia chiesto.
  • storageClassName omesso usa la default; "" spegne il provisioning dinamico. Non sono la stessa cosa.
  • Retain conserva i dati e lascia il PV in Released (va pulito il claimRef); Delete distrugge il disco.
  • emptyDir muore col pod; hostPath ti lega a un nodo; solo PV/PVC persistono davvero.
★
El hilo del módulo: es la misma indirección de siempre. El Deployment no elige pods, los selecciona; el Service no contiene pods, los selecciona; el pod no elige disco, declara lo que necesita y el cluster resuelve. Cuando entendés que todo Kubernetes es "declarar el deseo y dejar que un controller lo satisfaga", los objetos nuevos dejan de sorprenderte.
The thread of the module: it is the same indirection as always. A Deployment does not pick pods, it selects them; a Service does not contain pods, it selects them; a pod does not pick a disk, it declares what it needs and the cluster resolves it. Once you see that all of Kubernetes is "declare the desire and let a controller satisfy it", new objects stop surprising you.
Il filo del modulo: è la solita indirezione. Un Deployment non sceglie i pod, li seleziona; un Service non contiene pod, li seleziona; un pod non sceglie il disco, dichiara cosa gli serve e il cluster risolve. Quando capisci che tutto Kubernetes è "dichiara il desiderio e lascia che un controller lo soddisfi", gli oggetti nuovi smettono di sorprenderti.
Checkpoint Módulo 8: volumes (emptyDir/hostPath), el trío PV+PVC+pod, StorageClasses y provisioning dinámico, access modes y reclaim policies, y el diagnóstico de PVC Pending. Dominio Storage (10%) completo. Siguiente: Módulo 9 — Troubleshooting de aplicaciones y pods.
Module 8 checkpoint: volumes (emptyDir/hostPath), the PV+PVC+pod trio, StorageClasses and dynamic provisioning, access modes and reclaim policies, and diagnosing a Pending PVC. The Storage domain (10%) is complete. Next: Module 9 — troubleshooting applications and pods.
Checkpoint Modulo 8: volume (emptyDir/hostPath), il trio PV+PVC+pod, StorageClass e provisioning dinamico, access mode e reclaim policy, e la diagnosi di una PVC Pending. Dominio Storage (10%) completo. Prossimo: Modulo 9 — troubleshooting di applicazioni e pod.
★
Fase 2 · resolver en vivo
Phase 2 · solve it live
Fase 2 · risolvere dal vivo

Práctica — 8 ejercicios

Practice — 8 exercises

Pratica — 8 esercizi

Todo se escribe a mano: no hay imperativo para PV ni PVC. Cronometrate.
Everything is written by hand: there is no imperative for PVs or PVCs. Time yourself.
Tutto si scrive a mano: non c'è imperativo per PV o PVC. Cronometrati.
0 / 8
🧠
Modelo mental. PVC = pedido → PV = oferta → el pod monta la PVC. Cada ejercicio se verifica igual: k get pv,pvc y, si algo está Pending, k describe pvc. Ese último evento es literalmente la respuesta — el dominio entero se resuelve leyendo, no adivinando.
Mental model. PVC = request → PV = supply → the pod mounts the PVC. Every exercise is verified the same way: k get pv,pvc and, if something is Pending, k describe pvc. That last event is literally the answer — the whole domain is solved by reading, not guessing.
Modello mentale. PVC = richiesta → PV = offerta → il pod monta la PVC. Ogni esercizio si verifica allo stesso modo: k get pv,pvc e, se qualcosa è Pending, k describe pvc. Quell'ultimo evento è letteralmente la risposta — l'intero dominio si risolve leggendo, non indovinando.
◆
Manifests publicados. Cada ejercicio tiene su YAML servido por este mismo sitio: k apply -f <url>/manifests/m8e1.yaml. Los E son la solución de referencia; los T plantan el problema — aplicalos y diagnosticá sin leerlos. Todos crean el namespace m8 y usan hostPath con type: DirectoryOrCreate, así que no hace falta entrar a ningún nodo. Los PV son cluster-scoped y van etiquetados ej=m8: k delete pv -l ej=m8. Ojo con E3, que crea una StorageClass default del cluster — k delete -f la saca.
Published manifests. Every exercise has its YAML served by this very site: k apply -f <url>/manifests/m8e1.yaml. The E ones are the reference solution; the T ones plant the problem — apply them and diagnose without reading them. All create namespace m8 and use hostPath with type: DirectoryOrCreate, so you never have to shell into a node. PVs are cluster-scoped and labelled ej=m8: k delete pv -l ej=m8. Watch out for E3, which creates a cluster default StorageClass — k delete -f removes it.
Manifest pubblicati. Ogni esercizio ha il suo YAML servito da questo stesso sito: k apply -f <url>/manifests/m8e1.yaml. Gli E sono la soluzione di riferimento; i T piantano il problema — applicali e diagnostica senza leggerli. Tutti creano il namespace m8 e usano hostPath con type: DirectoryOrCreate, quindi non devi entrare in nessun nodo. I PV sono cluster-scoped ed etichettati ej=m8: k delete pv -l ej=m8. Attenzione all'E3, che crea una StorageClass default del cluster — k delete -f la toglie.
◆
Preparación. Nada de esto rompe el cluster. Los PVs son cluster-scoped, así que etiquetalos (ej=storage) para limpiarlos después: k delete pv -l ej=storage. Para los hostPath, creá el directorio en el nodo primero: sudo mkdir -p /mnt/datos en el worker donde vaya a caer el pod.
Setup. None of this breaks the cluster. PVs are cluster-scoped, so label them (ej=storage) to clean up later: k delete pv -l ej=storage. For hostPath, create the directory on the node first: sudo mkdir -p /mnt/datos on whichever worker the pod will land on.
Preparazione. Nulla di questo rompe il cluster. I PV sono cluster-scoped, quindi etichettali (ej=storage) per ripulire dopo: k delete pv -l ej=storage. Per gli hostPath, crea prima la directory sul nodo: sudo mkdir -p /mnt/datos sul worker dove finirà il pod.
E1

emptyDir entre dos containers

emptyDir between two containers

emptyDir fra due container

~5 min

Creá un pod par con dos containers busybox: uno escribe la fecha cada 5 s en /data/log, el otro hace tail -f del mismo archivo pero montado en /in. Verificá que el lector ve lo que escribe el escritor. Después matá el container escritor y comprobá que el archivo sigue ahí cuando reinicia.

Create a pod par with two busybox containers: one writes the date every 5 s into /data/log, the other tail -fs the same file but mounted at /in. Verify the reader sees what the writer writes. Then kill the writer container and check the file is still there when it restarts.

Crea un pod par con due container busybox: uno scrive la data ogni 5 s in /data/log, l'altro fa tail -f dello stesso file ma montato in /in. Verifica che il lettore veda ciò che scrive lo scrittore. Poi uccidi il container scrittore e controlla che il file sia ancora lì al riavvio.

Ver soluciónShow solutionMostra soluzione
manifest · soluciónmanifest · solutionmanifest · soluzione
# el YAML de la sección 8.1, aplicado tal cual# the YAML from section 8.1, applied as-is# lo YAML della sezione 8.1, applicato così com'è
k apply -f par.yaml

k logs par -c lector -f
k exec par -c lector -- ls -l /in/log
k exec par -c lector -- df -h /in

# matar el proceso del escritor: el container reinicia, el archivo queda# kill the writer's process: the container restarts, the file stays# uccidi il processo dello scrittore: il container riparte, il file resta
k exec par -c escritor -- kill 1
k get pod par                # RESTARTS: 1# RESTARTS: 1# RESTARTS: 1
k exec par -c lector -- wc -l /in/log   # las líneas viejas siguen# the old lines are still there# le righe vecchie ci sono ancora
Claves
Key points
Punti chiave
  • El mismo volumen, dos mountPath distintos. Lo que tiene que coincidir es el name, no la ruta.
  • emptyDir sobrevive al reinicio del container, no al borrado del pod. Esa es la línea exacta.
  • Es el mecanismo natural para initContainers: preparan algo en el volumen y el container principal lo lee.
  • Same volume, two different mountPaths. What must match is the name, not the path.
  • emptyDir survives a container restart, not pod deletion. That is the exact line.
  • It is the natural mechanism for initContainers: they prepare something in the volume and the main container reads it.
  • Stesso volume, due mountPath diversi. Ciò che deve corrispondere è il name, non il percorso.
  • emptyDir sopravvive al riavvio del container, non alla cancellazione del pod. È esattamente questa la linea.
  • È il meccanismo naturale per gli initContainer: preparano qualcosa nel volume e il container principale lo legge.
E2

El trío completo, y que persista de verdad

The full trio, and real persistence

Il trio completo, e persistenza vera

~8 min

Escribí los tres YAML: un PV pv-datos de 1Gi, RWO, clase manual, reclaim Retain, respaldado por /mnt/datos; una PVC pvc-datos que pida 500Mi; y un pod nginx que la monte en /usr/share/nginx/html. Escribí un archivo, borrá el pod, recrealo y comprobá que el archivo sigue. Después mirá cuánto quedó bindeado.

Write the three YAMLs: a PV pv-datos of 1Gi, RWO, class manual, reclaim Retain, backed by /mnt/datos; a PVC pvc-datos requesting 500Mi; and an nginx pod mounting it at /usr/share/nginx/html. Write a file, delete the pod, recreate it and check the file is still there. Then look at how much ended up bound.

Scrivi i tre YAML: un PV pv-datos da 1Gi, RWO, classe manual, reclaim Retain, con backend /mnt/datos; una PVC pvc-datos che chieda 500Mi; e un pod nginx che la monti in /usr/share/nginx/html. Scrivi un file, cancella il pod, ricrealo e verifica che il file ci sia ancora. Poi guarda quanto è stato legato.

Ver soluciónShow solutionMostra soluzione
manifest · soluciónmanifest · solutionmanifest · soluzione
# los tres YAML de la sección 8.2, aplicados en ese orden# the three YAMLs from section 8.2, applied in that order# i tre YAML della sezione 8.2, applicati in quell'ordine
k apply -f pv.yaml -f pvc.yaml -f pod.yaml
k get pv,pvc

k exec app -- sh -c 'echo hola > /usr/share/nginx/html/i.html'
k delete pod app
k apply -f pod.yaml
k exec app -- cat /usr/share/nginx/html/i.html    #  hola

k get pvc pvc-datos
#   CAPACITY 1Gi — pidió 500Mi y se quedó con el PV entero#   CAPACITY 1Gi — it asked 500Mi and took the whole PV#   CAPACITY 1Gi — ha chiesto 500Mi e ha preso l'intero PV
Claves
Key points
Punti chiave
  • El pod referencia la PVC, nunca el PV. Si en el pod escribiste el nombre del PV, no bindea nada.
  • La PVC se quedó con 1Gi, no con los 500Mi que pidió: la relación es uno a uno y no hay subdivisión.
  • Con hostPath el pod queda atado al nodo donde está el directorio. Si el scheduler lo manda a otro, el archivo "desaparece" — no es magia, es otro disco.
  • The pod references the PVC, never the PV. Write the PV's name in the pod and nothing binds.
  • The PVC took 1Gi, not the 500Mi it asked for: the relationship is one-to-one and there is no subdivision.
  • With hostPath the pod is tied to the node holding that directory. If the scheduler sends it elsewhere the file "vanishes" — no magic, just a different disk.
  • Il pod referenzia la PVC, mai il PV. Se nel pod scrivi il nome del PV, non lega nulla.
  • La PVC ha preso 1Gi, non i 500Mi richiesti: la relazione è uno a uno e non c'è suddivisione.
  • Con hostPath il pod è legato al nodo che ha quella directory. Se lo scheduler lo manda altrove il file "sparisce" — nessuna magia, è un altro disco.
E3

Omitido vs "": los tres casos

Omitted vs "": the three cases

Omesso contro "": i tre casi

~6 min

Creá tres PVCs idénticas salvo por el storageClassName: (a) omitido, (b) "", (c) manual. Predecí el estado de cada una antes de aplicarlas, sabiendo que existe una StorageClass default y el PV de clase manual del E2 ya está Bound. Después comprobá.

Create three PVCs identical except for storageClassName: (a) omitted, (b) "", (c) manual. Predict each one's state before applying, knowing there is a default StorageClass and that E2's manual-class PV is already Bound. Then check.

Crea tre PVC identiche tranne che per storageClassName: (a) omesso, (b) "", (c) manual. Prevedi lo stato di ciascuna prima di applicarle, sapendo che esiste una StorageClass default e che il PV di classe manual dell'E2 è già Bound. Poi verifica.

Ver soluciónShow solutionMostra soluzione
manifest · soluciónmanifest · solutionmanifest · soluzione
(a) omitido → toma la default → provisiona un PV → Boundomitted → takes the default → provisions a PV → Boundomesso → prende la default → fa il provisioning di un PV → Bound
        (o Pending "waiting for first consumer" si es WaitForFirstConsumer)    (or Pending "waiting for first consumer" if it is WaitForFirstConsumer)    (o Pending "waiting for first consumer" se è WaitForFirstConsumer)
(b) ""       → sin dinámico, y no hay PV con "" → Pending para siempre→ no dynamic, and no PV with "" → Pending forever→ niente dinamico, e nessun PV con "" → Pending per sempre
(c) manual   → el único PV manual ya está Bound → Pending→ the only manual PV is already Bound → Pending→ l'unico PV manual è già Bound → Pending

k get pvc
k describe pvc b | tail -5
#   no persistent volumes available for this claim and no storage class is set
Claves
Key points
Punti chiave
  • Omitir no es lo mismo que "". Omitido = "usá la default"; "" = "sin clase, y no me provisiones nada". Cae en el examen redactado como "sin dynamic provisioning".
  • El caso (c) muestra la otra mitad: un PV ya bindeado no se comparte. Uno a uno, siempre.
  • El mensaje del describe distingue las causas: no PV available (no hay candidato) vs storageclass not found (la clase no existe) vs waiting for first consumer (no es un error).
  • En el lab (kubeadm, sin provisioner) el caso (a) también queda Pending, pero con otro mensaje: waiting for a volume to be created, either by external provisioner.... Ese contraste es la prueba de que omitir sí tomó la default: mirá k get pvc a -o jsonpath='{.spec.storageClassName}' y vas a ver que la API te la escribió sola.
  • Omitting is not the same as "". Omitted = "use the default"; "" = "no class, and provision nothing for me". It shows up in the exam worded as "without dynamic provisioning".
  • Case (c) shows the other half: an already-bound PV is not shared. One to one, always.
  • The describe message distinguishes the causes: no PV available (no candidate) vs storageclass not found (the class does not exist) vs waiting for first consumer (not an error).
  • In the lab (kubeadm, no provisioner) case (a) also stays Pending, but with a different message: waiting for a volume to be created, either by external provisioner.... That contrast proves omitting did take the default: run k get pvc a -o jsonpath='{.spec.storageClassName}' and you will see the API filled it in for you.
  • Omettere non è come "". Omesso = "usa la default"; "" = "nessuna classe, e non farmi provisioning". All'esame compare come "senza dynamic provisioning".
  • Il caso (c) mostra l'altra metà: un PV già legato non si condivide. Uno a uno, sempre.
  • Il messaggio del describe distingue le cause: no PV available (nessun candidato) contro storageclass not found (la classe non esiste) contro waiting for first consumer (non è un errore).
  • Nel lab (kubeadm, senza provisioner) anche il caso (a) resta Pending, ma con un altro messaggio: waiting for a volume to be created, either by external provisioner.... Quel contrasto prova che omettere ha preso la default: lancia k get pvc a -o jsonpath='{.spec.storageClassName}' e vedrai che l'API l'ha scritta da sola.
E4

Traducir el enunciado al access mode

Translating the wording into an access mode

Tradurre il testo in un access mode

~5 min

Elegí el access mode correcto para cada caso y justificá en una línea: (1) una base Postgres con su disco; (2) tres réplicas de un CMS en distintos nodos que escriben los mismos uploads; (3) un job que necesita garantía de que ningún otro pod monte el volumen mientras corre; (4) varios pods que solo leen un dataset compartido.

Pick the right access mode for each case and justify in one line: (1) a Postgres database with its disk; (2) three CMS replicas on different nodes writing the same uploads; (3) a job needing a guarantee that no other pod mounts the volume while it runs; (4) several pods that only read a shared dataset.

Scegli l'access mode giusto per ogni caso e giustifica in una riga: (1) un database Postgres col suo disco; (2) tre repliche di un CMS su nodi diversi che scrivono gli stessi upload; (3) un job che ha bisogno della garanzia che nessun altro pod monti il volume mentre gira; (4) più pod che leggono soltanto un dataset condiviso.

Ver soluciónShow solutionMostra soluzione
manifest · soluciónmanifest · solutionmanifest · soluzione
1  ReadWriteOnce      RWO   # un solo nodo escribe; es el default de los discos de bloque# one node writes; the default for block disks# scrive un solo nodo; è il default dei dischi a blocchi
2  ReadWriteMany      RWX   # varios NODOS escriben → hace falta un FS de red (NFS, CephFS)# several NODES write → needs a network FS (NFS, CephFS)# scrivono più NODI → serve un FS di rete (NFS, CephFS)
3  ReadWriteOncePod   RWOP  # exclusividad de UN POD, no de un nodo# exclusivity of ONE POD, not one node# esclusività di UN POD, non di un nodo
4  ReadOnlyMany       ROX   # muchos nodos, solo lectura# many nodes, read only# molti nodi, sola lettura
Claves
Key points
Punti chiave
  • El "Once" de RWO cuenta nodos, no pods. Dos pods del mismo nodo pueden compartir un RWO — por eso existe RWOP.
  • El enunciado esconde el modo en el lenguaje: "distintos nodos" → RWX; "ningún otro pod" → RWOP; "solo leen" → ROX.
  • El modo declarado describe una capacidad del backend, no la crea: pedir RWX sobre un disco de bloque no lo convierte en compartible.
  • The "Once" in RWO counts nodes, not pods. Two pods on the same node can share an RWO — which is why RWOP exists.
  • The wording hides the mode in plain language: "different nodes" → RWX; "no other pod" → RWOP; "only read" → ROX.
  • The declared mode describes a backend capability, it does not create it: asking for RWX on a block disk does not make it shareable.
  • Il "Once" di RWO conta nodi, non pod. Due pod dello stesso nodo possono condividere un RWO — per questo esiste RWOP.
  • Il testo nasconde la modalità nel linguaggio: "nodi diversi" → RWX; "nessun altro pod" → RWOP; "solo leggono" → ROX.
  • La modalità dichiarata descrive una capacità del backend, non la crea: chiedere RWX su un disco a blocchi non lo rende condivisibile.
E5

Reciclar un PV en Released

Recycling a Released PV

Riciclare un PV in Released

~6 min

Borrá el pod y la PVC del E2 (en ese orden). Observá el estado del PV. Después creá una PVC nueva con el mismo pedido y explicá por qué queda Pending. Devolvé el PV a Available sin perder los datos y confirmá que la PVC nueva bindea.

Delete E2's pod and PVC (in that order). Observe the PV's state. Then create a new PVC with the same request and explain why it stays Pending. Return the PV to Available without losing the data and confirm the new PVC binds.

Cancella il pod e la PVC dell'E2 (in quell'ordine). Osserva lo stato del PV. Poi crea una nuova PVC con la stessa richiesta e spiega perché resta Pending. Riporta il PV ad Available senza perdere i dati e conferma che la nuova PVC lega.

Ver soluciónShow solutionMostra soluzione
manifest · soluciónmanifest · solutionmanifest · soluzione
k delete pod app && k delete pvc pvc-datos
k get pv
#   pv-datos  ...  Released  default/pvc-datos

k apply -f pvc.yaml            # queda Pending# stays Pending# resta Pending
k get pv pv-datos -o jsonpath='{.spec.claimRef}'
#   todavía apunta a la PVC muerta (por su uid)#   still points at the dead PVC (by its uid)#   punta ancora alla PVC morta (per il suo uid)

k patch pv pv-datos -p '{"spec":{"claimRef":null}}'
k get pv,pvc                   # Available → y enseguida Bound# Available → then Bound# Available → e subito Bound
k exec app -- cat /usr/share/nginx/html/i.html   # los datos siguen# the data is still there# i dati ci sono ancora
Claves
Key points
Punti chiave
  • Released no es Available. Con Retain, el PV conserva el claimRef de la PVC muerta a propósito: nadie más puede tomar esos datos por accidente.
  • El fix es de una línea: patch ... claimRef: null. Es el único caso del dominio donde se edita un PV a mano.
  • Si el reclaim hubiera sido Delete, el PV y el disco ya no existirían. Por eso los PVs con datos que importan van en Retain.
  • Released is not Available. With Retain, the PV keeps the dead PVC's claimRef on purpose: nobody else can pick up that data by accident.
  • The fix is one line: patch ... claimRef: null. It is the only case in this domain where you hand-edit a PV.
  • Had the reclaim been Delete, the PV and the disk would already be gone. That is why PVs with data that matters use Retain.
  • Released non è Available. Con Retain, il PV conserva di proposito il claimRef della PVC morta: nessun altro può prendere quei dati per sbaglio.
  • Il fix è di una riga: patch ... claimRef: null. È l'unico caso del dominio in cui si modifica un PV a mano.
  • Se il reclaim fosse stato Delete, il PV e il disco non esisterebbero più. Per questo i PV con dati che contano vanno in Retain.
E6

Expandir una PVC

Expanding a PVC

Espandere una PVC

~5 min

Con una PVC dinámica de 2Gi, llevala a 5Gi sin recrearla. Antes de intentarlo, verificá que la StorageClass lo permita. Después intentá bajarla a 1Gi y anotá el error exacto.

With a 2Gi dynamic PVC, take it to 5Gi without recreating it. Before trying, check the StorageClass allows it. Then try shrinking it to 1Gi and note the exact error.

Con una PVC dinamica da 2Gi, portala a 5Gi senza ricrearla. Prima di provare, verifica che la StorageClass lo permetta. Poi prova a ridurla a 1Gi e annota l'errore esatto.

Ver soluciónShow solutionMostra soluzione
manifest · soluciónmanifest · solutionmanifest · soluzione
k get sc standard -o jsonpath='{.allowVolumeExpansion}'   #  true

k patch pvc pvc-din -p \
  '{"spec":{"resources":{"requests":{"storage":"5Gi"}}}}'
k get pvc pvc-din -w
k describe pvc pvc-din | grep -i condition -A3
#   FileSystemResizePending → reiniciá el pod para que crezca el FS#   FileSystemResizePending → restart the pod so the FS grows#   FileSystemResizePending → riavvia il pod perché il FS cresca

k patch pvc pvc-din -p '{"spec":{"resources":{"requests":{"storage":"1Gi"}}}}'
#   Forbidden: field can not be less than previous value
Claves
Key points
Punti chiave
  • Solo hacia arriba, y solo con allowVolumeExpansion: true. Si la SC no lo permite, ni siquiera te deja editar.
  • El tamaño es lo único mutable de una PVC. Clase y access modes son inmutables: si te equivocaste, se borra y se recrea.
  • FileSystemResizePending no es un error: el volumen ya creció, falta que el filesystem se entere. Un reinicio del pod lo resuelve.
  • En el lab no vas a ver esa condición: sin CSI driver nadie agranda nada, el status.capacity no se mueve. Lo que sí reproducís —y es lo que evalúa el examen— es la respuesta de la API: el patch hacia arriba se acepta, el de abajo se rechaza.
  • Upwards only, and only with allowVolumeExpansion: true. If the SC forbids it, you cannot even edit.
  • Size is the only mutable thing on a PVC. Class and access modes are immutable: get them wrong and you delete and recreate.
  • FileSystemResizePending is not an error: the volume already grew, the filesystem just has not noticed. A pod restart resolves it.
  • You will not see that condition in the lab: with no CSI driver nothing actually grows and status.capacity does not move. What you do reproduce — and what the exam grades — is the API response: the upward patch is accepted, the downward one is rejected.
  • Solo verso l'alto, e solo con allowVolumeExpansion: true. Se la SC lo vieta, non ti lascia nemmeno modificare.
  • La dimensione è l'unica cosa mutabile di una PVC. Classe e access mode sono immutabili: se sbagli, si cancella e si ricrea.
  • FileSystemResizePending non è un errore: il volume è già cresciuto, manca che il filesystem se ne accorga. Un riavvio del pod lo risolve.
  • Nel lab quella condizione non la vedrai: senza driver CSI nessuno ingrandisce nulla e status.capacity non si muove. Quello che riproduci davvero — ed è ciò che valuta l'esame — è la risposta dell'API: la patch verso l'alto viene accettata, quella verso il basso rifiutata.
T1

Troubleshooting — PVC Pending, ¿cuál criterio falla?

Troubleshooting — PVC Pending, which criterion fails?

Troubleshooting — PVC Pending, quale criterio fallisce?

~7 min

Un pod está Pending y su PVC también. Hay un PV libre en el cluster. Encontrá cuál de los tres criterios no se cumple y arreglalo sin tocar el PV (asumí que el PV es de producción y no es tuyo).

Para plantarlo: creá un PV de 1Gi RWO clase lento y una PVC que pida 2Gi de clase lento.

A pod is Pending and so is its PVC. There is a free PV in the cluster. Find which of the three criteria fails and fix it without touching the PV (assume the PV is production and not yours).

To plant it: create a 1Gi RWO PV of class lento and a PVC requesting 2Gi of class lento.

Un pod è Pending e così la sua PVC. C'è un PV libero nel cluster. Trova quale dei tre criteri fallisce e sistemalo senza toccare il PV (supponi che il PV sia di produzione e non tuo).

Per prepararlo: crea un PV da 1Gi RWO di classe lento e una PVC che chieda 2Gi di classe lento.

manifest · plantar el problemamanifest · plant the problemmanifest · piantare il problema
Ver soluciónShow solutionMostra soluzione
k describe pod app | tail -5
#   FailedScheduling: pod has unbound immediate PersistentVolumeClaims

k describe pvc mi-pvc | tail -5
#   no persistent volumes available for this claim

# comparar oferta y pedido campo por campo# compare supply and request field by field# confrontare offerta e richiesta campo per campo
k get pv -o custom-columns=NAME:.metadata.name,CAP:.spec.capacity.storage,\
MODES:.spec.accessModes,SC:.spec.storageClassName,ST:.status.phase
#   pv-lento  1Gi  [RWO]  lento  Available   ← la clase y el modo coinciden#   pv-lento  1Gi  [RWO]  lento  Available   ← class and mode match#   pv-lento  1Gi  [RWO]  lento  Available   ← classe e modalità coincidono
k get pvc mi-pvc -o jsonpath='{.spec.resources.requests.storage}'   #  2Gi

# el tamaño es inmutable hacia abajo → recrear la PVC pidiendo 1Gi# size is immutable downwards → recreate the PVC asking for 1Gi# la dimensione è immutabile verso il basso → ricreare la PVC chiedendo 1Gi
k delete pvc mi-pvc && k apply -f pvc-1gi.yaml
k get pv,pvc
Claves
Key points
Punti chiave
  • El custom-columns sobre los PVs es el atajo del dominio: te pone los tres criterios en una línea y la comparación se vuelve visual.
  • El evento no persistent volumes available cubre las tres causas por igual; no te dice cuál. Por eso la comparación campo por campo no es opcional.
  • Una PVC no se achica ni se le cambia la clase: se borra y se recrea. Como no tenía datos todavía, no se pierde nada.
  • custom-columns over the PVs is this domain's shortcut: it puts the three criteria on one line and the comparison becomes visual.
  • The no persistent volumes available event covers all three causes equally; it does not say which. That is why the field-by-field comparison is not optional.
  • A PVC cannot shrink or change class: delete and recreate. Since it held no data yet, nothing is lost.
  • Il custom-columns sui PV è la scorciatoia del dominio: mette i tre criteri su una riga e il confronto diventa visivo.
  • L'evento no persistent volumes available copre le tre cause allo stesso modo; non dice quale. Per questo il confronto campo per campo non è opzionale.
  • Una PVC non si riduce né cambia classe: si cancella e si ricrea. Non avendo ancora dati, non si perde nulla.
T2

Troubleshooting — la PVC que no se borra

Troubleshooting — the PVC that will not delete

Troubleshooting — la PVC che non si cancella

~5 min

Borraste una PVC y quedó en Terminating. Pasaron cinco minutos y sigue igual. Explicá qué la retiene, arreglalo sin borrar el finalizer a mano, y explicá por qué borrar el finalizer sería la peor opción.

You deleted a PVC and it is stuck in Terminating. Five minutes later it is unchanged. Explain what holds it, fix it without removing the finalizer by hand, and explain why removing the finalizer would be the worst option.

Hai cancellato una PVC ed è rimasta in Terminating. Sono passati cinque minuti e non cambia. Spiega cosa la trattiene, sistemala senza togliere il finalizer a mano, e spiega perché togliere il finalizer sarebbe l'opzione peggiore.

manifest · plantar el problemamanifest · plant the problemmanifest · piantare il problema
Ver soluciónShow solutionMostra soluzione
k get pvc mi-pvc -o jsonpath='{.metadata.finalizers}'
#   ["kubernetes.io/pvc-protection"]

# ¿quién la está usando?# who is using it?# chi la sta usando?
k get pods -o json | jq -r '.items[] | select(.spec.volumes[]?.persistentVolumeClaim.claimName=="mi-pvc") | .metadata.name'
#   (o más simple, sin jq)#   (or simpler, without jq)#   (o più semplice, senza jq)
k describe pvc mi-pvc | grep -i -A2 'used by'

# la solución: sacar al consumidor# the solution: remove the consumer# la soluzione: togliere il consumatore
k delete pod app
k get pvc                # se fue sola# it went away on its own# se n'è andata da sola
Claves
Key points
Punti chiave
  • No es un cuelgue, es una protección. El finalizer pvc-protection impide que le saques el disco de abajo a un pod que está escribiendo.
  • El orden correcto es siempre pod primero, PVC después. Si lo hacés al revés, la PVC espera — y eso está bien.
  • Borrar el finalizer a mano es la peor opción: la PVC desaparece del API pero el volumen sigue montado en el pod, y quedás con un PV en un estado inconsistente y un pod escribiendo en un disco que el cluster ya considera libre.
  • It is not a hang, it is a protection. The pvc-protection finalizer stops you pulling the disk out from under a pod that is writing.
  • The right order is always pod first, PVC second. Do it the other way and the PVC waits — and that is correct.
  • Removing the finalizer by hand is the worst option: the PVC vanishes from the API but the volume stays mounted in the pod, leaving you with a PV in an inconsistent state and a pod writing to a disk the cluster already considers free.
  • Non è un blocco, è una protezione. Il finalizer pvc-protection impedisce di sfilare il disco a un pod che sta scrivendo.
  • L'ordine giusto è sempre prima il pod, poi la PVC. Se lo fai al contrario, la PVC aspetta — ed è corretto così.
  • Togliere il finalizer a mano è l'opzione peggiore: la PVC sparisce dall'API ma il volume resta montato nel pod, lasciandoti un PV in stato incoerente e un pod che scrive su un disco che il cluster considera già libero.

Autoevaluación — antes de marcar M8 como ★ dominado

Self-check — before marking M8 as ★ mastered

Autovalutazione — prima di segnare M8 come ★ padroneggiato

  • Escribir PV + PVC + pod de memoria en menos de 4 min.
  • Decir los tres criterios del binding sin mirar.
  • Explicar por qué una PVC de 500Mi contra un PV de 1Gi termina con 1Gi.
  • Distinguir storageClassName omitido, "" y con nombre.
  • Traducir un enunciado en lenguaje natural al access mode correcto.
  • Devolver un PV Released a Available.
  • Expandir una PVC y saber por qué no se puede achicar.
  • Diagnosticar un pod Pending llegando al evento del describe pvc.
  • Write PV + PVC + pod from memory in under 4 min.
  • State the three binding criteria without looking.
  • Explain why a 500Mi PVC against a 1Gi PV ends up with 1Gi.
  • Distinguish omitted storageClassName, "", and a named one.
  • Translate plain-language wording into the right access mode.
  • Return a Released PV to Available.
  • Expand a PVC and know why it cannot shrink.
  • Diagnose a Pending pod all the way to the describe pvc event.
  • Scrivere PV + PVC + pod a memoria in meno di 4 min.
  • Enunciare i tre criteri del binding senza guardare.
  • Spiegare perché una PVC da 500Mi contro un PV da 1Gi finisce con 1Gi.
  • Distinguere storageClassName omesso, "", e con un nome.
  • Tradurre un testo in linguaggio naturale nell'access mode giusto.
  • Riportare un PV Released ad Available.
  • Espandere una PVC e sapere perché non si può ridurre.
  • Diagnosticare un pod Pending fino all'evento del describe pvc.
Módulo 8 completado · Storage, dominio cerrado · Siguiente: Troubleshooting — el 30% del examen
Module 8 complete · Storage, domain closed · Next: Troubleshooting — 30% of the exam
Modulo 8 completato · Storage, dominio chiuso · Prossimo: Troubleshooting — il 30% dell'esame