Введение
У Meadow Supply небольшой каталог и работающий расчёт стоимости корзины. Публичная страница запрашивает наличие через Shop API. API означает Application Programming Interface — программный интерфейс приложения: здесь это интерфейс запросов между страницей покупателя и внутренним сервисом запасов. Этот API читает запасы для страницы. Сейчас процесс покупателя и отдельный посетитель также могут читать запасы напрямую, включая сведения о полках, которые публичному каталогу не нужны.
Сохраните обычный путь покупателя, ограничив соединения с запасами утверждённой ролью API в утверждённом пространстве имён. Повторно используемый результат — сохранённая NetworkPolicy и соответствующая работающая граница доступа, подтверждённые настоящими запросами, а не зелёной схемой.
Вы уже должны знать базовые пути терминала, простой YAML, пространства имён, Pod, Deployment, Service и метки. Эта работа объясняет поля политики, предоставленную диагностическую команду и результаты запросов до их использования. Настоящий одноузловой кластер Kubernetes с Calico, приложение и синтетические данные подготовлены. Установка кластера, сборка образа и программирование приложения не требуются. Время — авторская оценка, включающая чтение и обычные ошибки. Расчёты учебные: заказ, резервирование и оплата не выполняются.
Оставьте доступ к запасам на утверждённом пути
На этом шаге вы разрешите Shop API обращаться к запасам, запретив процессам покупателя и посетителя обходить его.
Начните на вкладке Shop. Meadow Supply должен показывать Good things for everyday и три товара. Откройте Glass water bottle, обратите внимание на цену $18.00 и Available · 6 in stock, затем выберите Try a basket quote, установив Quantity в 1. Результат должен содержать Ready for collection, $18.00 и явное указание, что ничего не зарезервировано, не заказано и не оплачено. Используйте Back to product, затем Back to collection.
Настоящий путь запроса:
Customer page → Shop API → Stock service
Страница покупателя работает в собственном Pod. Открытие сайта не превращает браузер в Pod кластера; запросы к запасам приходят от подготовленных процессов приложения. API читает запасы через новое сетевое соединение и объединяет их с утверждёнными ценами каталога. У него нет статической подстановки данных запасов. Отдельная вкладка Reference показывает заметки Meadow Dispatch о выдаче. Откройте её, прочитайте P-104 и P-108, затем переключитесь на Workspace. Этот отдельный сервис должен продолжать работать.
Терминал запускается в /home/labex/project/stock-policy. pwd выводит текущий каталог; ls перечисляет его содержимое. Используйте cd с абсолютным путём, если нужно вернуться сюда:
pwd
ls
cd /home/labex/project/stock-policy
Ожидаются scope.json, starter и tools. cat выводит подготовленный файл области работы. Он использует JSON (JavaScript Object Notation) — текстовый формат именованных значений и списков. В нём перечислены настоящие имена ресурсов и цели запросов, а не выдуманное состояние топологии:
cat scope.json
--context=labex-v135 выбирает подготовленный настоящий кластер. --show-labels показывает метки объектов. Пространство имён объединяет объекты, но само по себе не блокирует их сетевые соединения. Прочитайте идентичности пространств имён:
kubectl --context=labex-v135 get namespaces meadow-shop meadow-stock meadow-visitors --show-labels
У каждого есть встроенная метка kubernetes.io/metadata.name, равная его имени. -n выбирает пространство имён. Прочитайте Pod и их метки:
kubectl --context=labex-v135 -n meadow-shop get pods --show-labels
kubectl --context=labex-v135 -n meadow-stock get pods --show-labels
kubectl --context=labex-v135 -n meadow-visitors get pods --show-labels
Процесс покупателя имеет role=customer, API — role=shop-api, а запасы — role=inventory. Отдельный сервис выдачи имеет role=dispatch. Посетитель находится в meadow-visitors, но намеренно имеет ту же метку role=shop-api, что и настоящий API. Поэтому одна метка роли не определяет утверждённое пространство имён.
Прочитайте Service. Service выбирает подготовленные Pod и предоставляет стабильный адрес. Порт определяет точку, на которой приложение слушает запросы. TCP (Transmission Control Protocol — протокол управления передачей) предоставляет соединение для этих веб-запросов; процесс запасов слушает TCP-порт 8080:
kubectl --context=labex-v135 -n meadow-stock get services
Предоставленный ./tools/network-test выполняет настоящий запрос от существующей идентичности приложения через kubectl exec. Начальное ./ означает, что инструмент находится в текущем каталоге. Первый аргумент выбирает customer, api, visitor, stock или reference; следующий — http, dns или dns-tcp; последний задаёт цель. Инструмент никогда не меняет политики и не исправляет приложение. Запросы http используют HTTP (Hypertext Transfer Protocol — протокол передачи гипертекста), протокол запросов и ответов для этих веб/API-точек. Полное имя stock.meadow-stock.svc.cluster.local определяет Service запасов в его пространстве имён через кластерную DNS (Domain Name System — систему доменных имён), преобразующую имена Service в адреса.
Сначала установите исходное состояние соединения и содержимого. До изоляции оба запроса должны завершаться успешно:
./tools/network-test api http http://stock.meadow-stock.svc.cluster.local:8080/stock.json
./tools/network-test customer http http://stock.meadow-stock.svc.cluster.local:8080/stock.json
Ожидается HTTP_REPLY 200, затем одинаковые данные запасов: bottle — 6 единиц на полке M-03, notebook — 4 на M-08, bag — 0 на M-12. Покупатель должен получать публичные сведения о наличии через API, а не читать эти внутренние данные напрямую. Исходная проверка доказывает, что цель работает до введения ограничений.
NetworkPolicy выбирает Pod и разрешает определённые соединения для одного направления трафика. Ingress — соединения, входящие в выбранные Pod. После выбора запасов ingress-политикой доступными остаются только разрешённые входящие пути, кроме документированных Kubernetes исключений для трафика узла и собственного трафика Pod. Это сетевой контроль Pod, а не аутентификация пользователей или авторизация HTTP.
Создайте каталог выпуска. mkdir -p создаёт его при необходимости и сохраняет существующий каталог. Следующая команда cat записывает полную политику в ваш файл выпуска: > перенаправляет вывод в этот файл, а маркер YAML в кавычках сохраняет текст буквально до последнего маркера на отдельной строке. Повторение заменяет только этот редактируемый файл политики.
mkdir -p release
cat > release/stock-ingress.yaml <<'YAML'
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: stock-ingress
namespace: meadow-stock
spec:
podSelector:
matchLabels:
role: inventory
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: meadow-shop
podSelector:
matchLabels:
role: shop-api
ports:
- protocol: TCP
port: 8080
YAML
Прочитайте сохранённый файл перед применением:
cat release/stock-ingress.yaml
Внешний podSelector выбирает только запасы, оставляя выдачу за пределами этой политики. Внутри одной записи from должны совпасть оба селектора — namespaceSelector и podSelector: источник должен находиться в meadow-shop и иметь role=shop-api. Оба селектора выровнены внутри одного элемента списка. Дополнительный дефис перед внутренним podSelector создал бы вторую альтернативу, то есть OR (ИЛИ), и разрешил бы другие Pod в утверждённом пространстве имён. Порт — слушающий TCP-порт Pod запасов. Это правило не ограничивает исходящий трафик API.
apply -f читает сохранённый манифест и создаёт или обновляет политику с указанным именем. Приложение не перезапускается:
kubectl --context=labex-v135 apply -f release/stock-ingress.yaml
describe показывает, как Kubernetes интерпретировал правило:
kubectl --context=labex-v135 -n meadow-stock describe networkpolicy stock-ingress
Прочитайте выбранную роль запасов, исходное пространство имён, роль API и TCP-порт. Применение ограничений политики может занять несколько секунд. Сначала подтвердите, что исходный разрешённый запрос всё ещё возвращает полные данные:
./tools/network-test api http http://stock.meadow-stock.svc.cluster.local:8080/stock.json
Теперь проверьте две разные причины отказа источнику:
./tools/network-test customer http http://stock.meadow-stock.svc.cluster.local:8080/stock.json
./tools/network-test visitor http http://stock.meadow-stock.svc.cluster.local:8080/stock.json
Для двух последних команд ожидаются NETWORK_TIMEOUT и ненулевой код завершения. Customer находится в утверждённом пространстве имён, но имеет неправильную роль; Visitor имеет совпадающую роль, но находится в неправильном пространстве имён. Отказ в соединении, ошибка DNS или остановленная цель не доказывают изоляцию. Успешный запрос API к той же цели — положительная контрольная проверка. Если сразу после применения политики повторный запрос ещё успешен, подождите несколько секунд и повторите; не объявляйте изоляцию, пока действительно запрещённые пути не завершатся по тайм-ауту.
При опечатке в пути используйте прежние pwd, ls и cd с абсолютным путём, затем повторите неудавшуюся операцию. Если YAML не разбирается, прочитайте файл выпуска и сравните отступы и расположение дефисов с полным примером, перезапишите этот редактируемый файл и примените снова. Если API тоже заблокирован, изучите describe, уже показанные метки и порт, исправьте сохранённую политику и примените повторно. Сохраните исходные пространства имён, метки, нагрузки, Pod, Service, приложение, исходные файлы и диагностический инструмент. Не останавливайте запасы, не меняйте метки, не используйте правила Pod IP/CIDR, не меняйте сеть хоста и не сбрасывайте VM, чтобы искусственно получить отказ.
Проверьте весь путь покупателя
На этом шаге вы проверите полный пользовательский путь после изоляции и сохраните работоспособность отдельного сервиса выдачи.
Начните в Workspace, в /home/labex/project/stock-policy. Прямой запрос запасов намеренно заблокирован для Customer, но Customer должен по-прежнему обращаться к Shop API. Запросите каталог по этому исходному пути:
./tools/network-test customer http http://api.meadow-shop.svc.cluster.local:8080/catalogue.json
Ожидаются HTTP_REPLY 200 и три утверждённых товара с исходными ценами и количеством: Glass water bottle — 1800 центов / 6 единиц, Everyday notebook — 1400 / 4, Canvas market bag — 2400 / 0. API также сообщает, какой исходный Pod запасов ответил; публичная страница не показывает эту инфраструктурную подробность. Успешный путь через API и неуспешный прямой путь совместимы: API устанавливает собственное разрешённое соединение с запасами.
Переключитесь на Shop и перезагрузите страницу. Откройте Glass water bottle, установите Quantity в 2 и выберите Try a basket quote. Ожидаются Ready for collection, Quantity 2, Total $36.00 и Units available 6. Прочитайте учебное уведомление: запасы не резервируются. Используйте Back to product и Back to collection.
Откройте Canvas market bag, отмеченный Back soon, и попробуйте расчёт для Quantity 1. Ожидаются Not enough stock, Total $24.00 и Units available 0. Это корректный бизнес-ответ, а не сетевой сбой; не меняйте запасы, чтобы каждый расчёт завершался успехом. Используйте Back to product, затем Back to collection. Откройте Our approach, прочитайте описание учебных расчётов и используйте Back to collection.
Готовый каталог содержит три исходных товара и текущее наличие; сравните заголовок, цены и наличие с этим работающим примером:

