Введение
Meadow Supply должен показывать текущее наличие и рассчитывать учебные корзины через API. В этом независимом окружении исходные приложения работают, но старое миграционное правило исходящего трафика API разрешает широкие TCP-соединения и не учитывает DNS. Поэтому каталог показывает ошибку наличия. Исправьте необходимые зависимости, затем уберите лишние разрешения старого правила, сохранив магазин и отдельный сервис выдачи.
Используйте методы работы с пространствами имён, ролями, политиками, терминалом и настоящими запросами из предыдущей пошаговой работы. Здесь исходящий трафик, требования DNS к протоколам/портам, переменная терминала и объединение политик объясняются до использования. Подготовленный настоящий одноузловой кластер независимо содержит полное приложение и утверждённую ingress-политику запасов; файлы и процессы предыдущей VM не нужны. Установка кластера и программирование приложения не требуются. Продолжительность — авторская оценка, а не замер времени начинающих. Все товары и заметки выдачи синтетические, а учебные расчёты ничего не резервируют, не заказывают и не оплачивают.
Восстановите необходимые зависимости API
На этом шаге вы восстановите настоящие соединения Shop API с DNS и запасами, не открывая все назначения.
Откройте Shop. Ожидаемый полный результат — тот же каталог Meadow Supply с тремя товарами: Glass water bottle стоит $18.00 при 6 единицах, Everyday notebook — $14.00 при 4, Canvas market bag — $24.00 при 0. В исходном состоянии вместо этого страница сообщает Live availability unavailable. Цены остаются видимыми, но у приложения нет подстановки данных запасов, и оно не может выполнить корректный расчёт. Это предусмотренный сбой зависимости, который нужно исправить; не принимайте его за пустые запасы. Reference должен по-прежнему показывать две исходные заметки выдачи. Переключитесь на Workspace.
Независимый рабочий каталог — /home/labex/project/stock-policy. Используйте прежнее восстановление пути: pwd, ls и при необходимости cd с абсолютным путём. Прочитайте предоставленную область работы:
cd /home/labex/project/stock-policy
cat scope.json
В этой VM граница входящего доступа к запасам уже подготовлена. Она разрешает роль API в meadow-shop; оставьте эту политику без изменений. Исходящие соединения API контролируются отдельно. Egress означает трафик, покидающий выбранные Pod. Выбирающая их Egress-политика изолирует эти Pod в данном направлении, а объединение всех применимых egress-правил определяет, какой трафик может выходить. Ответный трафик разрешённого соединения разрешается неявно.
Прочитайте существующую миграционную политику в пространстве имён API:
kubectl --context=labex-v135 -n meadow-shop get networkpolicies
kubectl --context=labex-v135 -n meadow-shop describe networkpolicy legacy-egress
legacy-egress выбирает role=shop-api и разрешает TCP-порт 8080 к любому назначению. DNS в ней не учтён. CoreDNS — подготовленная служба имён кластера. Для имени Service нужен запрос DNS, прежде чем HTTP-соединение сможет использовать его адрес. DNS (Domain Name System — система доменных имён) преобразует имена в адреса. UDP (User Datagram Protocol — протокол пользовательских датаграмм) передаёт отдельные датаграммы; TCP (Transmission Control Protocol — протокол управления передачей) устанавливает соединения. Служба DNS этого кластера принимает оба протокола на порту 53, поэтому нужны оба пути к DNS Pod в kube-system.
Режим dns предоставленного диагностического инструмента отправляет новый UDP-запрос DNS резолверу этого Pod; dns-tcp отправляет новый TCP-запрос. Ни один не полагается на кешированный результат приложения. Проверьте фактическую идентичность API:
./tools/network-test api dns stock.meadow-stock.svc.cluster.local
./tools/network-test api dns-tcp stock.meadow-stock.svc.cluster.local
Оба должны сообщить NETWORK_TIMEOUT и ненулевой код завершения. Эти ожидаемые сбои относятся к соединению DNS. Чтобы отличить их от остановленного процесса запасов, выполните один явный диагностический запрос к исходному адресу Service запасов.
Следующее присваивание сохраняет вывод команды с помощью $(...) в переменной оболочки stock_ip. -o jsonpath='{.spec.clusterIP}' выбирает только поле spec.clusterIP у Service; кавычки сохраняют выражение вместе. Эта переменная принадлежит текущему сеансу терминала Workspace. Это диагностическое значение, а не цель политики или постоянный адрес Pod. При подключении к новой оболочке повторите присваивание перед использованием.
stock_ip=$(kubectl --context=labex-v135 -n meadow-stock get service stock -o jsonpath='{.spec.clusterIP}')
printf печатает сохранённую строку; %s означает строку, а \n завершает строку. Двойные кавычки сохраняют подставленное значение как один аргумент:
printf '%s\n' "$stock_ip"
${stock_ip} подставляет эту переменную внутрь URL запроса. Существующее широкое TCP-правило разрешает это соединение без DNS:
./tools/network-test api http "http://${stock_ip}:8080/stock.json"
Ожидаются HTTP_REPLY 200 и исходные записи запасов. TCP-доступ есть; разрешение имени — отдельная зависимость. Никогда не включайте этот адрес в итоговую политику: используйте стабильные связи пространств имён и ролей.
Изучите настоящие метки DNS перед их выбором. -l k8s-app=kube-dns выбирает подготовленные DNS Pod:
kubectl --context=labex-v135 get namespace kube-system --show-labels
kubectl --context=labex-v135 -n kube-system get pods -l k8s-app=kube-dns --show-labels
Создайте собственную политику api-egress. Она выбирает роль API. Её два правила to — альтернативы: DNS в kube-system на UDP/TCP 53 либо запасы в meadow-stock на TCP 8080. Внутри каждого отдельного peer селекторы пространства имён и Pod объединены через AND (И). Порты каждого правила относятся только к назначениям этого правила.
mkdir -p сохраняет существующий каталог выпуска. Как уже изучено, here-document с маркером в кавычках и > записывают только ваш редактируемый файл выпуска:
mkdir -p release
cat > release/api-egress.yaml <<'YAML'
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-egress
namespace: meadow-shop
spec:
podSelector:
matchLabels:
role: shop-api
policyTypes:
- Egress
egress:
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- protocol: UDP
port: 53
- protocol: TCP
port: 53
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: meadow-stock
podSelector:
matchLabels:
role: inventory
ports:
- protocol: TCP
port: 8080
YAML
Прочитайте, примените и изучите сохранённый манифест:
cat release/api-egress.yaml
kubectl --context=labex-v135 apply -f release/api-egress.yaml
kubectl --context=labex-v135 -n meadow-shop describe networkpolicy api-egress
Подтвердите оба настоящих транспорта DNS и соединение с запасами по имени. После применения введение ограничений может занять несколько секунд; повторите запрос после короткого ожидания, если прежняя граница ещё наблюдается.
./tools/network-test api dns stock.meadow-stock.svc.cluster.local
./tools/network-test api dns-tcp stock.meadow-stock.svc.cluster.local
./tools/network-test api http http://stock.meadow-stock.svc.cluster.local:8080/stock.json
Ожидаются DNS_REPLY UDP, DNS_REPLY TCP, затем HTTP_REPLY 200 со всеми исходными данными запасов. Переключитесь на Shop и перезагрузите страницу. Текущее наличие должно вернуться. Откройте Glass water bottle, выберите Quantity 2 и воспользуйтесь Try a basket quote. Ожидаются Ready for collection, итог $36.00 и 6 доступных единиц с учебным уведомлением об отсутствии резервирования. Вернитесь через Back to product и Back to collection.
Сравните восстановленный работающий каталог с этим настоящим результатом:

