Tag: kubernetes, k8s, containers, devops, orchestration, cloud
Livello: intermedio
TL;DR: Fondamenti di orchestrazione container: architettura del cluster, primitive principali, networking, storage e comandi kubectl essenziali per il debug in produzione.
Control Plane gestisce lo stato del cluster tramite kube-apiserver, etcd, kube-scheduler e kube-controller-manager.
I nodi worker eseguono i carichi di lavoro tramite kubelet, kube-proxy e il container runtime (CRI).
Il Pod e' la piu' piccola unita' computazionale distribuibile, contenente uno o piu' container con rete e storage condivisi.
Un Deployment gestisce il ciclo di vita dichiarativo e il rolling update dei ReplicaSet e relativi Pod.
Un Service fornisce uno stable IP e un bilanciamento L4 verso un set dinamico di Pod selezionati tramite labels.
Ingress espone rotte HTTP e HTTPS dall'esterno verso i Service interni con supporto a host e path routing.
ConfigMap gestisce dati di configurazione in chiaro; Secret gestisce credenziali e certificati codificati in base64.
I carichi stateful si basano su PersistentVolume (PV) e PersistentVolumeClaim (PVC) associati a uno StatefulSet.
I Probe (liveness, readiness, startup) controllano lo stato di salute e la disponibilita' del traffico verso i Pod.
Resource requests determinano lo scheduling sul nodo; Resource limits prevengono l'eccessivo consumo tramite cgroups.
Q: Qual e' la differenza pratica tra readinessProbe e livenessProbe?R: La liveness riavvia il container quando fallisce, per risolvere deadlock. La readiness rimuove temporaneamente il Pod dagli endpoint del Service per evitare errori durante l'avvio o sovraccarichi.
Q: Come risolvi un Pod bloccato nello stato CrashLoopBackOff?R: Ispeziono subito i log con kubectl logs --previous per leggere l'errore fatale del processo, seguito da kubectl describe pod per verificare exit code, risorse ed eventi del nodo.
Q: Perche' si preferisce uno StatefulSet a un Deployment per un database?R: Lo StatefulSet garantisce identita' di rete stabili, volumi persistenti dedicati per ogni indice e rollout/scaling ordinati e sequenziali, preservando la consistenza dei dati.
Omettere resources.limits puo' portare alla saturazione del nodo ed eviction improvvisa dei Pod vicini.
Impostare un livenessProbe troppo aggressivo prima del bootstrap applicativo puo' causare un loop continuo di riavvii.
I Secret in Kubernetes sono solo codificati in base64 e non crittografati a riposo senza KMS provider in etcd.
Modificare un Service senza verificare la corrispondenza dei selector puo' causare Endpoints vuoti e traffico perso a vuoto.
Utilizzare il tag :latest nelle immagini dei container impedisce il corretto tracking delle versioni e rollout deterministici.
# Ispezione dello stato dei nodi e dei pod
kubectl get nodes -o wide
kubectl get pods -A -o wide
# Diagnostica ed eventi di dettaglio
kubectl describe pod <pod-name> -n <namespace>
kubectl logs <pod-name> -c <container-name> --previous --tail=100
# Esecuzione comandi e debug interattivo nel container
kubectl exec -it <pod-name> -n <namespace> -- /bin/sh
# Forwarding porte locale per test di rete
kubectl port-forward svc/<service-name> 8080:80 -n <namespace>
# Riavvio e rollout di un deployment
kubectl rollout restart deployment/<deployment-name> -n <namespace>
kubectl rollout status deployment/<deployment-name> -n <namespace>
kubectl rollout undo deployment/<deployment-name> -n <namespace>
YAML
```apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
image: nginx:1.25-alpine
ports:
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "250m"
readinessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 5
periodSeconds: 10
```
[ ] Network Policies e isolamento del traffico tra namespace differenti
[ ] RBAC: configurazione di ServiceAccount, Role e RoleBinding
[ ] Meccanismi di Horizontal Pod Autoscaler (HPA) basati su metriche personalizzate
[x] Ciclo di vita dei Pod e gestione dei container init
[x] Differenza tra Service ClusterIP, NodePort e LoadBalancer