Уложите обновление в квоту

KubernetesBeginner
Практиковаться сейчас

Введение

Aster Supply показывает обычный каталог, а зимнее обновление заблокировано. В пространстве имён достаточно запрошенного CPU для обычной работы, но не для дополнительного Pod, который запрашивается при постепенном обновлении. Вы выберете параметры развёртывания, укладывающиеся в фиксированное выделение ресурсов, сохраните работу эталонного магазина и передадите обновлённый каталог.

Вы уже должны знать базовые пути терминала, простой YAML, Pod, Deployment, Service и метки. Эта работа объясняет единицы запросов CPU, ResourceQuota и расчёт бюджета обновления. Настоящий одноузловой кластер, приложение, проверки здоровья и данные каталога подготовлены; установка кластера, сборка образа и программирование приложения не требуются. Оценка времени включает чтение и обычные ошибки; это авторская оценка.

Уложите обновление в фиксированный бюджет

На этом шаге вы завершите обновление зимнего каталога Aster Supply, не увеличивая выделение CPU и не останавливая эталонный магазин.

Вкладка Shop показывает работающий каталог. Откройте Stoneware tray, запомните цену и вернитесь через Back to collection. Текущая коллекция Everyday essentials содержит три товара; требуемая The winter edit добавляет Amber cup и меняет цены. Откройте вкладку Reference: Fern Stationery — отдельный защищённый сервис, который должен сохранить существующий каталог. Оставьте его Deployment, Service и исходный Pod без изменений. Затем переключитесь на вкладку Workspace.

Подготовленный кластер — настоящий одноузловой Kubernetes. Пространство имён объединяет ресурсы этого курса. ResourceQuota ограничивает суммарные ресурсы, допускаемые в этом пространстве имён. Здесь учитываются только запросы CPU: CPU, резервируемый для планирования, а не денежный бюджет и не предел измеренного потребления CPU. 1000m означает одно ядро CPU; 40m — 0.04 ядра. Память подготовлена и не является узким местом квоты в этом задании.

Сначала прочитайте квоту. --context=labex-v135 выбирает подготовленный кластер, -n shop-quota — пространство имён курса, а describe показывает сведения об объекте:

kubectl --context=labex-v135 -n shop-quota describe resourcequota shop-budget

Ожидается requests.cpu со значениями Used 140m и Hard 140m. Это зарезервированный CPU, а не текущее использование. Исходный магазин всё ещё доступен, но для попытки обновления нужен ещё один Pod. Доступная реплика прошла проверку готовности и подготовленный минимальный трёхсекундный период готовности; само создание Pod не делает её доступной. Прочитайте Deployment и его ReplicaSet. ReplicaSet поддерживает Pod для одного шаблона Deployment; rs — сокращённое имя этого ресурса:

kubectl --context=labex-v135 -n shop-quota get deployments,rs,pods

Есть три доступные реплики магазина и одна реплика эталона. Новый ReplicaSet магазина не может создать свой Pod. Изучите оба ReplicaSet магазина; -l app=shop выбирает их по метке:

kubectl --context=labex-v135 -n shop-quota describe rs -l app=shop

Найдите FailedCreate или ReplicaFailure с exceeded quota: shop-budget, requested: requests.cpu=40m, used: requests.cpu=140m и limited: requests.cpu=140m. Это отказ в допуске: новый Pod не был создан. Он отличается от существующего Pod в состоянии Pending, который планировщик не может разместить. Не меняйте квоту и не удаляйте эталонную нагрузку.

Утверждённый новый каталог и манифест кандидата уже предоставлены. Явно перейдите в рабочий каталог. pwd выводит текущий каталог; ls перечисляет его содержимое:

cd /home/labex/project/shop-update
pwd
ls

Вы должны увидеть approved, starter и tools. cat выводит утверждённый каталог товаров:

cat approved/catalogue.json

Прочитайте кандидата целиком с помощью sed -n '1,180p': -n подавляет обычный вывод, а p печатает строки с 1 по 180. Диапазон в кавычках — один аргумент:

sed -n '1,180p' starter/shop.yaml

Магазину нужны три реплики, каждая запрашивает 40m. Защищённый эталон запрашивает 20m. Менять можно только spec.strategy.rollingUpdate; предоставленный новый шаблон приложения, число реплик, ресурсы, селекторы и проверки здоровья должны остаться нетронутыми.

