GitHub EN PT

K8s em Exemplos: Pod Priority & Preemption

Pod Priority determina ordem de scheduling e direitos de preemption. Pods de maior prioridade são agendados primeiro e podem evictar pods de menor prioridade quando recursos estão escassos. Use para proteger workloads críticos e permitir degradação graciosa sob pressão de recursos.

priorityclass.yaml

PriorityClass define um nível de prioridade. Maior value = maior prioridade. Range: -2 bilhões a 1 bilhão. Prioridades de sistema usam valores acima de 1 bilhão.

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000000
globalDefault: false
description: "Workloads críticos de produção"

preemptionPolicy controla se esta prioridade pode evictar outros. PreemptLowerPriority (padrão) permite evição. Never desabilita.

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority-no-preempt
value: 1000000
preemptionPolicy: Never      # Não evicta outros pods
description: "Alta prioridade mas não faz preempt"
priority-tiers.yaml

Crie um sistema de tiers de prioridade para seu cluster. Padrão comum: system-critical > production > staging > batch. Deixe gaps entre valores para tiers futuros.

# Tier 1: Crítico do sistema (nunca evictar)
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: system-critical
value: 2000000
---
# Tier 2: Workloads de produção
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: production
value: 1000000
---
# Tier 3: Staging/testing
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: staging
value: 500000
---
# Tier 4: Batch/jobs de background
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: batch
value: 100000
deployment-priority.yaml

Referencie a PriorityClass na spec do seu Pod. O scheduler usa isso para ordenar pods pendentes e determinar elegibilidade para preemption.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-gateway
spec:
  replicas: 3
  selector:
    matchLabels:
      app: api-gateway
  template:
    metadata:
      labels:
        app: api-gateway
    spec:
      priorityClassName: production    # Alta prioridade
      containers:
        - name: gateway
          image: api-gateway:v1
          resources:
            requests:
              cpu: "500m"
              memory: "512Mi"
terminal

Veja todas as priority classes incluindo prioridades de sistema built-in. system-cluster-critical e system-node-critical são reservadas para pods essenciais do sistema.

$ kubectl get priorityclasses
NAME                      VALUE        GLOBAL-DEFAULT
system-cluster-critical   2000000000   false
system-node-critical      2000001000   false
production                1000000      false
staging                   500000       false
batch                     100000       true   # Default

Verifique qual priority class um pod está usando. Pods sem priorityClassName explícito usam o globalDefault ou default para 0.

$ kubectl get pods -o custom-columns=\
    NAME:.metadata.name,\
    PRIORITY:.spec.priorityClassName,\
    VALUE:.spec.priority
NAME          PRIORITY     VALUE
api-gateway   production   1000000
worker-job    batch        100000
misc-pod      <none>       0
terminal

Quando preemption ocorre, pods de menor prioridade são evictados para abrir espaço. Eventos mostram quais pods foram preempted e por quê.

$ kubectl get events | grep -i preempt
1m   Normal   Preempted   pod/worker-job-123
     Preempted by prod/api-gateway-456 on node worker-1

$ kubectl describe pod api-gateway-456 | grep -A5 Events
Events:
  Type    Reason     Message
  ----    ------     -------
  Normal  Scheduled  Preempting 2 pods: [worker-job-123, batch-456]
  Normal  Pulling    Pulling image "api-gateway:v1"

Pods preempted são terminados graciosamente (SIGTERM, grace period). Eles aparecem com Reason: Preempting nos eventos.

$ kubectl get pods
NAME              READY   STATUS        AGE
api-gateway-456   1/1     Running       30s
worker-job-123    1/1     Terminating   5m   # Sendo preempted

$ kubectl describe pod worker-job-123 | grep -A3 Status
Status:       Terminating
Reason:       Preempting
Message:      Preempted by higher priority pod
pdb-with-priority.yaml

PodDisruptionBudgets interagem com preemption. Um PDB pode prevenir preemption se violaria o budget de disrupção. Use PDB para proteger serviços críticos.

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: api-gateway-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: api-gateway
# Se preemptar api-gateway cairia abaixo de
# 2 pods disponíveis, preemption é bloqueado
# O pod de alta prioridade pendente fica Pending

Combine prioridade com PDB para proteção em camadas. Alta prioridade previne evição por pods de menor prioridade. PDB previne evição por qualquer disrupção voluntária.

# Serviço crítico: alta prioridade + PDB estrito
priorityClassName: production
---
apiVersion: policy/v1
kind: PodDisruptionBudget
spec:
  minAvailable: "50%"
  selector:
    matchLabels:
      app: critical-service
avoid-cascade.yaml

Aviso: Má configuração de prioridade causa evições em cascata. Se muitos pods de alta prioridade ficam Pending, podem evictar workloads inteiros. Use ResourceQuotas para limitar contagem de pods de alta prioridade.

# Limitar pods de alta prioridade por namespace
apiVersion: v1
kind: ResourceQuota
metadata:
  name: priority-quota
  namespace: production
spec:
  hard:
    pods: "100"
  scopeSelector:
    matchExpressions:
      - operator: In
        scopeName: PriorityClass
        values:
          - production
          - system-critical
# Máximo 100 pods de alta prioridade neste namespace
# Previne deployments descontrolados de alta prioridade

Índice | Use as setas do teclado para navegar