

 **이 페이지 개선에 도움 주기** 

이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 **GitHub에서 이 페이지 편집** 링크를 선택합니다.

# 하이브리드 노드에 대한 Kubernetes 네트워크 정책 구성
<a name="hybrid-nodes-network-policies"></a>

 AWS는 Cilium을 EKS Hybrid Nodes에서 CNI로 사용할 때 포드 수신 및 송신 트래픽에 대해 Kubernetes 네트워크 정책(계층 3/계층 4)을 지원합니다. AWS 클라우드의 노드에서 EKS 클러스터를 실행하는 경우 AWS는 [Amazon VPC CNI for Kubernetes 네트워크 정책](cni-network-policy.md)을 지원합니다.

이 주제에서는 EKS Hybrid Nodes를 사용하여 Cilium 및 Kubernetes 네트워크 정책을 구성하는 방법을 설명합니다. Kubernetes 네트워크 정책에 대한 자세한 내용은 Kubernetes 문서의 [Kubernetes 네트워크 정책](https://kubernetes.io/docs/concepts/services-networking/network-policies/)을 참조하세요.

## 네트워크 정책 구성
<a name="hybrid-nodes-configure-network-policies"></a>

### 고려 사항
<a name="_considerations"></a>
+  AWS는 포드 수신 및 송신에 업스트림 Kubernetes 네트워크 정책 및 사양을 지원합니다. AWS는 현재 `CiliumNetworkPolicy` 또는 `CiliumClusterwideNetworkPolicy`를 지원하지 않습니다.
+ `policyEnforcementMode` Helm 값을 사용하여 기본 Cilium 정책 시행 동작을 제어할 수 있습니다. 기본 동작은 모든 송신 및 수신 트래픽을 허용합니다. 네트워크 정책에서 엔드포인트를 선택하면 엔드포인트는 명시적으로 허용된 트래픽만 허용되는 default-deny 상태로 전환됩니다. [기본 정책 모드](https://docs.cilium.io/en/stable/security/policy/intro/#policy-mode-default) 및 [정책 시행 모드](https://docs.cilium.io/en/stable/security/policy/intro/#policy-enforcement-modes)에 대한 자세한 내용은 Cilium 문서를 참조하세요.
+ 기존 Cilium 설치에 대해 `policyEnforcementMode`를 변경하는 경우 Cilium 에이전트 DaemonSet를 다시 시작하여 새 정책 시행 모드를 적용해야 합니다.
+ `namespaceSelector` 및 `podSelector`를 사용하여 일치하는 레이블이 있는 네임스페이스 및 포드와의 트래픽을 허용하거나 거부합니다. `namespaceSelector` 및 `podSelector`를 `matchLabels` 또는 `matchExpressions`와 함께 사용하여 레이블을 기반으로 네임스페이스 및 포드를 선택할 수 있습니다.
+ `ingress.ports` 및 `egress.ports`를 사용하여 포트 및 프로토콜과의 트래픽을 허용하거나 거부합니다.
+ `ipBlock` 필드는 포드 IP 주소([\#9209](https://github.com/cilium/cilium/issues/9209))와의 트래픽을 선택적으로 허용하거나 거부하는 데 사용할 수 없습니다. 노드 IP에 `ipBlock` 선택기를 사용하는 것은 Cilium에서 베타 기능으로 AWS에서 지원되지 않습니다.
+ Kubernetes 네트워크 정책에 사용 가능한 필드에 대한 자세한 내용은 Kubernetes 문서의 [NetworkPolicy 리소스](https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource)를 참조하세요.

### 사전 조건
<a name="_prerequisites"></a>
+ [하이브리드 노드에 대한 CNI 구성](hybrid-nodes-cni.md)의 지침에 따라 Cilium이 설치되어 있습니다.
+ 명령줄 환경에 Helm이 설치되어 있습니다. [Helm 설정 지침](helm.md)을 참조하세요.

### 절차
<a name="_procedure"></a>

다음 절차에서는 구성 요소가 애플리케이션이 작동하는 데 필요한 다른 구성 요소와만 통신할 수 있도록 샘플 마이크로서비스 애플리케이션에 대한 네트워크 정책을 설정합니다. 이 절차에서는 [Istio Bookinfo](https://istio.io/latest/docs/examples/bookinfo/) 샘플 마이크로서비스 애플리케이션을 사용합니다.

Bookinfo 애플리케이션은 다음과 같은 관계가 있는 4개의 개별 마이크로서비스로 구성됩니다.
+  **productpage**. productpage 마이크로서비스는 세부 정보를 호출하고 마이크로서비스를 검토하여 페이지를 채웁니다.
+  **details**. details 마이크로서비스에는 책 정보가 포함됩니다.
+  **reviews**. reviews 마이크로서비스에는 책 리뷰가 포함됩니다. 또한 ratings 마이크로서비스를 호출합니다.
+  **ratings**. ratings 마이크로서비스에는 책 리뷰와 함께 제공되는 책 순위 정보가 포함됩니다.

  1. 샘플 애플리케이션을 생성합니다.

     ```
     kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
     ```

  1. 애플리케이션이 성공적으로 실행되고 있는지 확인하고 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
     ```

  1. 전체적으로 네트워크 정책을 테스트하는 데 사용할 포드를 생성합니다. 포드는 레이블이 `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
     ```

  1. 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>
     ```

  1. `exit`를 입력하여 테스트 curl 포드를 종료하고 다음 명령을 실행하여 포드에 다시 연결할 수 있습니다.

     ```
     kubectl attach curl-pod -c curl-pod -i -t
     ```

  1. 다음 단계에서 네트워크 정책의 효과를 보여주기 위해 먼저 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
     ```

  1. 클러스터에 deny 네트워크 정책을 적용합니다.

     ```
     kubectl apply -f network-policy-default-deny-bookinfo.yaml
     ```

  1. 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
     ```

  1. 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
       ```

  1. 클러스터에 productpage 네트워크 정책을 적용합니다.

     ```
     kubectl apply -f network-policy-productpage.yaml
     ```

  1. 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."}
     ```

  1. 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
     ```

  1. 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
     ```

  1. 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"]
     ```

  1. details, reviews 및 ratings 네트워크 정책을 클러스터에 적용합니다.

     ```
     kubectl apply -f network-policy-details.yaml
     kubectl apply -f network-policy-reviews.yaml
     kubectl apply -f network-policy-ratings.yaml
     ```

  1. 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}}
     ```

  1. 절차 도중 생성한 리소스를 정리합니다.

     ```
     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
     ```