Приложения: запуск, ресурсы и обновление
Разберись, почему запущенный контейнер ещё не означает готовое приложение. Научись читать причины ожидания, проверять готовность и планировать обновление.
Ещё не начатГде выполнять задания
Готовое упражнение Deployment использует существующий кластер. Обслуживание ноды выполняется только на отдельном стенде; его автоматическая проверка здесь не реализована.
Открыть практикум и терминал ↗Читай урок в этой вкладке, команды выполняй в соседней. Подстановки в угловых скобках сначала замени своими значениями. Ctrl+C останавливает наблюдение или учебный сервер.
Сокращения этого модуля: расшифровки и смысл
- CD
- Continuous Delivery — непрерывная доставка
- CPU
- Central Processing Unit — процессор
- HTTP
- Hypertext Transfer Protocol — протокол передачи веб-данных
- KaaS
- Kubernetes as a Service — Kubernetes как услуга
- OOM
- Out of Memory — нехватка памяти
- PDB
- Pod Disruption Budget — бюджет добровольных нарушений доступности Pod
В командах сохраняется точное написание параметров и имён. В тексте сокращения раскрываются в скобках.
Результат модуля
- Выбрать контроллер для сайта и завершаемой задачи.
- Найти причину Pending и различить готовность и перезапуск.
- Проверить замену копий; обслуживание ноды выполнять на отдельном стенде.
Перед началом: Устройство Kubernetes и безопасная лаборатория.
1. Кто следит за приложением
В первом модуле ты видел, как Deployment возвращает удалённый Pod. Это подходящий способ запускать взаимозаменяемые копии сайта: у каждой копии одинаковая задача, а имя конкретного Pod неважно. Для программы, которая выполняет работу и завершается, нужен Job; для запуска по расписанию — CronJob. DaemonSet поддерживает экземпляры на подходящих нодах. StatefulSet даёт экземплярам устойчивые имена и связь с томами, но сам не делает базу данных отказоустойчивой.
У контейнера есть состояние процесса и отдельно готовность принимать запросы. Readiness probe — проверка готовности: неуспешный результат убирает Pod из готовых адресов Service. Liveness probe — проверка живости: после серии неудач kubelet перезапускает контейнер. Startup probe — проверка первоначального запуска: пока она не завершилась успешно, остальные две проверки не выполняются.
Представь сайт, который загружает данные 40 секунд. Ему нужна поблажка на старт, затем проверка способности отвечать. Недоступность внешней базы данных обычно не исправляется перезапуском всех копий сайта. Поэтому нельзя бездумно использовать одну и ту же проверку для трёх разных задач.
- readinessProbe
- Может ли эта копия прямо сейчас принимать запросы?
- livenessProbe
- Нужен ли перезапуск зависшего процесса?
- startupProbe
- Успела ли программа закончить первоначальный запуск?
- rollout
- Переход от старого шаблона приложения к новому.
По шагам
- Сайт долго загружает данные: startup даёт время закончить запуск.
- Данные загружены: readiness допускает запросы.
- Процесс завис и перестал отвечать: liveness после порога инициирует перезапуск.
2. Почему Pod может ждать
Scheduler — планировщик Kubernetes — выбирает ноду. Он учитывает requests, то есть заявленную потребность в ресурсах, а не только текущую загрузку. Limits ограничивают использование после запуска. CPU (Central Processing Unit — процессор) обычно ограничивается замедлением, а превышение памяти может закончиться OOM (Out of Memory — нехватка памяти) и завершением процесса.
Например, requests.cpu: 100m означает одну десятую вычислительного ядра. requests.memory: 32Mi означает 32 мебибайта; один мебибайт равен 1 048 576 байтам. Если запрошенный объём уже обещан другим Pod, новый останется Pending, даже когда график фактического потребления выглядит низким.
Кроме ресурсов есть правила размещения: nodeSelector выбирает ноды по меткам; affinity задаёт условия соседства и выбора; taint запрещает размещение без подходящего toleration. Toleration снимает конкретный запрет, но не заставляет выбрать эту ноду. Начинай разбор Pending с describe и событий, а не с перезапуска ноды.
По шагам
- Посмотри статус Pod.
- Прочитай Events в describe.
- Найди конкретное условие, которое не выполнено.
- Измени только это условие и дождись Ready.
3. Как проходит обновление
RollingUpdate — постепенная замена копий. maxSurge разрешает временные дополнительные Pod, maxUnavailable ограничивает недоступные копии. Для дополнительных копий нужны свободные ресурсы и квота. Зелёный rollout доказывает прохождение настроенных проверок, но не совместимость новой версии с данными.
PDB (Pod Disruption Budget — бюджет добровольных нарушений доступности Pod) ограничивает удаления через механизм eviction, например при drain — выводе ноды на обслуживание. Он не предотвращает поломку сервера. При двух копиях minAvailable: 1 позволяет добровольно убрать одну готовую копию; если готова только одна, удаление может блокироваться.
В общей лаборатории не выполняй drain существующих нод. Сначала научись обновлять только своё приложение. Эксперимент с обслуживанием ноды перенеси на отдельный стенд из инструкции ниже: там можно честно проверить отказ и возвращение ноды, не затронув Argo CD (Continuous Delivery — непрерывная доставка) и другие приложения.
4. Что происходит при остановке
При завершении Pod приложение получает сигнал остановки и должно завершить текущую работу за terminationGracePeriodSeconds. Если времени не хватит, процесс будет принудительно остановлен. Длинный запрос и фоновая задача требуют продуманного завершения: просто добавить sleep недостаточно.
Для KaaS (Kubernetes as a Service — Kubernetes как услуга) обслуживание ноды — часть продукта. Пользователь должен видеть, почему обновление остановлено: недостаточно места, нездоровые копии или бюджет запрещает удаление. Бесконечно ждать и показывать «всё хорошо» нельзя.
Сохраняй три вида доказательств: события объясняют решение Kubernetes; статусы показывают состояние объектов; реальные запросы показывают доступность приложения. Они отвечают на разные вопросы. Одна строка Running ещё не подтверждает, что сайт работал всё время обновления.
Практика через терминал портала
Открой готовое упражнение
Открой практикум Deployment в соседней вкладке. Если первый модуль уже зачтён, используй его наблюдения; повторная подготовка создаёт новое упражнение и сбрасывает его рабочее состояние.
kubectl -n interview-lab get deployment,pods,service kubectl -n interview-lab get resourcequotaЧто должно получиться. В подготовленном упражнении виден portal-demo. Все изменения этой части ограничены interview-lab.
Если результат отличается
Если пространство пустое, нажми «Подготовить». Не создавай объекты в default.
Разбери настройки контейнера
Прочитай шаблон Deployment. Найди requests, limits и readinessProbe. В исходном portal-demo отдельная livenessProbe не задана: отсутствие проверки тоже важно заметить. Сравни с описанием трёх видов проверок в теории.
kubectl -n interview-lab get deployment portal-demo -o yaml kubectl -n interview-lab describe deployment portal-demoЧто должно получиться. Ты можешь показать конкретные поля, а не только пересказать названия проверок.
Если результат отличается
Не меняй весь объект через случайный пример из интернета: у стенда есть обязательные ограничения безопасности и квоты.
Исправь приложение и получи зачёт
Выполни шаги первого модуля: две реплики, правильный selector Service и замена одного Pod. Нажми «Проверить результат» до следующих экспериментов.
kubectl -n interview-lab scale deployment portal-demo --replicas=2 kubectl -n interview-lab patch service portal-demo -p '{"spec":{"selector":{"app":"portal-demo"}}}' kubectl -n interview-lab rollout status deployment/portal-demo --timeout=90sЧто должно получиться. Две готовые реплики и успешная серверная проверка. История зачёта сохраняется отдельно от галочек урока.
Если результат отличается
Если quota запрещает третью копию при обновлении, сначала посмотри стратегию и текущие Pod; не увеличивай общую квоту.
Увидь конкретную причину Pending
После зачёта временно задай в шаблоне заведомо отсутствующую метку ноды. Старые готовые копии не удаляй. Смотри события нового ожидающего Pod.
kubectl -n interview-lab patch deployment portal-demo -p '{"spec":{"template":{"spec":{"nodeSelector":{"course.example/missing":"yes"}}}}}' kubectl -n interview-lab get pods kubectl -n interview-lab get events --sort-by=.metadata.creationTimestampЧто должно получиться. Событие FailedScheduling объясняет несовпадение метки. Если сначала мешает квота, запиши и эту причину: это отдельное ограничение.
Если результат отличается
Не исправляй это добавлением метки общей ноде. Следующий шаг убирает только учебное ограничение.
Верни размещение и попробуй обновление
Удали только добавленную метку из шаблона, затем инициируй замену копий. Это упражнение меняет шаблон, но не версию программы. После замены сравни имена и возраст Pod в том же терминале.
kubectl -n interview-lab patch deployment portal-demo --type=json -p '[{"op":"remove","path":"/spec/template/spec/nodeSelector/course.example~1missing"}]' kubectl -n interview-lab rollout status deployment/portal-demo --timeout=90s kubectl -n interview-lab rollout restart deployment/portal-demo kubectl -n interview-lab rollout status deployment/portal-demo --timeout=90s kubectl -n interview-lab get pods -o wideЧто должно получиться. Новые Pod готовы; rollout завершён. Отличай замену Pod от выпуска нового образа.
Если результат отличается
Если операция зависла, проверь Events, Ready и resourcequota. Не удаляй все копии одновременно.
Сравни готовность и перезапуск
Для наглядного разбора разных проверок используй следующий практикум «Диагностика» после зачёта сетевого задания. В нём неправильный путь readiness исправляется отдельно от ошибок образа и конфигурации.
kubectl -n interview-lab get pods kubectl -n interview-lab get events --sort-by=.metadata.creationTimestampЧто должно получиться. В журнале есть сравнение: потеря Ready и увеличение RESTARTS — разные события. Не отмечай проверку probes до выполнения практики.
Если результат отличается
Практикумы последовательные. Заверши и очисти текущее упражнение перед следующим.
Проверь обслуживание на отдельном стенде
Открой инструкцию отдельного стенда. Только после проверки контекста kind-kaas-lab создай две реплики из demo.yaml и бюджет minAvailable: 1. На нём можно выполнять drain; на портальном кластере этот шаг не выполняется.
kubectl --context kind-kaas-lab -n kaas-lab apply -f https://test.igorhome.ru/static/learning/demo.yaml kubectl --context kind-kaas-lab -n kaas-lab create poddisruptionbudget demo --selector=app=demo --min-available=1 kubectl --context kind-kaas-lab -n kaas-lab get pdb kubectl --context kind-kaas-lab drain kaas-lab-worker --ignore-daemonsets --delete-emptydir-data --timeout=120s kubectl --context kind-kaas-lab uncordon kaas-lab-workerЧто должно получиться. В журнале записано, разрешил ли бюджет удаление и хватило ли второй ноде ресурсов. Команда удаляет временные emptyDir-данные только учебного стенда.
Если результат отличается
При блокировке сначала проверь доступные реплики и свободное место. Не используй --disable-eviction для обхода бюджета.
Заверши и сохрани выводы
Верни ноды отдельного стенда в доступное состояние. На портале очисти упражнение штатной кнопкой. Запиши причину Pending и порядок действий при заблокированном обслуживании.
kubectl --context kind-kaas-lab get nodesЧто должно получиться. Учебные ноды Ready, SchedulingDisabled отсутствует. Есть собственное объяснение, почему бюджет не защищает от аварии сервера.
Если результат отличается
Если отдельный стенд ещё не создан, оставь критерий обслуживания неотмеченным. Теорию и доступную практику можно пройти раньше.
Открыть терминал ↗ · Скачать файлы лаборатории →
Файлы и подготовка к этой работе
Критерии готовности
Отмечай только то, что проверил на указанном стенде. Эти галочки сохраняются в браузере. Для готовых упражнений зачёт выдаёт отдельная серверная проверка практикума; остальные задания подтверждай журналом и доказательствами. Учебная модель не заменяет реальный облачный опыт.
Что сохранить в портфолио
- Журнал: исходное состояние → команда или действие → ожидаемый результат → фактическое наблюдение.
- Доказательства по критериям ниже: очищенный от секретов вывод, схема или ссылка на проверенный коммит.
- Отдельный список: что пока не запускалось, почему и какой стенд нужен для продолжения.
Проверь понимание
8 вопросов по этому модулю. Проходной результат — 7 из 8. После ответа — объяснения и ссылки на разделы, к которым стоит вернуться.
Пройти тест модуляОфициальные источники
Чек-листы уроков, заметки к ним и результаты тестов хранятся в этом браузере; для переноса используй экспорт. Автоматические проверки и журнал практикума сохраняются отдельно на сервере.