이 페이지 개선에 도움 주기
이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 GitHub에서 이 페이지 편집 링크를 선택합니다.
하이브리드 노드에 대한 Kubernetes 네트워크 정책 구성
AWS는 Cilium을 EKS Hybrid Nodes에서 CNI로 사용할 때 포드 수신 및 송신 트래픽에 대해 Kubernetes 네트워크 정책(계층 3/계층 4)을 지원합니다. AWS 클라우드의 노드에서 EKS 클러스터를 실행하는 경우 AWS는 Amazon VPC CNI for Kubernetes 네트워크 정책을 지원합니다.
이 주제에서는 EKS Hybrid Nodes를 사용하여 Cilium 및 Kubernetes 네트워크 정책을 구성하는 방법을 설명합니다. Kubernetes 네트워크 정책에 대한 자세한 내용은 Kubernetes 문서의 Kubernetes 네트워크 정책
네트워크 정책 구성
고려 사항
-
AWS는 포드 수신 및 송신에 업스트림 Kubernetes 네트워크 정책 및 사양을 지원합니다. AWS는 현재
CiliumNetworkPolicy
또는CiliumClusterwideNetworkPolicy
를 지원하지 않습니다. -
policyEnforcementMode
Helm 값을 사용하여 기본 Cilium 정책 시행 동작을 제어할 수 있습니다. 기본 동작은 모든 송신 및 수신 트래픽을 허용합니다. 네트워크 정책에서 엔드포인트를 선택하면 엔드포인트는 명시적으로 허용된 트래픽만 허용되는 default-deny 상태로 전환됩니다. 기본 정책 모드및 정책 시행 모드 에 대한 자세한 내용은 Cilium 문서를 참조하세요. -
기존 Cilium 설치에 대해
policyEnforcementMode
를 변경하는 경우 Cilium 에이전트 DaemonSet를 다시 시작하여 새 정책 시행 모드를 적용해야 합니다. -
namespaceSelector
및podSelector
를 사용하여 일치하는 레이블이 있는 네임스페이스 및 포드와의 트래픽을 허용하거나 거부합니다.namespaceSelector
및podSelector
를matchLabels
또는matchExpressions
와 함께 사용하여 레이블을 기반으로 네임스페이스 및 포드를 선택할 수 있습니다. -
ingress.ports
및egress.ports
를 사용하여 포트 및 프로토콜과의 트래픽을 허용하거나 거부합니다. -
ipBlock
필드는 포드 IP 주소(#9209)와의 트래픽을 선택적으로 허용하거나 거부하는 데 사용할 수 없습니다. 노드 IP에 ipBlock
선택기를 사용하는 것은 Cilium에서 베타 기능으로 AWS에서 지원되지 않습니다. -
Kubernetes 네트워크 정책에 사용 가능한 필드에 대한 자세한 내용은 Kubernetes 문서의 NetworkPolicy 리소스
를 참조하세요.
사전 조건
-
하이브리드 노드에 대한 CNI 구성의 지침에 따라 Cilium이 설치되어 있습니다.
-
명령줄 환경에 Helm이 설치되어 있습니다. Helm 설정 지침을 참조하세요.
절차
다음 절차에서는 구성 요소가 애플리케이션이 작동하는 데 필요한 다른 구성 요소와만 통신할 수 있도록 샘플 마이크로서비스 애플리케이션에 대한 네트워크 정책을 설정합니다. 이 절차에서는 Istio Bookinfo
Bookinfo 애플리케이션은 다음과 같은 관계가 있는 4개의 개별 마이크로서비스로 구성됩니다.
-
productpage. productpage 마이크로서비스는 세부 정보를 호출하고 마이크로서비스를 검토하여 페이지를 채웁니다.
-
details. details 마이크로서비스에는 책 정보가 포함됩니다.
-
reviews. reviews 마이크로서비스에는 책 리뷰가 포함됩니다. 또한 ratings 마이크로서비스를 호출합니다.
-
ratings. ratings 마이크로서비스에는 책 리뷰와 함께 제공되는 책 순위 정보가 포함됩니다.
-
샘플 애플리케이션을 생성합니다.
kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
-
애플리케이션이 성공적으로 실행되고 있는지 확인하고 productpage 마이크로서비스의 포드 IP 주소를 기록합니다. 이 포드 IP 주소를 사용하여 후속 단계에서 각 마이크로서비스를 쿼리합니다.
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE details-v1-766844796b-9wff2 1/1 Running 0 7s 10.86.3.7 mi-0daa253999fe92daa productpage-v1-54bb874995-lwfgg 1/1 Running 0 7s 10.86.2.193 mi-082f73826a163626e ratings-v1-5dc79b6bcd-59njm 1/1 Running 0 7s 10.86.2.232 mi-082f73826a163626e reviews-v1-598b896c9d-p2289 1/1 Running 0 7s 10.86.2.47 mi-026d6a261e355fba7 reviews-v2-556d6457d-djktc 1/1 Running 0 7s 10.86.3.58 mi-0daa253999fe92daa reviews-v3-564544b4d6-g8hh4 1/1 Running 0 7s 10.86.2.69 mi-09183e8a3d755abf6
-
전체적으로 네트워크 정책을 테스트하는 데 사용할 포드를 생성합니다. 포드는 레이블이
access: true
가 있는default
네임스페이스에 생성됩니다.kubectl run curl-pod --image=curlimages/curl -i --tty --labels=access=true --namespace=default --overrides='{"spec": { "nodeSelector": {"eks.amazonaws.com/compute-type": "hybrid"}}}' -- /bin/sh
-
productpage 마이크로서비스에 대한 액세스를 테스트합니다. 아래 예시에서는 productpage 포드(
10.86.2.193
)의 포드 IP 주소를 사용하여 마이크로서비스를 쿼리합니다. 이를 환경에 있는 productpage 포드의 포드 IP 주소로 바꿉니다.curl -s http://10.86.2.193:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
-
exit
를 입력하여 테스트 curl 포드를 종료하고 다음 명령을 실행하여 포드에 다시 연결할 수 있습니다.kubectl attach curl-pod -c curl-pod -i -t
-
다음 단계에서 네트워크 정책의 효과를 보여주기 위해 먼저 BookInfo 마이크로서비스에 대한 모든 트래픽을 거부하는 네트워크 정책을 생성합니다. deny 네트워크 정책을 정의하는
network-policy-deny-bookinfo.yaml
파일을 생성합니다.apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-bookinfo namespace: default spec: podSelector: matchExpressions: - key: app operator: In values: ["productpage", "details", "reviews", "ratings"] policyTypes: - Ingress - Egress
-
클러스터에 deny 네트워크 정책을 적용합니다.
kubectl apply -f network-policy-default-deny-bookinfo.yaml
-
BookInfo 애플리케이션에 대한 액세스를 테스트합니다. 아래 예시에서는 productpage 포드(
10.86.2.193
)의 포드 IP 주소를 사용하여 마이크로서비스를 쿼리합니다. 이를 환경에 있는 productpage 포드의 포드 IP 주소로 바꿉니다.curl http://10.86.2.193:9080/productpage --max-time 10
curl: (28) Connection timed out after 10001 milliseconds
-
productpage 네트워크 정책을 정의하는
network-policy-productpage.yaml
파일을 생성합니다. 이 정책에는 다음 규칙이 있습니다.-
레이블
access: true
가 있는 포드(이전 단계에서 생성된 curl 포드)의 수신 트래픽 허용 -
details, reviews 및 ratings 마이크로서비스의 경우 포트
9080
에서 송신 TCP 트래픽 허용 -
kube-system
네임스페이스에서 실행되는 CoreDNS의 경우 포트53
에서 송신 TCP/UDP 트래픽 허용apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: productpage-policy namespace: default spec: podSelector: matchLabels: app: productpage policyTypes: - Ingress - Egress ingress: - from: - podSelector: matchLabels: access: "true" egress: - to: - podSelector: matchExpressions: - key: app operator: In values: ["details", "reviews", "ratings"] ports: - port: 9080 protocol: TCP - to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: kube-dns ports: - port: 53 protocol: UDP - port: 53 protocol: TCP
-
-
클러스터에 productpage 네트워크 정책을 적용합니다.
kubectl apply -f network-policy-productpage.yaml
-
curl 포드에 연결하고 Bookinfo 애플리케이션에 대한 액세스를 테스트합니다. 이제 productpage 마이크로서비스에 대한 액세스가 허용되지만 다른 마이크로서비스는 여전히 deny 네트워크 정책의 적용 대상이므로 여전히 거부됩니다. 아래 예시에서는 productpage 포드(
10.86.2.193
)의 포드 IP 주소를 사용하여 마이크로서비스를 쿼리합니다. 이를 환경에 있는 productpage 포드의 포드 IP 주소로 바꿉니다.kubectl attach curl-pod -c curl-pod -i -t
curl -s http://10.86.2.193:9080/productpage | grep -o "<title>.*</title>" <title>Simple Bookstore App</title>
curl -s http://10.86.2.193:9080/api/v1/products/1 {"error": "Sorry, product details are currently unavailable for this book."}
curl -s http://10.86.2.193:9080/api/v1/products/1/reviews {"error": "Sorry, product reviews are currently unavailable for this book."}
curl -s http://10.86.2.193:9080/api/v1/products/1/ratings {"error": "Sorry, product ratings are currently unavailable for this book."}
-
details 네트워크 정책을 정의하는
network-policy-details.yaml
파일을 생성합니다. 이 정책은 productpage 마이크로서비스의 수신 트래픽만 허용합니다.apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: details-policy namespace: default spec: podSelector: matchLabels: app: details policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app: productpage
-
reviews 네트워크 정책을 정의하는
network-policy-reviews.yaml
파일을 생성합니다. 이 정책은 productpage 마이크로서비스의 수신 트래픽만 허용하고 ratings 마이크로서비스 및 CoreDNS로의 송신 트래픽만 허용합니다.apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: reviews-policy namespace: default spec: podSelector: matchLabels: app: reviews policyTypes: - Ingress - Egress ingress: - from: - podSelector: matchLabels: app: productpage egress: - to: - podSelector: matchLabels: app: ratings - to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: kube-dns ports: - port: 53 protocol: UDP - port: 53 protocol: TCP
-
ratings 네트워크 정책을 정의하는
network-policy-ratings.yaml
파일을 생성합니다. 이 정책은 productpage 및 reviews 마이크로서비스의 수신 트래픽만 허용합니다.apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: ratings-policy namespace: default spec: podSelector: matchLabels: app: ratings policyTypes: - Ingress ingress: - from: - podSelector: matchExpressions: - key: app operator: In values: ["productpage", "reviews"]
-
details, reviews 및 ratings 네트워크 정책을 클러스터에 적용합니다.
kubectl apply -f network-policy-details.yaml kubectl apply -f network-policy-reviews.yaml kubectl apply -f network-policy-ratings.yaml
-
curl 포드에 연결하고 Bookinfo 애플리케이션에 대한 액세스를 테스트합니다. 아래 예시에서는 productpage 포드(
10.86.2.193
)의 포드 IP 주소를 사용하여 마이크로서비스를 쿼리합니다. 이를 환경에 있는 productpage 포드의 포드 IP 주소로 바꿉니다.kubectl attach curl-pod -c curl-pod -i -t
details 마이크로서비스를 테스트합니다.
curl -s http://10.86.2.193:9080/api/v1/products/1
{"id": 1, "author": "William Shakespeare", "year": 1595, "type": "paperback", "pages": 200, "publisher": "PublisherA", "language": "English", "ISBN-10": "1234567890", "ISBN-13": "123-1234567890"}
reviews 마이크로서비스를 테스트합니다.
curl -s http://10.86.2.193:9080/api/v1/products/1/reviews
{"id": "1", "podname": "reviews-v1-598b896c9d-p2289", "clustername": "null", "reviews": [{"reviewer": "Reviewer1", "text": "An extremely entertaining play by Shakespeare. The slapstick humour is refreshing!"}, {"reviewer": "Reviewer2", "text": "Absolutely fun and entertaining. The play lacks thematic depth when compared to other plays by Shakespeare."}]}
ratings 마이크로서비스를 테스트합니다.
curl -s http://10.86.2.193:9080/api/v1/products/1/ratings
{"id": 1, "ratings": {"Reviewer1": 5, "Reviewer2": 4}}
-
절차 도중 생성한 리소스를 정리합니다.
kubectl delete -f network-policy-deny-bookinfo.yaml kubectl delete -f network-policy-productpage.yaml kubectl delete -f network-policy-details.yaml kubectl delete -f network-policy-reviews.yaml kubectl delete -f network-policy-ratings.yaml kubectl delete -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml kubectl delete pod curl-pod
-