Что такое OOMKilled?

Ошибка OOMKilled (Out of Memory) возникает, когда контейнер превышает лимит памяти и система завершает процесс.

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

  • Недостаточный лимит памяти
  • Утечки памяти в приложении
  • Неправильная настройка ресурсов
  • Высокая нагрузка на приложение
  • Проблемы с garbage collection
  • Недостаточно памяти на узле

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

  1. Проверь использование памяти - kubectl top pod
  2. Проверь логи пода - kubectl logs pod-name
  3. Проверь события - kubectl describe pod pod-name
  4. Проверь ресурсы узла - kubectl top node
  5. Проверь метрики - используй Prometheus/Grafana

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

1. Увеличь лимиты памяти

 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: "256Mi"
12        cpu: "250m"
13      limits:
14        memory: "512Mi"
15        cpu: "500m"

2. Оптимизируй приложение

 1// Пример оптимизации Node.js
 2const cluster = require('cluster');
 3const numCPUs = require('os').cpus().length;
 4
 5if (cluster.isMaster) {
 6  // Создай workers
 7  for (let i = 0; i < numCPUs; i++) {
 8    cluster.fork();
 9  }
10} else {
11  // Worker process
12  require('./app');
13}

3. Настрой garbage collection

1# Для Java приложений
2-XX:+UseG1GC -XX:MaxGCPauseMillis=200
3
4# Для Node.js
5--max-old-space-size=512
6
7# Для Python
8import gc
9gc.collect()

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

 1apiVersion: apps/v1
 2kind: Deployment
 3metadata:
 4  name: my-app
 5spec:
 6  replicas: 3
 7  selector:
 8    matchLabels:
 9      app: my-app
10  template:
11    metadata:
12      labels:
13        app: my-app
14    spec:
15      containers:
16      - name: app
17        image: nginx:latest
18        resources:
19          requests:
20            memory: "128Mi"
21          limits:
22            memory: "256Mi"

5. Настрой мониторинг памяти

 1apiVersion: v1
 2kind: Pod
 3metadata:
 4  name: my-app
 5spec:
 6  containers:
 7  - name: app
 8    image: nginx:latest
 9    livenessProbe:
10      exec:
11        command:
12        - /bin/sh
13        - -c
14        - 'if [ $(free -m | awk "NR==2{print $3}") -gt 400 ]; then exit 1; fi'
15      initialDelaySeconds: 30
16      periodSeconds: 10

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

 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"

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

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

FAQ

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

О: Мониторь использование памяти в течение времени, добавь 20-30% буфер.

В: Что делать с утечками памяти?

О: Используй профилирование памяти, оптимизируй код, настрой garbage collection.

В: Как избежать OOMKilled в production?

О: Настрой правильные лимиты, используй мониторинг, оптимизируй приложение.

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

  • Устанавливай разумные лимиты ресурсов
  • Мониторь использование памяти
  • Оптимизируй код приложения
  • Используй горизонтальное масштабирование
  • Настрой алерты на критические значения