Что поставляют вместе с контейнером?
Заказчик получил образ и ожидает готовый сервис. Начните с границ поставки: процесс, его права, ресурсы узла и данные. Это четыре разных вопроса для приёмки.
Контейнер — управляемое окружение приложения, образ — его исходное содержимое. Среда выполнения создаёт окружение и запускает процесс. Наличие файла образа или идентификатора экземпляра ещё не означает, что приложение работает.
Пространства имён Linux разделяют видимость процессов, сети и подключённых файловых систем. Cgroup отдельно учитывает и ограничивает ресурсы. Если контейнер не видит соседей, это ещё не защищает общую память от исчерпания.
Обычные контейнеры Linux используют ядро узла. Список полномочий, доступ к устройствам и каталогам определяют границу изоляции. Корневая файловая система только для чтения не запрещает запись в отдельно подключённый каталог, если его режим подключения и права процесса её разрешают.
Данные подключённого хранилища имеют отдельный жизненный цикл. Удаление экземпляра не делает резервную копию и не задаёт сохранность файлов, которые приложение меняло внутри него. Эти условия включают в состав поставки отдельно.
Какой образ действительно запускается?
Дилер меняет архитектуру серверов, а поставщик обещает «тот же контейнер». Проверьте, какой платформенный вариант скрывается за общим именем и из каких файлов он собран.
Манифест OCI связывает конфигурацию и упорядоченные слои. Слой хранит изменения файлов, конфигурация — сведения о платформе и настройки запуска. Проверка одного слоя не заменяет проверку образа целиком.
Индекс может объединять разные манифесты для amd64 и arm64. Общая метка не доказывает наличие нужного варианта. До замены архитектуры серверов проверьте платформу образа и работоспособность приложения на ней.
Дайджест индекса закрепляет набор платформенных манифестов, дайджест манифеста — один вариант. Оба фиксируют содержимое, но на разных уровнях. Дайджест слоя нельзя подставить вместо дайджеста готового образа.
Удаление секрета в верхнем слое скрывает путь, но не очищает нижний. Проверяйте все сохраняемые слои. Если образ уже передали тем, кто не должен знать секрет, одной пересборки мало: раскрывшиеся учётные данные нужно отозвать и заменить.
OCI описывает форматы и запуск; это не оркестратор. Заявление о поддержке OCI не выбирает число копий, узел размещения и правила изоляции за заказчика.
Сможет ли запасной сервер получить принятую сборку?
На старом узле приложение работает, но узел замены не может получить образ. Здесь нужно разделить имя выпуска, содержимое, доступ к реестру и происхождение сборки.
Метка, даже похожая на номер версии, может быть переназначена. Дайджест закрепляет точный объект. В принятом выпуске сохраняют и читаемую метку, и дайджест, а также ожидаемую аппаратную платформу.
Реестр распространяет содержимое, узел может хранить его в кэше. При IfNotPresent старый узел использует сохранённый образ, но новый зависит от реестра. При Always и ссылке с меткой узел обращается к реестру, чтобы определить соответствующий ей дайджест; уже сохранённые слои можно использовать повторно.
Дайджест не хранит образ. Если объекты удалены, одна ссылка не позволит запустить замену. Срок хранения текущего и откатного выпусков должен покрывать принятый план восстановления.
Успешная загрузка подтверждает доступ к реестру, а не доверие приложению. Сведения о происхождении связывают дайджест результата со сборкой. Проверьте подлинность заявления, ожидаемые исходники и сборщика: подписанный результат может не соответствовать правилам заказчика.
Где заканчивается кластер и начинается приложение?
Заказ содержит три сервера Kubernetes. Это ещё не ответ на вопрос, сколько копий приложения переживёт отказ. Проследите работу от управляющих компонентов до конкретного Pod.
Управляющие компоненты хранят состояние и принимают решения, а службы узлов запускают назначенные Pod. Доступный API и работающая пользовательская операция проверяют разные части системы.
Планировщик выбирает узел, kubelet и среда выполнения запускают контейнеры. Успешное назначение ещё не проверяет получение образа и готовность приложения. Ошибку после назначения нужно искать на соответствующем этапе.
Контейнеры одного Pod размещаются вместе и разделяют сеть. Два контейнера внутри Pod не дают независимых копий сервиса. Для резервирования нужны отдельные Pod и проверка распределения по узлам.
Несколько узлов сами по себе не обеспечивают доступность приложения. Проверьте размещение копий и общие зависимости. Метки зон помогают планировщику, но не доказывают независимость физических вводов питания и сети.
Почему удалённый Pod появился снова?
Инженер удаляет экземпляр, чтобы уменьшить нагрузку, а контроллер создаёт замену. Найдите объект, который задаёт цель: исправление должно менять намерение системы.
Целевое состояние хранит требуемый результат, цикл согласования поддерживает его повторными действиями. Принятая спецификация не означает готовность: ресурсов или подходящего размещения может не хватать.
Deployment управляет ReplicaSet, а ReplicaSet — Pod. При неизменном целевом числе контроллер стремится создать новый Pod взамен удалённого. Для постоянного уменьшения числа экземпляров меняют цель Deployment.
Проверьте владельцев и селекторы. Несогласованные управляющие объекты с пересекающимися селекторами могут одновременно управлять одними и теми же Pod и перебивать решения друг друга. Ручная правка производного объекта не исправляет конфликт целей.
Если Pod не помещается ни на одном узле, повторная отправка того же описания не создаёт ресурсы. Отделите временный сбой от постоянного ограничения и измените именно его.
Сколько CPU и памяти нужно заказать?
Приложение просит 1 CPU и 2 ГиБ на экземпляр, но лимиты выше. Перенесите эти числа в расчёт узлов, сохранив различие между запросом, фактическим расходом и пределом выполнения.
Request участвует в размещении, limit ограничивает выполнение, потребление измеряют под нагрузкой. Запрос не является жёстким потолком; лимиты сами по себе не подтверждают, что узел выдержит одновременный пик всех контейнеров.
500m CPU — половина единицы CPU Kubernetes, не 500 МГц. В памяти 1Gi и 1G означают разные числа байтов. При расчёте по контейнерным requests складывайте запросы одновременно работающих контейнеров. Если посчитать только приложение и забыть постоянно работающий прокси или сборщик журналов, требования Pod будут занижены.
Вспомогательный контейнер в initContainers с restartPolicy=Always продолжает работать вместе с приложением: его запрос входит в общую сумму. На каждом шаге подготовки учитывают также уже запущенные вспомогательные контейнеры. Для каждого ресурса берут большее из пика подготовки и суммы длительной работы. Ресурсы уровня Pod и накладные расходы проверяют отдельно.
В Linux запрос CPU также влияет на относительный вес контейнера при конкуренции за процессор. Это не закрепление отдельного ядра. Снижая request ради плотности размещения, учитывайте и распределение процессорного времени под нагрузкой.
После исчерпания квоты CPU процессы контейнера обычно ждут нового бюджета времени. При нехватке памяти ядро может завершить процесс. Дополнительные физические CPU прежний лимит не отменяют. При замедлении проверьте ожидание квоты, при завершении — события OOM и политику перезапуска.
Для приложений используют Node Allocatable после системных резервов, а не всю установленную память. Проверьте requests в самом объекте, а не только в исходном файле: при заданном limit и отсутствии запроса Kubernetes может подставить его из лимита.
Хватит ли кластера после отказа узла?
Учебная нагрузка: шесть Pod по 1 CPU и 2 ГиБ, без init-контейнеров, ресурсов уровня Pod и дополнительных накладных расходов. Три узла предоставляют приложениям по 4 CPU и 8 ГиБ. Нужно сохранить все шесть экземпляров после потери одного узла.
Шесть экземпляров требуют 6 CPU и 12 ГиБ. После отказа останутся 8 CPU и 16 ГиБ Node Allocatable. По три таких Pod помещаются на каждом из двух узлов: 3 CPU и 6 ГиБ. Это проверка запросов при отсутствии иных нагрузок, а не доказательство производительности на пике.
Всегда проверяйте размещение по узлам. Если на двух подходящих узлах осталось по 3 ГиБ для новых запросов, один Pod с запросом 4 ГиБ не поместится ни на одном. Общий свободный объём кластера не устраняет эту нехватку.
Жёсткое правило распределения может запретить использование свободного узла. Если допустимого узла нет, Pod остаётся без назначения. Мягкое правило даёт предпочтение, но допускает иной результат. Проверьте поведение после отказа вместе с метками размещения и физической независимостью узлов.
Потерянный Pod не мигрирует с прежним UID. Для управляемой нагрузки контроллер может создать новый Pod; он не наследует память старого процесса. Для временных данных старого Pod также нельзя предполагать автоматический перенос на другой узел.
Pending бывает и до назначения узла, и после него. Сначала проверьте, назначен ли узел, затем события и состояния контейнеров. Наращивание CPU не исправит ошибку получения образа у уже назначенного Pod.
DNS отвечает. Почему приложение недоступно?
Проверка имени прошла, адрес Service есть, но клиент получает ошибку. Идите по пути запроса: выбор экземпляров, порт назначения, готовность и работа приложения.
Обычный ClusterIP Service даёт стабильный адрес, но не создаёт Pod. Имя DNS и адрес могут существовать при нуле готовых экземпляров. Проверка разрешения имени не заменяет проверку адресов приложения за службой.
Селектор выбирает Pod по меткам. Сопоставьте его с нужным приложением: ошибка может дать пустой набор или выбрать чужие экземпляры. Затем проверьте port и targetPort: при 80 и 8080 приложение должно слушать на стороне назначения порт 8080.
У одного Service может быть несколько EndpointSlice, например для разных семейств IP или наборов портов. Проверяйте все срезы службы: один объект может показывать только часть адресов, а число срезов не равно числу экземпляров приложения.
Когда readiness достигнет порога неудач, адрес может остаться в EndpointSlice со значением ready=false. Наличие адреса ещё не означает, что Service выбирает его для обычного трафика. Если включён publishNotReadyAddresses, служба допускает и неготовые адреса: это отдельная настройка доступа.
Running описывает состояние Pod и контейнеров, а не успешность операции пользователя. Даже готовность проверяет только выбранные условия. Завершите приёмку контрольной операцией приложения, а не чтением одного состояния Kubernetes.
При clusterIP=None виртуального адреса ClusterIP нет. Для такой службы используйте модель отдельных адресов приложения: ожидание общего виртуального адреса даст неверный диагноз.
Когда убрать трафик, а когда перезапустить?
У каждой пробы должно быть нужное действие. Медленный ответ, долгий запуск и зависший процесс — разные ситуации; одна проверка внешней базы на все случаи способна усилить отказ.
Readiness меняет готовность к трафику и сама не перезапускает контейнер. После восстановления она может вернуть его в готовность без нового процесса. Проверка необязательной общей зависимости рискует одновременно убрать из трафика все копии.
Liveness после порога неудач заставляет kubelet завершить контейнер; следующий запуск зависит от политики перезапуска. Применяйте её там, где новый процесс способен устранить неисправность. Недоступная общая база данных от такого действия не восстановится.
При перегрузке короткий таймаут liveness способен принять медленный процесс за неисправный. Перезапуски сокращают работающую мощность, увеличивают нагрузку на оставшихся и запускают каскад. До закупки серверов проверьте смысл пробы и пороги.
Startup блокирует readiness и liveness до первого успеха. При failureThreshold=30 и periodSeconds=10 расчётный бюджет — около 300 секунд, а не точный таймер завершения. Успех через 20 секунд снимает блокировку остальных проб, не дожидаясь остатка этого бюджета.
Успех startup завершает начальную проверку, а после перезапуска контейнера она выполняется заново. Дальнейшую готовность и работоспособность проверяют readiness и liveness, если они настроены. Отсутствующую проверку приложения Kubernetes не придумывает; Running или успех liveness не подтверждает нужную пользовательскую операцию.
Сколько места понадобится во время обновления?
У сервиса три копии. В плане выпуска стоят maxSurge=25% и maxUnavailable=25%. Переведите проценты в экземпляры и проверьте, где новая копия сможет запуститься до вывода старой.
Параметр maxSurge допускает дополнительные копии, maxUnavailable — сокращение числа доступных копий. Проценты округляют соответственно вверх и вниз. Для трёх копий и обоих значений 25% получится одна дополнительная и ноль недоступных. Новая копия должна поместиться до сокращения доступного числа старых; иначе обновление может остановиться.
Расчёт «три плюс одна» не является потолком фактического расхода ресурсов. Завершающиеся Pod могут ещё потреблять CPU и память после начала замены. Проверьте время завершения процессов и запас на этот переход.
Нельзя одновременно задать maxSurge=0 и maxUnavailable=0. Для замены нужна либо временная дополнительная копия, либо разрешённое сокращение доступного числа. Выбор сверяют с вместимостью узлов и требуемой мощностью приложения.
Readiness и minReadySeconds определяют разные условия. При положительном minReadySeconds новый Pod должен оставаться готовым без сбоев контейнеров заданное время, чтобы считаться доступным. Один быстрый успех пробы не доказывает выполнение этого периода.
Старые и новые копии могут работать одновременно. Проверьте совместимость обращений к общим данным, завершение текущих запросов и достаточность готовой мощности. Успешный RollingUpdate сам по себе не доказывает отсутствие простоя.
Что вернётся при откате, а что останется новым?
Новая версия не прошла приёмку. Предыдущий образ известен, но этого мало: история, конфигурация и данные могли измениться независимо друг от друга.
Истечение progressDeadlineSeconds отмечает недостаточный ход обновления и само не запускает откат. В плане выпуска заранее определяют ответственного и действие по этому сигналу; ожидание не возвращает старую версию автоматически.
История хранится в ReplicaSet. Параметр revisionHistoryLimit задаёт число старых ReplicaSet, а не дни хранения. Проверьте наличие нужной ревизии и образов: частые выпуски могут вытеснить историю, а дайджест не удерживает содержимое в реестре.
Откат Deployment возвращает шаблон Pod. Он не восстанавливает внешнюю базу и отдельно изменённую конфигурацию. До выпуска проверьте, сможет ли старое приложение работать с данными после новой версии и какой порядок восстановления принят.
ConfigMap в переменных окружения не обновляет уже работающий процесс автоматически. Предусмотрите замену Pod и проверку значений. При передаче через том обновление может прийти с задержкой; подключение через subPath таких обновлений не получает.
Один неизменный дайджест не фиксирует всю систему: конфигурация, секреты, данные и внешние службы живут отдельно. Для принятого выпуска нужен согласованный набор этих условий, иначе прежний образ может дать другой результат.
Как превратить кластер в проверяемую поставку?
Соберите итог для заказчика: комплект поставки и программа испытаний сервиса из шести копий на трёх узлах. Успех каждого испытания должен отвечать на конкретный вопрос, а оставшееся ограничение — быть записано.
Поставка образа: зафиксируйте платформенный вариант, дайджест и проверенное происхождение. Испытайте получение принятого и откатного выпусков на узле без кэша. Работа старого узла не подтверждает восстановимость через реестр.
Ресурсы и отказ: рассчитайте requests по подходящим узлам и после потери одного из них. Затем измерьте приложение под нагрузкой. Размещение по запросам не доказывает время ответа, а общий запас кластера не гарантирует место для конкретного Pod.
Доступность: проверьте выбранные адреса, готовность, поведение проб и результат операции клиента. При отказе узла подтвердите создание нового Pod и отдельно — доступность данных. Один статус Running не закрывает эти проверки.
Выпуск и возврат: учтите дополнительную копию, завершающиеся Pod, совместимость двух версий и границу отката. Приёмка должна проверить переход в обе стороны, включая конфигурацию и данные, которых один откат шаблона не восстанавливает.
Проверьте инженерное мышление
Вопросы проверяют не память на аббревиатуры, а умение не делать лишних выводов.
Источники курса
Ссылки приведены один раз для всего курса, чтобы не мешать чтению каждого тезиса.
- Первичная спецификация
Open Container Initiative Runtime Specification
Open Container Initiative · OCI Runtime Specification, November 2025
Определяет подготовленный пакет контейнера, config.json, окружение процесса и операции жизненного цикла.
Открыть первоисточник - Первичная спецификация
Open Container Initiative Image Format Specification
Open Container Initiative · OCI Image Specification, November 2025
Определяет манифест, индекс, конфигурацию и слои образа, а также дескрипторы объектов с адресацией по содержимому.
Открыть первоисточник - Официальная документация
namespaces(7) — Linux manual page
Linux man-pages project · Linux man-pages 6.18
Описывает отдельные представления системных ресурсов в пространствах имён Linux и перечисляет изолируемые классы объектов.
Открыть первоисточник - Официальная документация
Guide to Security for Full Virtualization Technologies
National Institute of Standards and Technology · NIST SP 800-125, final от января 2011 года
Определяет full virtualization, VM/guest, hypervisor, bare-metal и hosted architectures, snapshot и isolation boundary.
Открыть первоисточник - Официальная документация
Control Group v2
The Linux Kernel documentation · Linux kernel latest documentation
Описывает иерархическое распределение ресурсов, контроллеры, ограничения, учёт потребления и пространство имён cgroup.
Открыть первоисточник - Официальная документация
Backup — CSRC Glossary
National Institute of Standards and Technology · CSRC glossary по NIST SP 800-34 Rev. 1, проверено 29 августа 2026 года
Определяет backup как копию files и programs, созданную для recovery.
Открыть первоисточник - Официальная документация
Security Guidelines for Storage Infrastructure
National Institute of Standards and Technology · NIST SP 800-209, October 2020
Разделяет backup, replication, immutability, continuous data protection и point-in-time copies; описывает synchronous и asynchronous replication.
Открыть первоисточник - Официальная документация
Removing sensitive data from a repository
GitHub · справка GitHub Docs, страница открыта 6 сентября 2026 года
Открыт редактором 6 сентября 2026 года, заголовок документа сверен. Описывает отзыв или замену раскрытых учётных данных и границы удаления секретов из истории Git. Связь с образами OCI — отдельный редакторский вывод.
Открыть первоисточник - Официальная документация
Rotate AWS Secrets Manager secrets
Amazon Web Services · AWS Secrets Manager User Guide, проверено 30 августа 2026 года
Определяет rotation как согласованное обновление secret value и credentials в database или target service.
Открыть первоисточник - Официальная документация
Lease, renew, and revoke
HashiCorp · Vault documentation, проверено 30 августа 2026 года
Разделяет TTL, renewal, expiration и immediate revocation для leased dynamic credentials.
Открыть первоисточник - Официальная документация
Kubernetes Components
Kubernetes · Kubernetes current documentation
Описывает управляющие компоненты, узлы, сервер API, планировщик, контроллеры, kubelet и среду выполнения контейнеров.
Открыть первоисточник - Официальная документация
Images
Kubernetes · Kubernetes current documentation
Различает имена образов, изменяемые метки и дайджесты. Описывает политику загрузки и выбор содержимого при запуске.
Открыть первоисточник - Первичная спецификация
Open Container Initiative Distribution Specification
Open Container Initiative · OCI Distribution Specification v1.1.1, страница спецификации открыта 6 сентября 2026 года
Открыт редактором 6 сентября 2026 года, заголовок и версия документа сверены. Распространение манифестов и объектов по содержимому; метки репозитория.
Открыть первоисточник - Первичная спецификация
SLSA Build Track v1.2
Supply-chain Levels for Software Artifacts · SLSA specification v1.2
Определяет уровни SLSA Build, требования к подлинности сведений о происхождении и защите сборочной платформы.
Открыть первоисточник - Официальная документация
Kubernetes Scheduler
Kubernetes · Kubernetes current documentation
Описывает отбор допустимых узлов, оценку вариантов и назначение узла для ещё не размещённого Pod.
Открыть первоисточник - Официальная документация
Liveness, Readiness, and Startup Probes
Kubernetes · Kubernetes current documentation
Разделяет проверки готовности, работоспособности и запуска. Объясняет их действия и риск каскадного отказа при неверной настройке.
Открыть первоисточник - Официальная документация
Pods
Kubernetes · Kubernetes current documentation
Определяет Pod как минимальную единицу размещения с контейнерами на одном узле, общей сетью и возможностью подключать общие тома.
Открыть первоисточник - Официальная документация
Pod Topology Spread Constraints
Kubernetes · документация Kubernetes v1.37, страница открыта 6 сентября 2026 года
Открыт редактором 6 сентября 2026 года, заголовок и версия документа сверены. Распределение Pod по меткам узлов и доменам отказа; жёсткое и мягкое требование.
Открыть первоисточник - Официальная документация
Controllers
Kubernetes · Kubernetes current documentation
Определяет управляющий цикл, целевое состояние и повторяющееся согласование наблюдаемого состояния с заданным.
Открыть первоисточник - Официальная документация
Pod Lifecycle
Kubernetes · Kubernetes current documentation
Описывает назначение узла, состояния Pod и контейнеров, перезапуски контейнеров и создание нового Pod с другим UID взамен прежнего.
Открыть первоисточник - Официальная документация
Deployments
Kubernetes · Kubernetes current documentation
Описывает управление ReplicaSet, стратегии обновления, параметры maxUnavailable и maxSurge, ход выпуска и историю для отката.
Открыть первоисточник - Официальная документация
Resource Management for Pods and Containers
Kubernetes · Kubernetes current documentation
Разделяет запросы и ограничения CPU и памяти: их учёт при размещении, распределение процессорного времени и применение пределов на узле.
Открыть первоисточник - Официальная документация
Sidecar Containers
Kubernetes · документация Kubernetes v1.37, страница открыта 6 сентября 2026 года
Открыт редактором 6 сентября 2026 года, заголовок документа сверен. Вспомогательные контейнеры в initContainers с restartPolicy=Always, совместная работа и учёт запросов ресурсов при инициализации и работе приложения.
Открыть первоисточник - Официальная документация
Reserve Compute Resources for System Daemons
Kubernetes · документация Kubernetes v1.37, страница открыта 6 сентября 2026 года
Открыт редактором 6 сентября 2026 года, заголовок и версия документа сверены. Node Allocatable: ресурсы для Pod после резервов системных служб и порогов вытеснения.
Открыть первоисточник - Официальная документация
Failover Clustering topologies
Microsoft · Microsoft Learn для Windows Server 2016–2025, проверено 29 августа 2026 года
Определяет fault domains и показывает границу single-rack HA, stretch cluster и multi-site DR.
Открыть первоисточник - Официальная документация
Service
Kubernetes · Kubernetes current documentation
Описывает сетевой доступ через Service к меняющемуся набору экземпляров приложения и связанные EndpointSlice.
Открыть первоисточник - Официальная документация
EndpointSlices
Kubernetes · документация Kubernetes v1.37, страница открыта 6 сентября 2026 года
Открыт редактором 6 сентября 2026 года, заголовок и версия документа сверены. Адреса и условия ready/serving/terminating; несколько срезов одной службы.
Открыть первоисточник - Официальная документация
Configure Liveness, Readiness and Startup Probes
Kubernetes · документация Kubernetes v1.37, страница открыта 6 сентября 2026 года
Открыт редактором 6 сентября 2026 года, заголовок и версия документа сверены. Пороги последовательных неудач, интервалы, таймауты и расчёт бюджета запуска.
Открыть первоисточник - Официальная документация
ConfigMaps
Kubernetes · документация Kubernetes v1.37, страница открыта 6 сентября 2026 года
Открыт редактором 6 сентября 2026 года, заголовок и версия документа сверены. Внешняя конфигурация; различия переменных окружения, томов и подключений subPath.
Открыть первоисточник