Что такое Insufficient resources?

Ошибка Insufficient resources возникает, когда Kubernetes не может разместить поды из-за нехватки ресурсов на узлах кластера.

Причины возникновения

  • Недостаточно CPU на узлах
  • Недостаточно памяти на узлах
  • Недостаточно места на диске
  • Проблемы с GPU ресурсами
  • Неправильная настройка requests/limits
  • Высокая нагрузка на кластер

Как отладить ошибку

  1. Проверь ресурсы узлов - kubectl top nodes
  2. Проверь pending поды - kubectl get pods --field-selector=status.phase=Pending
  3. Проверь события - kubectl describe pod pod-name
  4. Проверь capacity узлов - kubectl describe node
  5. Проверь requests/limits - kubectl get pods -o yaml

Как исправить ошибку

1. Увеличь ресурсы узлов

1# Добавь новый узел в кластер
2kubectl scale node-pool --replicas=5
3
4# Или добавь узел вручную
5kubeadm join --token <token> <master-ip>:6443

2. Оптимизируй requests и limits

 1apiVersion: v1
 2kind: Pod
 3metadata:
 4  name: my-app
 5spec:
 6  containers:
 7  - name: app
 8    image: nginx:latest
 9    resources:
10      requests:
11        memory: "64Mi"
12        cpu: "100m"
13      limits:
14        memory: "128Mi"
15        cpu: "200m"

3. Используй горизонтальное масштабирование

 1apiVersion: autoscaling/v2
 2kind: HorizontalPodAutoscaler
 3metadata:
 4  name: my-app-hpa
 5spec:
 6  scaleTargetRef:
 7    apiVersion: apps/v1
 8    kind: Deployment
 9    name: my-app
10  minReplicas: 2
11  maxReplicas: 10
12  metrics:
13  - type: Resource
14    resource:
15      name: cpu
16      target:
17        type: Utilization
18        averageUtilization: 70

4. Настрой вертикальное масштабирование

 1apiVersion: autoscaling/v2
 2kind: VerticalPodAutoscaler
 3metadata:
 4  name: my-app-vpa
 5spec:
 6  targetRef:
 7    apiVersion: "apps/v1"
 8    kind: Deployment
 9    name: my-app
10  updatePolicy:
11    updateMode: "Auto"

5. Используй node affinity

 1apiVersion: v1
 2kind: Pod
 3metadata:
 4  name: my-app
 5spec:
 6  affinity:
 7    nodeAffinity:
 8      requiredDuringSchedulingIgnoredDuringExecution:
 9        nodeSelectorTerms:
10        - matchExpressions:
11          - key: node-type
12            operator: In
13            values:
14            - high-memory
15  containers:
16  - name: app
17    image: nginx:latest

6. Настрой taints и tolerations

 1# Добавь taint на узел
 2kubectl taint nodes node1 app=high-memory:NoSchedule
 3
 4# Добавь toleration в под
 5apiVersion: v1
 6kind: Pod
 7metadata:
 8  name: my-app
 9spec:
10  tolerations:
11  - key: "app"
12    operator: "Equal"
13    value: "high-memory"
14    effect: "NoSchedule"
15  containers:
16  - name: app
17    image: nginx:latest

Как мониторить подобные ошибки

  • Мониторь использование ресурсов узлов
  • Настрой алерты на высокое использование ресурсов
  • Проверяй pending поды регулярно
  • Используй метрики кластера

FAQ

В: Как определить оптимальные requests/limits?

О: Мониторь использование ресурсов, используй VPA для автоматической настройки.

В: Что делать, если нет возможности добавить узлы?

О: Оптимизируй приложения, используй более эффективные образы, настрой HPA.

В: Как избежать проблем с ресурсами в production?

О: Планируй capacity заранее, используй мониторинг, настрой autoscaling.

Лучшие практики

  • Устанавливай разумные requests и limits
  • Мониторь использование ресурсов
  • Используй autoscaling
  • Планируй capacity заранее
  • Оптимизируй приложения