Как изменить ресурсы (CPU/RAM) у работающих контейнеров?

«Как изменить ресурсы (CPU/RAM) у работающих контейнеров?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В нативной среде Docker изменить лимиты CPU/RAM для запущенного контейнера без его остановки невозможно. Docker требует пересоздания контейнера с новыми параметрами.

Однако в оркестраторах, таких как Kubernetes, можно обновить конфигурацию ресурсов для рабочих нагрузок (Deployment, StatefulSet), что приведет к плавному редеплою — старые поды будут заменены новыми с новыми лимитами.

Способ 1: Патчинг манифеста Deployment в Kubernetes

# Меняем requests и limits для контейнера 'app' в Deployment 'my-service'
kubectl patch deployment my-service --type='json' -p='[
  {
    "op": "replace",
    "path": "/spec/template/spec/containers/0/resources",
    "value": {
      "requests": { "cpu": "200m", "memory": "256Mi" },
      "limits": { "cpu": "500m", "memory": "512Mi" }
    }
  }
]'

После этой команды Kubernetes запустит новые поды с обновленными ресурсами и постепенно завершит старые, соблюдая стратегию обновления.

Способ 2: Прямое редактирование манифеста

kubectl edit deployment my-service
# В редакторе находим блок `resources`, меняем значения, сохраняем и выходим.

Способ 3: Для standalone Docker-контейнера Единственный вариант — остановить контейнер и запустить заново с флагами --cpus и --memory.

docker stop my_container
docker run -d --name my_container --cpus="1.5" --memory="1g" my_image:latest

Важные ограничения:

  • Уменьшение лимита памяти ниже текущего потребления процесса может привести к немедленному завершению контейнера (OOMKill).
  • Изменение requests в Kubernetes влияет на планирование (scheduling) новых подов, но не на уже работающие.