Самовосстановление: что происходит при падении
Соберём вместе главную идею курса: как именно кластер сам себя чинит на каждом уровне отказа.
Самовосстановление — следствие декларативной модели: кластер непрерывно сравнивает желаемое состояние с фактическим и устраняет любое расхождение.
Мы уже видели кусочки самовосстановления: 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
В основе всего — единый принцип. Контроллеры в цикле выполняют три шага:
- Наблюдай фактическое состояние (сколько подов реально живо).
- Сравни с желаемым (сколько должно быть по манифесту).
- Действуй — устрани разницу (создай/удали поды).
Этот цикл крутится постоянно, поэтому кластер «самозалечивается» от любых расхождений без вашего участия. Вы лишь поддерживаете правильный манифест — остальное делает Kubernetes.
| Что упало | Кто чинит | Как |
| контейнер | kubelet | перезапуск (restartPolicy) |
| под | ReplicaSet | создаёт новый под |
| узел | scheduler + контроллеры | переносит поды на живые узлы |
Итог
- kubelet перезапускает упавший контейнер; частые падения — CrashLoopBackOff.
- ReplicaSet восстанавливает потерянный под, узел — поды переезжают на живые узлы.
- В основе всего — reconciliation loop: наблюдай, сравни, устрани разницу.