Введение
Juniper Café готовится к осеннему меню. Сайт работает, но пока показывает повседневный ассортимент. Вы опубликуете новое меню через Kubernetes, сохраните доступ к старой конфигурации и скачаете настоящее меню для сотрудников за стойкой.
Вы уже должны понимать, что такое Pod, Deployment, Service и метки, а также читать простой YAML. Кластер, образ приложения и сайт подготовлены; писать код приложения или иметь облачную учётную запись не требуется. В этой работе вы познакомитесь с небольшой частью Kustomize, которая позволяет давать каждой конфигурации собственное имя на основе её содержимого.
Используйте Workspace для команд, Café Menu для Juniper и Reference Menu для отдельного кафе при читальном зале. Все входы используют одну учебную VM. Не меняйте эталонное кафе, код приложения, Service, число реплик и предоставленную историю выпусков. Авторская оценка в 40 минут включает чтение и обычные ошибки.
Подготовьте отдельный выпуск меню
На этом шаге вы установите связь между текущим сайтом и его конфигурацией и подготовите каталог выпуска, не меняя работающее меню.
Откройте Café Menu, выберите Explore the menu и найдите Maple Latte. Сейчас он стоит $4.20 и имеет статус Not available today. Cold Brew доступен. Откройте About this drink для Oat Latte, затем вернитесь через Back to the menu. Это настоящие страницы, которые обслуживает подготовленное приложение.
Переключитесь на Reference Menu и выберите Our menu. Это Willow Reading Room — отдельный сервис, который должен продолжать работать. Переключитесь на Workspace. Начальный каталог — /home/labex/project/cafe-menu; проверьте его командой pwd, которая выводит текущий каталог:
pwd
Ожидаемый результат:
/home/labex/project/cafe-menu
ConfigMap в Kubernetes хранит конфигурацию отдельно от образа приложения. Pod ссылается на ConfigMap по имени. Процесс этого кафе читает подключённый файл меню один раз при запуске. Изменение конфигурации не заставляет уже работающий процесс автоматически перечитать меню.
Подготовленный каталог starter содержит три небольших файла. Команда ls выводит их список:
ls starter
deployment.json kustomization.yaml menu.json
JSON также подходит для манифестов Kubernetes; deployment.json — подготовленное определение Deployment. Вы сохраните его настройки приложения и измените отдельные данные меню.
Создайте собственный каталог с помощью cp -r: cp копирует, а -r включает содержимое каталога. Каталог назначения release пока не существует:
cp -r starter release
Если случайно выполнить команду дважды, cp может создать вложенный release/starter. Три необходимых файла по-прежнему должны находиться непосредственно в release; удалите только случайную вложенную копию командой rm -r release/starter. Не удаляйте release, versions или approved.
Прочитайте конфигурацию командой cat, которая выводит содержимое файла:
cat release/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: cafe-menu
resources:
- deployment.json
configMapGenerator:
- name: cafe-menu
files:
- menu.json
resources включает Deployment. configMapGenerator преобразует menu.json в данные ConfigMap. Kustomize добавляет суффикс, вычисленный по содержимому, и обновляет ссылку Deployment на полученное имя. Поэтому изменение данных может создать новый шаблон Pod и запустить новое развёртывание, а прежний ConfigMap останется доступен. Суффикс идентифицирует содержимое; он не говорит о правильности цен.
Запишите утверждённое осеннее меню
На этом шаге вы подготовите полное осеннее меню, прежде чем применять изменения в Kubernetes.
Оставайтесь в Workspace. Утверждённые сотрудниками за стойкой данные хранятся в approved/menu.csv. CSV означает значения, разделённые запятыми: первая строка задаёт имена столбцов, а каждая следующая описывает один напиток. price_cents — целое число центов, поэтому 450 означает $4.50. true и false показывают, доступен ли напиток.
cat approved/menu.csv
id,name,price_cents,available
espresso,Espresso,250,true
oat-latte,Oat Latte,350,true
cold-brew,Cold Brew,390,false
maple-latte,Maple Latte,450,true
Оставьте Espresso и Oat Latte без изменений. Cold Brew больше не входит в сегодняшний ассортимент, а Maple Latte становится доступен по цене $4.50. Метка сезона должна быть Autumn at Juniper; название кафе, адрес, часы работы, идентификаторы позиций и описания остаются прежними.
Запишите приведённый ниже JSON целиком. В JSON имена свойств заключаются в кавычки, записи разделяются запятыми, а логические значения пишутся строчными буквами без кавычек. Выражение оболочки cat > release/menu.json <<'EOF' записывает заключённый между ограничителями текст в этот файл. > заменяет его прежнее содержимое; кавычки вокруг EOF сохраняют текст буквально. Вставьте весь блок до завершающей строки EOF включительно; она должна находиться на отдельной строке:
cat > release/menu.json <<'EOF'
{
"name": "Juniper Café",
"season": "Autumn at Juniper",
"hours": "Mon–Sat · 08:00–17:00",
"address": "14 Willow Lane",
"items": [
{"id": "espresso", "name": "Espresso", "price_cents": 250, "available": true, "description": "A small, rich cup with a golden crema."},
{"id": "oat-latte", "name": "Oat Latte", "price_cents": 350, "available": true, "description": "Our espresso with smooth oat milk."},
{"id": "cold-brew", "name": "Cold Brew", "price_cents": 390, "available": false, "description": "Slow-steeped coffee, served over ice."},
{"id": "maple-latte", "name": "Maple Latte", "price_cents": 450, "available": true, "description": "Espresso, oat milk, and a little maple sweetness."}
]
}
EOF
Проверьте JSON перед использованием. python3 -m json.tool читает JSON и выводит его с отступами; файл при этом не меняется:
python3 -m json.tool release/menu.json
При успешной проверке вывод содержит все четыре напитка. Инструмент может показывать \u00e9 вместо é; это экранирование JSON, а не изменение названия кафе. Пропущенная запятая или кавычка вызывает ошибку разбора с указанием строки и столбца. Для исправления снова запишите весь блок выше и повторите проверку. Неверный путь вызывает ошибку отсутствия файла; выполните pwd и вернитесь командой cd /home/labex/project/cafe-menu, прежде чем повторять попытку.
Сайт по-прежнему показывает повседневное меню, потому что вы изменили только исходные файлы своего выпуска. Это ожидаемо.
Опубликуйте новую версию конфигурации
На этом шаге вы сформируете манифесты выпуска, примените их и дождётесь, пока обе реплики кафе начнут использовать новую конфигурацию.
Оставайтесь в Workspace. kubectl kustomize формирует манифесты из каталога, не применяя их. Изучите сгенерированное имя ConfigMap и соответствующую ссылку Deployment:
kubectl kustomize release
Вывод содержит имя вида cafe-menu-... и такое же имя в записи volumes Deployment для тома menu. Точный суффикс зависит от данных. Это другой объект конфигурации, отличный от повседневного меню.
Примените каталог командой kubectl apply -k. Параметр -k просит kubectl сформировать манифесты из каталога Kustomize, а не читать один манифест через -f:
kubectl apply -k release
Ожидаемый вывод включает:
configmap/cafe-menu-... created
deployment.apps/cafe configured
Само по себе создание ConfigMap не доказывает, что работающее приложение изменилось. rollout status ждёт, пока контроллер Deployment заменит Pod. -n cafe-menu выбирает пространство имён этой работы; --timeout=120s ограничивает время ожидания:
kubectl rollout status deployment/cafe -n cafe-menu --timeout=120s
deployment "cafe" successfully rolled out
Если ожидание завершилось по тайм-ауту, сохраните текущее состояние и изучите его следующими командами. Ошибка образа или контейнера отображается в состоянии Pod и событиях; не запускайте подготовку повторно и не удаляйте пространство имён:
kubectl get pods -n cafe-menu
kubectl describe deployment cafe -n cafe-menu
После нормального развёртывания изучите текущий Deployment и его ReplicaSet. ReplicaSet поддерживает один конкретный шаблон Pod; Deployment сохраняет старые ReplicaSet как историю развёртываний:
kubectl get replicasets -n cafe-menu -l app=cafe
Изучите сам Deployment по имени:
kubectl get deployment cafe -n cafe-menu
Он должен показывать 2/2 готовых реплик. Несколько объектов конфигурации остаются на месте; применение нового выпуска не перезаписало старое меню. Выведите их список:
kubectl get configmaps -n cafe-menu
Не удаляйте эти старые конфигурации. Если позже восстановить старую версию, соответствующему ReplicaSet понадобится именно то имя конфигурации, на которое он ссылается.
Проверьте сайт и передайте меню
На этом шаге вы проверите настоящий пользовательский путь и сохраните меню для сотрудников за стойкой.
Переключитесь на Café Menu, выберите Our menu и обновите страницу, если она уже открыта. У Maple Latte должен быть статус Available today и цена $4.50. У Cold Brew должен быть статус Not available today. Откройте страницу Maple Latte, вернитесь через Back to the menu, затем воспользуйтесь Visit us, чтобы убедиться, что адрес и часы работы по-прежнему доступны.