Переключитесь на Reference и перезагрузите страницу. P-104 · Ready и P-108 · Packed должны оставаться видимыми. Выберите Download notes и откройте настоящую загрузку notes.json: она содержит две неизменённые записи выдачи, а не данные запасов. Браузерная загрузка и рабочий каталог терминала — разные места; в этом задании не требуется копировать файл в рабочий каталог.
Вернитесь в Workspace и прочитайте тот же отдельный Service от Customer:
./tools/network-test customer http http://dispatch.meadow-stock.svc.cluster.local:8080/notes.json
Ожидаются HTTP_REPLY 200 и обе исходные заметки. Политика выбрала Pod запасов, а не всё пространство имён запасов. Сохраните процесс выдачи, данные и исходный Service; его выключение скрыло бы чрезмерно широкое правило.
Передаваемый результат — release/stock-ingress.yaml и соответствующая работающая граница доступа. Полный каталог и оба результата расчётов должны продолжать работать через исходное приложение, а два прямых обхода к запасам — оставаться запрещёнными. Сохраните каждый подготовленный исходный файл, объект приложения и исходный Pod. Если страница показывает Live availability unavailable, вернитесь к изученным проверкам меток, политик и запросов, исправьте только свою политику выпуска и примените снова; статическая подмена страницы не является исправлением. Здесь выполняется конечное число настоящих TCP-запросов в одном подготовленном кластере, что не даёт гарантии производственной безопасности или непрерывной доступности.
Резюме
Вы сохранили настоящий путь покупатель → API → запасы, запретив прямое чтение запасов и покупателю с неправильной ролью, и посетителю с совпадающей ролью в другом пространстве имён. Сохранённая ingress-политика выражает связь пространства имён и роли, а работающий каталог, учебные расчёты и отдельный сервис выдачи по-прежнему доступны.
NetworkPolicy контролирует сетевые пути Pod, а не аутентификацию покупателей. Тайм-аут — полезное свидетельство только при работающей цели и разрешённом соединении. Следующая независимая работа рассматривает другое направление: исходящий трафик API, DNS и разрешения от других политик.



