Самовосстановление: что происходит при падении

Соберём вместе главную идею курса: как именно кластер сам себя чинит на каждом уровне отказа.

Самовосстановление — следствие декларативной модели: кластер непрерывно сравнивает желаемое состояние с фактическим и устраняет любое расхождение.

Мы уже видели кусочки самовосстановления: ReplicaSet возвращает удалённый под, liveness-проба перезапускает зависший контейнер. Теперь сложим картину целиком — что происходит на каждом уровне отказа.

Уровень 1: упал контейнер в поде

Если процесс в контейнере завершился, kubelet перезапускает его согласно restartPolicy (для подов под Deployment это Always). Повторяющиеся падения дают статус CrashLoopBackOff: kubelet перезапускает контейнер со всё большей паузой, чтобы не молотить вхолостую.

kubectl get pods

Вывод:

NAME          READY   STATUS             RESTARTS   AGE
app-7d9f...   0/1     CrashLoopBackOff   5          3m

Это сигнал: приложение стартует и сразу падает — смотрите kubectl logs.

Уровень 2: удалён или потерян под

Под управляет ReplicaSet (через Deployment). Удалили под, он завис без восстановления — контроллер видит, что реплик стало меньше желаемого, и создаёт новый под. Новый под получит новое имя и IP, но Service по меткам тут же подхватит его в балансировку.

Уровень 3: вышел из строя узел

Самый серьёзный случай. Узел перестал отвечать (сеть, питание) — control plane через некоторое время помечает его NotReady. Поды с мёртвого узла пересоздаются на живых узлах: scheduler находит им новое место, kubelet там запускает контейнеры.

kubectl get nodes

Вывод:

NAME       STATUS     ROLES    AGE   VERSION
node-1     Ready      <none>   5d    v1.30.0
node-2     NotReady   <none>   5d    v1.30.0   # ← узел упал

Почему это работает: reconciliation loop

В основе всего — единый принцип. Контроллеры в цикле выполняют три шага:

  1. Наблюдай фактическое состояние (сколько подов реально живо).
  2. Сравни с желаемым (сколько должно быть по манифесту).
  3. Действуй — устрани разницу (создай/удали поды).

Этот цикл крутится постоянно, поэтому кластер «самозалечивается» от любых расхождений без вашего участия. Вы лишь поддерживаете правильный манифест — остальное делает Kubernetes.

Что упалоКто чинитКак
контейнерkubeletперезапуск (restartPolicy)
подReplicaSetсоздаёт новый под
узелscheduler + контроллерыпереносит поды на живые узлы

Итог

  • kubelet перезапускает упавший контейнер; частые падения — CrashLoopBackOff.
  • ReplicaSet восстанавливает потерянный под, узел — поды переезжают на живые узлы.
  • В основе всего — reconciliation loop: наблюдай, сравни, устрани разницу.
Проверьте себя
1. Что означает статус CrashLoopBackOff?
AПод успешно работает
BКонтейнер постоянно падает и перезапускается со всё большей паузой
CУзел вышел из строя
DПод ждёт хранилище
2. Что произойдёт с подами на узле, который стал NotReady?
AОни навсегда останутся недоступными
BОни будут пересозданы на живых узлах
CОни автоматически удалят кластер
DОни продолжат работать на мёртвом узле
3. Какие три шага составляют reconciliation loop?
AСобрать, протестировать, выкатить
BНаблюдать фактическое, сравнить с желаемым, устранить разницу
CСоздать, удалить, забыть
DВойти, выполнить, выйти
Поддержать проект