Посмотрите на отметки доступности и цены: Cold Brew недоступен, а Maple Latte доступен по цене $4.50.
Нажмите Download menu, чтобы скачать настоящий полный CSV. Откройте его и сравните все четыре напитка с утверждённой таблицей из шага 2. В выгрузку входят и недоступные напитки со значением false, чтобы сотрудники могли отличать их от случайно пропущенных позиций.
Переключитесь на Reference Menu и убедитесь, что повседневное меню Willow Reading Room по-прежнему работает. Затем вернитесь в Workspace.
Настоящую выгрузку Juniper можно также сохранить в рабочем каталоге. curl обращается к локальному входу для браузера, который перенаправляет запросы в настоящий Service Kubernetes. --fail сообщает об ошибках HTTP; --silent скрывает индикатор загрузки; --show-error сохраняет видимость сообщений об ошибках; -o задаёт имя выходного файла:
curl --fail --silent --show-error http://127.0.0.1:8081/menu.csv -o menu-handover.csv
Сравните полученный файл с утверждённым с помощью diff -u. Параметр -u показывает соседние строки при наличии различий:
diff -u approved/menu.csv menu-handover.csv
Отсутствие вывода означает, что файлы совпадают. Различие — полезное свидетельство: вернитесь к исходному меню и работающему развёртыванию, исправьте причину, снова скачайте файл и повторите сравнение. Не редактируйте полученный CSV, чтобы скрыть неправильное меню на сайте.
Теперь у вас есть пригодное к использованию меню, его настоящая выгрузка для сотрудников и каталог выпуска, воспроизводящий работающую конфигурацию. Сохраните versions и старые ConfigMap без изменений как материалы для восстановления в этом окружении. Следующая работа подготовит собственное независимое окружение.
Резюме
Вы подготовили полный выпуск меню, сгенерировали ConfigMap с именем на основе содержимого и проследили развёртывание Deployment на обе реплики приложения. Вы проверили настоящие страницы и загрузки, сохранили эталонное кафе и прежние конфигурации и передали настоящий CSV для сотрудников.
Следующая работа начинается в отдельном окружении. В ней эти идеи помогут восстановить меню приложения, которое работает исправно, но показывает неправильные цены.



