Как перезапустить pod без удаления Deployment?

Ниже — полное руководство по способам перезапустить Pod, не удаляя Deployment, с примерами команд и пояснениями, что делает каждый метод и когда его лучше использовать.

Быстрый и рекомендуемый способ

kubectl rollout restart deployment/<deployment-name> -n <namespace>

Что делает: обновляет аннотацию в spec.template.metadata, что воспринимается как изменение PodTemplate — Kubernetes создаёт новые ReplicaSet/Pods и последовательно заменяет старые в соответствии со стратегией развёртывания (rolling update). Безопасно для production, если у вас корректно настроены readinessProbe, maxUnavailable/maxSurge.

Через патч (аналогично предыдущему, вручную меняем шаблон Pod)

# Bash — добавляет метку с текущим временем в шаблон Pod

kubectl patch deployment my-deploy -n production \\
\-p "{\\"spec\\":{\\"template\\":{\\"metadata\\":{\\"annotations\\":{\\"restartedAt\\":\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\"}}}}}" --type=merge

Когда полезно: если нужен более тонкий контроль, или kubectl rollout restart недоступен. Результат тот же — изменение шаблона запускает обновление.

Масштабирование «вручную» (scale down → scale up)

# Узнать текущие реплики

kubectl get deployment my-deploy -n production -o jsonpath='{.spec.replicas}'

# Сохранив число, уменьшить/увеличить:

kubectl scale deployment my-deploy -n production --replicas=0

# затем вернуть предыдущее значение, например 3

kubectl scale deployment my-deploy -n production --replicas=3

Минусы/плюсы: простой метод, но при уменьшении до 0 вы вызовете простой сервиса. Подходит для не-критичных окружений или когда хотите полностью перезапустить все Pod.

Удаление конкретного Pod (контроллер сам создаст новый)

kubectl delete pod <pod-name> -n <namespace>

Что происходит: Deployment (ReplicaSet) заметит недостачу реплик и создаст новый Pod с тем же шаблоном. Можно удалять отдельные Pod для быстрого «перезапуска» одного инстанса. Не удаляйте все Pod одновременно, если это приведёт к простою.

Дополнительно: удалить по меткам (несколько Pod):

kubectl delete pods -l app=myapp -n production

Осторожно: удаление всех Pod одним махом может привести к потере доступности.

Агрессивное принудительное завершение (обычно не нужно)

kubectl delete pod <pod-name> --grace-period=0 --force -n <namespace>

Использовать только если Pod “завис” и не завершается корректно. Это убирает корректную остановку (postStop и т.д.), может привести к потерям данных.

Проверка статуса обновления и отладки

kubectl rollout status deployment/my-deploy -n production
kubectl rollout history deployment/my-deploy -n production
kubectl get pods -n production -l app=myapp
kubectl get pods -n production -w -l app=myapp # следить в реальном времени
kubectl describe pod <pod-name> -n production # увидеть события и причины рестартов

Важные замечания

  • Большинство способов просто изменяют шаблон Pod или удаляют существующий Pod; Deployment/ReplicaSet затем создает новый Pod по шаблону.

  • kubectl rollout restart аккуратно уважает стратегию развёртывания (не убьёт все Pod сразу при правильной конфигурации).

  • Перед перезапуском убедитесь, что у вас настроены readinessProbe и livenessProbe, чтобы новые pod не попадали в трафик до готовности.

  • Если приложение пишет состояние локально, перезапуск может привести к потере данных — учитывайте состояние при выборе метода.

  • Если операция «застряла», посмотрите kubectl describe deployment и kubectl describe rs, а также логи проблемных Pod.

Полезные команды для быстрого выполнения

kubectl rollout restart deployment/my-deploy -n production
kubectl rollout status deployment/my-deploy -n production
kubectl delete pod my-deploy-abcdef123 -n production
kubectl get pods -n production -l app=myapp -o wide