Статья бюджета Запрошенный CPU
Три реплики магазина 3 × 40m = 120m
Защищённый эталон 20m
Установившееся состояние 140m
Один дополнительный Pod магазина во время обновления Всего 180m: превышает 140m

Постепенное обновление уравновешивает два значения. maxSurge разрешает дополнительные Pod сверх желаемого числа реплик. maxUnavailable разрешает недоступность части желаемых реплик. Здесь во время наблюдаемого обновления требуются как минимум две доступные реплики магазина. При трёх желаемых репликах одна может временно быть недоступной, но дополнительный Pod не помещается. Выберите maxSurge: 0 и maxUnavailable: 1. Оба значения не могут быть нулевыми. Recreate, удаление Deployment, уменьшение запросов ресурсов, сокращение желаемого числа реплик и увеличение квоты выходят за рамки задания.

Создайте редактируемый каталог выпуска и скопируйте предоставленного кандидата. mkdir создаёт каталог; cp копирует файл. Предоставленные оригиналы доступны только для чтения. chmod u+w добавляет вашему пользователю право записи в копию:

mkdir release
cp starter/shop.yaml release/shop.yaml
chmod u+w release/shop.yaml

Если release уже существует после предыдущей попытки, сохраните его и продолжайте работать с редактируемой копией. При опечатке в пути используйте приведённые выше pwd, ls и cd с абсолютным путём, прежде чем повторять неудавшуюся команду; отсутствие пути не требует сброса VM.

sed -i редактирует файл на месте. Каждое выражение s/old/new/ заменяет указанный текст. Одинарные кавычки сохраняют пробелы и знаки пунктуации вместе. Измените в своей копии только два значения развёртывания:

sed -i 's/maxSurge: 1/maxSurge: 0/' release/shop.yaml
sed -i 's/maxUnavailable: 0/maxUnavailable: 1/' release/shop.yaml

Прочитайте начало сохранённого манифеста перед применением:

sed -n '1,35p' release/shop.yaml

Ожидаются replicas: 3, type: "RollingUpdate", maxSurge: 0 и maxUnavailable: 1. apply -f согласует этот файл с существующим Deployment; идентичность Deployment сохраняется. rollout status ждёт новые реплики с конечным --timeout:

kubectl --context=labex-v135 apply -f release/shop.yaml
kubectl --context=labex-v135 -n shop-quota rollout status deployment/shop --timeout=180s

Ожидается deployment "shop" successfully rolled out. Контроллер может удалить одну старую реплику, допустить новую, дождаться её доступности и продолжить. Завершающиеся Pod могут недолго оставаться в учёте квоты, поэтому временное дополнительное событие FailedCreate может разрешиться естественным образом; это не повод менять квоту. Бюджет развёртывания не является абсолютным пределом всех завершающихся процессов или гарантией непрерывной работы.

Если неправильное изменение мешает завершению, изучите сохранённый файл и исправьте два значения стратегии. Для восстановления после неуспешной попытки или нарушения окна наблюдения повторно примените исходное утверждённое базовое состояние и дождитесь его готовности, прежде чем снова применять исправленный выпуск:

kubectl --context=labex-v135 apply -f approved/shop.yaml
kubectl --context=labex-v135 -n shop-quota rollout status deployment/shop --timeout=180s

Параметр --wait-baseline предоставленного инструмента состояния ждёт недавнего наблюдения исправного старого каталога перед новой попыткой. Он только читает записанные факты:

./tools/update-status --wait-baseline
kubectl --context=labex-v135 apply -f release/shop.yaml
kubectl --context=labex-v135 -n shop-quota rollout status deployment/shop --timeout=180s

Эти команды восстановления нужны только после неуспешной попытки. Оставьте предоставленное базовое состояние без изменений. Наблюдатель, работающий только на чтение, сохраняет попытки и различает новую полную попытку перехода от базового состояния к обновлению; восстановление не стирает прежние свидетельства.

В заключение снова прочитайте фактическую нагрузку и квоту:

kubectl --context=labex-v135 -n shop-quota get deployments
kubectl --context=labex-v135 -n shop-quota describe resourcequota shop-budget

Оба Deployment должны быть доступны: магазин 3/3, эталон 1/1. После завершения старых Pod использование квоты возвращается к 140m при прежнем жёстком пределе. Следующий шаг проверяет каталог, который люди действительно получают.

Передайте обновлённый каталог

На этом шаге вы проверите новый пользовательский путь и сохраните настоящую выгрузку каталога рядом с сохранённым манифестом выпуска.

