K8s em Exemplos: Orçamentos de Disrupção de Pod

PDBs protegem contra disruptions voluntárias: drains de node, upgrades de cluster, scale-downs do autoscaler. Garante disponibilidade mínima durante operações de manutenção.

pdb.yaml

PDBs usam a API policy/v1. O selector corresponde Pods a proteger. minAvailable especifica quantos Pods devem permanecer rodando durante disruptions.

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: my-app-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: my-app
pdb-options.yaml

minAvailable: mínimo de Pods que devem ficar rodando. maxUnavailable: máximo de Pods que podem estar down. Use um ou outro, não ambos. Porcentagens também funcionam.

spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: my-app
---
spec:
  maxUnavailable: 1
  selector:
    matchLabels:
      app: my-app
---
spec:
  minAvailable: "50%"
  selector:
    matchLabels:
      app: my-app
terminal

PDBs só protegem contra disruptions voluntárias como drains (primeiro comando mostra PDB bloqueando eviction). Não podem prevenir disruptions involuntárias: falhas de node, OOMKill, crashes. kubectl delete pod também ignora PDB (segundo comando).

$ kubectl drain node-1 --ignore-daemonsets
node/node-1 cordoned
evicting pod default/my-app-1
evicting pod default/my-app-2
error when evicting pods: Cannot evict pod, would violate PDB

$ kubectl delete pod my-app-1 --grace-period=0
pod "my-app-1" deleted
deployment-pdb.yaml

Combine PDB com sua contagem de réplicas. Não defina minAvailable igual a réplicas ou drains ficarão pendurados para sempre. Deixe espaço para pelo menos um Pod ser disrupted. minAvailable: 2 e maxUnavailable: 1 são equivalentes para 3 réplicas.

apiVersion: apps/v1
kind: Deployment
spec:
  replicas: 3
---
apiVersion: policy/v1
kind: PodDisruptionBudget
spec:
  minAvailable: 2
---
spec:
  maxUnavailable: 1
pdb-unhealthy.yaml

unhealthyPodEvictionPolicy controla eviction de Pods não saudáveis. AlwaysAllow evicta Pods não saudáveis independente do budget. Ajuda com rollouts travados onde Pods estão crashlooping.

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: my-app-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: my-app
  unhealthyPodEvictionPolicy: AlwaysAllow
terminal

Status do PDB mostra disruptions permitidas e contagem atual de Pods. ALLOWED mostra quantos Pods podem ser disrupted com segurança agora. Zero significa que operações vão bloquear.

$ kubectl get pdb
NAME         MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
my-app-pdb   2               N/A               1                     5m

$ kubectl describe pdb my-app-pdb
Status:
  Current Healthy:   3
  Desired Healthy:   2
  Disruptions Allowed: 1
  Expected Pods:     3
  Observed Generation: 1
deployment-pdb-strategy.yaml

Durante rolling updates, PDB interage com estratégia do Deployment. Ambas restrições devem ser satisfeitas. Pode causar rollouts lentos se ambas são muito restritivas.

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
---
spec:
  minAvailable: 2
terminal

Debug problemas de PDB verificando disruptions permitidas e eventos de eviction. Force drain bypassa PDB mas arrisca disponibilidade. Use —delete-emptydir-data para Pods com volumes emptyDir.

$ kubectl get pdb -A
NAMESPACE   NAME         MIN AVAILABLE   ALLOWED DISRUPTIONS
default     my-app-pdb   2               1
kube-system coredns      1               1

$ kubectl get pods -l app=my-app
NAME         READY   STATUS    AGE
my-app-1     1/1     Running   10m
my-app-2     1/1     Running   10m
my-app-3     1/1     Running   10m

$ kubectl drain node-1 --force --ignore-daemonsets \
    --delete-emptydir-data
node/node-1 drained

$ kubectl get events --field-selector reason=Eviction

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