소개
Meadow Supply는 API를 통해 실시간 재고 상태를 표시하고 교육용 장바구니 견적을 계산해야 합니다. 이 독립 환경에서는 원래 애플리케이션이 실행 중이지만, 이전 API 이그레스 마이그레이션 규칙이 광범위한 TCP 연결을 허용하면서 DNS는 빠뜨렸습니다. 따라서 카탈로그에 재고 상태 오류가 표시됩니다. 필요한 의존성을 복구한 다음, 상점이나 별도 배송 서비스를 중단하지 않고 이전 규칙의 불필요한 권한을 제거하세요.
이전 안내형 실습에서 배운 네임스페이스, 역할, 정책, 터미널, 실제 요청 방법을 사용하세요. 이 실습에서는 이그레스, DNS 프로토콜/포트 요구 사항, 터미널 변수, 정책 합집합을 사용 전에 설명합니다. 준비된 실제 단일 노드 클러스터에는 전체 애플리케이션과 승인된 재고 인그레스가 독립적으로 포함되어 있습니다. 이전 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에는 재고 인그레스 경계가 이미 준비되어 있습니다. meadow-shop의 API 역할을 허용하므로 해당 정책은 변경하지 마세요. API의 발신 연결은 별도로 제어됩니다. Egress는 선택된 Pod에서 나가는 트래픽을 뜻합니다. Pod를 선택하는 Egress 정책은 해당 방향으로 Pod를 격리하고, 적용 가능한 모든 이그레스 규칙의 합집합이 어떤 트래픽이 나갈 수 있는지 결정합니다. 허용된 연결의 응답 트래픽은 암묵적으로 허용됩니다.
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 이름은 HTTP 연결에서 주소를 사용하기 전에 DNS 질의가 필요합니다. DNS(Domain Name System)는 이름을 주소로 변환합니다. UDP(User Datagram Protocol)는 개별 데이터그램을 보내고, TCP(Transmission Control Protocol)는 연결을 설정합니다. 이 클러스터의 DNS 서비스는 포트 53에서 두 프로토콜을 모두 수신하므로 kube-system의 DNS Pod로 향하는 두 경로가 모두 필요합니다.
제공된 진단 도구의 dns 모드는 해당 Pod의 리졸버로 새 UDP DNS 질의를 보냅니다. 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과 0이 아닌 종료 코드를 보고해야 합니다. 이 예상된 실패는 DNS 연결에 관한 것입니다. 중지된 재고 프로세스와 구분하려면 원래 재고 Service 주소로 명시적 진단 요청을 한 번 보내세요.
다음 할당은 $(...)로 명령 출력을 캡처하여 셸 변수 stock_ip에 저장합니다. -o jsonpath='{.spec.clusterIP}'는 Service의 spec.clusterIP 필드만 선택합니다. 따옴표는 표현식을 하나로 유지합니다. 이 변수는 현재 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 규칙은 대안 관계입니다. UDP/TCP 53의 kube-system DNS 또는 TCP 8080의 meadow-stock 재고를 허용합니다. 각 개별 피어 안에서는 네임스페이스와 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, 재고 인그레스, 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는 적용 순서와 관계없이 허용된 연결을 합칩니다. 연결이 작동하려면 출발지의 이그레스와 목적지의 인그레스가 모두 허용해야 합니다.
두 정책을 다시 나열한 뒤 관리 대상 마이그레이션 정책과 원래 소스를 읽으세요.
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
이전 규칙은 to 목적지 제한 없이 TCP 포트 8080을 허용합니다. 이 권한은 선택된 API Pod에 여전히 적용됩니다. 이번 릴리스에서는 원래의 관리 대상 legacy-egress 객체를 유지하면서 제자리에서 권한을 제거하세요. 빈 목록 egress: []로 나타내는 이그레스 허용 항목이 없는 상태로 저장하세요. 별도의 api-egress 정책이 필요한 두 연결을 계속 제공합니다. 읽기 전용 starter는 변경하지 마세요.
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 역할을 선택하지만 발신 허용을 추가하지 않아야 합니다. 최종 릴리스 디렉터리에는 저장된 정책 두 개가 들어 있습니다. 준비된 재고 인그레스 정책은 변경되지 않습니다.
이제 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
API에서는 NETWORK_TIMEOUT과 0이 아닌 종료 코드가, 이어 Customer에서는 변경되지 않은 메모 두 개와 HTTP_REPLY 200이 예상됩니다. 이 쌍은 중지된 서비스를 올바른 격리로 오인하지 않게 합니다. 적용 직후 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을 허용하고, legacy는 아무 허용도 추가하지 않아야 합니다. 모든 원래 애플리케이션 리소스, Pod, 네임스페이스 레이블, 데이터, 제공된 소스를 유지하세요. 수정으로 상점이 작동하지 않으면 배운 DNS와 재고 경로를 조사하고 편집 가능한 정책 파일만 고쳐 다시 적용하세요. 다른 전체 허용 규칙을 추가하거나 DNS를 우회하도록 애플리케이션을 변경하지 마세요. 이 유한한 TCP/UDP 관찰은 노드나 관리자를 상대로 한 프로덕션 네트워크 보안 경계를 입증하지 않습니다.
요약
이름 해석과 애플리케이션 연결을 구분하고, API의 실제 DNS 및 재고 의존성을 복구하며, 실시간 고객 견적을 계속 작동시켰습니다. 또한 좁은 정책이 다른 정책에서 제공한 권한을 제거하지 못하는 이유를 찾고, 관련 없는 서비스를 중지하지 않은 채 이전 허용을 제거했습니다.
최종 저장된 릴리스와 실제 정책 합집합은 필수 DNS 및 재고 경로를 허용하면서 API의 배송 접근을 거부합니다. 정책 순서는 우선순위가 아닙니다. 실패를 해석할 때 결합된 권한을 평가하고 정상 대조군을 보존하세요.