На этом исправление необходимых соединений завершено, но ещё не доказан запрет посторонних назначений. Другая политика всё ещё может добавлять разрешения. Перейдите к следующему шагу, прежде чем считать эту границу окончательной.
При опечатке вернитесь с помощью pwd, ls и cd с абсолютным путём. При некорректном манифесте или неуспешном запросе зависимости прочитайте сохранённый файл, вывод describe и изученные настоящие метки/порты, исправьте файл и примените снова. DNS_REPLY — результат службы имён; HTTP_REPLY — ответ приложения; NETWORK_TIMEOUT означает отсутствие ответа в пределах подготовленного сетевого тайм-аута; CONNECTION_REFUSED указывает на цель, отказавшую в соединении. Ограниченный по времени REQUEST_TIMEOUT инструмента включает весь запрос и DNS. Произвольный сбой не доказывает правильность политики. Не меняйте код приложения, метки, исходные файлы, исходные Pod, ingress запасов, Service, сеть хоста или инфраструктуру DNS.
Уберите старое широкое разрешение
На этом шаге вы уберёте лишнее разрешение старой миграционной политики, сохранив восстановленный путь покупателя и отдельный сервис выдачи.
Начните в Workspace, в /home/labex/project/stock-policy. Ваша новая политика разрешает только DNS и запасы. Проверьте посторонний сервис выдачи от API:
./tools/network-test api http http://dispatch.meadow-stock.svc.cluster.local:8080/notes.json
Сейчас он возвращает HTTP_REPLY 200 и две заметки выдачи. Этот успех выявляет лишнее разрешение; Shop API не нужен доступ к выдаче. Новая узкая политика не отменяет существующую широкую. NetworkPolicy складывают разрешённые соединения независимо от порядка применения. Чтобы соединение работало, его должны разрешать и egress источника, и ingress назначения.
Снова перечислите обе политики, затем прочитайте управляемую миграционную политику и её исходный файл:
kubectl --context=labex-v135 -n meadow-shop get networkpolicies
kubectl --context=labex-v135 -n meadow-shop describe networkpolicy legacy-egress
cat starter/legacy-egress.yaml
Старое правило разрешает TCP-порт 8080 без ограничения назначения to. Это разрешение всё ещё действует для выбранных API Pod. В этом выпуске сохраните исходный управляемый объект legacy-egress и уберите его разрешения на месте. Сохраните его без разрешающих записей egress, что представляется пустым списком egress: []. Ваша отдельная политика api-egress продолжает предоставлять два необходимых соединения. Оставьте начальный файл только для чтения без изменений.
cat > release/legacy-egress.yaml <<'YAML'
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: legacy-egress
namespace: meadow-shop
spec:
podSelector:
matchLabels:
role: shop-api
policyTypes:
- Egress
egress: []
YAML
Прочитайте и примените сохранённую управляемую политику. Не удаляйте её с последующим созданием заново:
cat release/legacy-egress.yaml
kubectl --context=labex-v135 apply -f release/legacy-egress.yaml
kubectl --context=labex-v135 -n meadow-shop describe networkpolicy legacy-egress
Она должна по-прежнему выбирать роль API, но не добавлять исходящих разрешений. Итоговый каталог выпуска содержит обе сохранённые политики. Подготовленная ingress-политика запасов остаётся без изменений.
Теперь посторонний запрос API к выдаче должен завершаться по тайм-ауту, а контрольный запрос покупателя к тому же самому сервису — оставаться успешным:
./tools/network-test api http http://dispatch.meadow-stock.svc.cluster.local:8080/notes.json
./tools/network-test customer http http://dispatch.meadow-stock.svc.cluster.local:8080/notes.json
Ожидается NETWORK_TIMEOUT с ненулевым кодом завершения для API, затем HTTP_REPLY 200 с обеими неизменёнными заметками для Customer. Эта пара не позволяет принять остановленный сервис за правильную изоляцию. Если запрос API всё ещё успешен сразу после применения, подождите несколько секунд и повторите до наблюдения настоящей новой границы.
Снова подтвердите утверждённый путь к запасам и оба протокола DNS:
./tools/network-test api http http://stock.meadow-stock.svc.cluster.local:8080/stock.json
./tools/network-test api dns stock.meadow-stock.svc.cluster.local
./tools/network-test api dns-tcp stock.meadow-stock.svc.cluster.local
Переключитесь на Shop, перезагрузите страницу и повторите расчёт Glass water bottle для Quantity 2: Ready for collection, $36.00, 6 единиц. Затем рассчитайте Canvas market bag, Quantity 1: Not enough stock, $24.00, 0 единиц. Вернитесь к коллекции и откройте Our approach, чтобы подтвердить учебные рамки. Переключитесь на Reference и перезагрузите страницу; обе исходные заметки выдачи остаются. Нажмите Download notes и изучите настоящую выгрузку из двух записей. Эта браузерная загрузка отделена от рабочего каталога терминала, и копировать её туда не требуется.
Передаваемый результат — release/api-egress.yaml и release/legacy-egress.yaml, применённые к исходным идентичностям политик. И работающие, и сохранённые разрешения должны соответствовать изученным границам пространств имён/ролей и протоколов/портов: DNS UDP/TCP 53 и запасы TCP 8080, без каких-либо разрешений от старой политики. Сохраните все исходные ресурсы приложения, Pod, метки пространств имён, данные и предоставленные источники. Если исправление ломает магазин, изучите пройденные пути DNS и запасов, исправьте только редактируемые файлы политик и примените снова. Не добавляйте другое разрешающее всё правило и не меняйте приложение для обхода DNS. Эти наблюдения TCP/UDP в конечном числе проверок не доказывают производственную сетевую границу безопасности против узлов или администраторов.
Резюме
Вы отделили разрешение имён от соединения приложения, восстановили настоящие зависимости API от DNS и запасов и сохранили работающие расчёты для покупателей. Вы также выяснили, почему узкая политика не убрала разрешение другой политики, и затем убрали старое разрешение, не останавливая посторонний сервис.
Итоговый сохранённый выпуск и объединение работающих политик разрешают необходимые пути DNS и запасов, запрещая API доступ к выдаче. Порядок политик не определяет приоритет; оценивайте объединённые разрешения и сохраняйте положительные контрольные проверки при интерпретации сбоев.