Начните в Workspace, в /home/labex/project/shop-update. Предоставленная команда tools/update-status обобщает фактические выборки API и HTTP, записанные наблюдателем, работающим только на чтение. Начальное ./ запускает программу относительно текущего каталога:

./tools/update-status

Она сообщает требуемый минимум, число выборок, минимальное число доступных реплик среди выборок и последнее состояние обновления. Ожидайте минимум не менее двух, а при завершении — три обновлённые и доступные реплики. Наблюдатель делает выборки примерно каждые полсекунды плюс время API, проверяет исходную квоту и эталон и записывает сбои. Оставьте предоставленный наблюдатель работающим. Он не доказывает, что происходило между выборками, не гарантирует непрерывную работу в производственной среде и не исправляет кластер. Проверке сразу после завершения развёртывания может потребоваться короткое ожидание двух завершённых выборок. Если попытка нарушила требуемый минимум или имела длительный разрыв наблюдений, используйте восстановление базового состояния из предыдущего шага перед исправленной попыткой.

Переключитесь на Shop и перезагрузите страницу. Ожидаются The winter edit, четыре товара, Stoneware tray $20.00, Linen cloth $14.00, Bud vase $24.00 и Amber cup $16.00. Откройте Amber cup, проверьте цену и статус Available in store, затем вернитесь через Back to collection. Это каталог без оформления онлайн-заказа.

Готовая коллекция содержит четыре настоящие карточки товаров. Сравните заголовок коллекции и цены с этим работающим примером:

Обновлённая коллекция Aster Supply

Нажмите Download catalogue. Откройте скачанный браузером catalogue.csv; его четыре строки должны соответствовать коллекции, названиям, ценам в центах и доступности на сайте. Браузерная загрузка и рабочий каталог терминала — разные места. Далее сохраните ту же настоящую выгрузку Service в рабочий каталог для передачи.

Переключитесь обратно на Workspace. curl получает данные по URL. --fail сообщает об ошибках HTTP, --silent --show-error скрывает индикатор загрузки, сохраняя ошибки, а --output записывает байты ответа в указанный файл. 127.0.0.1:8081 — подготовленный локальный вход, перенаправляющий запросы в исходный Service магазина:

curl --fail --silent --show-error http://127.0.0.1:8081/catalogue.csv --output catalogue.csv
cat catalogue.csv

Ожидается:

id,name,price_cents,available,collection
stone-tray,Stoneware tray,2000,true,The winter edit
linen-cloth,Linen cloth,1400,true,The winter edit
bud-vase,Bud vase,2400,true,The winter edit
amber-cup,Amber cup,1600,true,The winter edit

Ошибка соединения означает, что локальный вход недоступен; ошибка HTTP — ответ сервера. Вернитесь к изученным командам нагрузки и развёртывания, чтобы осмотреть текущее состояние; не подменяйте результат статическим файлом и не меняйте подготовленный сервис перенаправления. Если выгрузка неполна или случайно перезаписана, повторите ту же команду curl, когда правильный каталог станет доступен.

Снова откройте Reference и перезагрузите страницу. Fern Stationery должен по-прежнему показывать Desk essentials, Field notebook $9.00 и Clay pencil cup $14.00. Откройте товар и вернитесь, чтобы убедиться, что настоящие ссылки всё ещё работают.

Передаваемый результат — release/shop.yaml и настоящий catalogue.csv, подкреплённые полным новым выпуском, неизменённой квотой, исходным эталонным сервисом и допустимой наблюдаемой попыткой обновления. Сохраните предоставленные оригиналы, приложение, Service и наблюдатель, работающий только на чтение.

Резюме

Вы связали настоящий отказ ReplicaSet из-за квоты с временной потребностью постепенного обновления в ресурсах, рассчитали подходящий бюджет дополнительных и недоступных реплик и завершили новый каталог, не расширяя выделение ресурсов. Вы также сохранили защищённый эталонный сервис и передали настоящий CSV вместе с повторно используемым манифестом выпуска.

Запросы CPU описывают учёт ресурсов, а не измеренную загрузку или обещанную производительность. Штатные наблюдения с конечным числом выборок подтверждают проверку доступности в рамках этого курса; они не доказывают непрерывную работу в производственной среде. В другом пространстве имён заново рассчитайте и свободное выделение ресурсов, и минимальное число доступных реплик перед выбором стратегии.