# Stars Policy Demo

이 실습에서는 EKS 클러스터에 프런트엔드, 백엔드, 클라이언트 및 UI 서비스를 만들고 이러한 서비스 간의 통신을 허용하거나 차단하는 네트워크 정책을 정의합니다. 이 데모에는 각 서비스간에 사용 가능한 수신 및 송신 경로를 보여주는 관리 UI도 있습니다.

## 1. 사전 준비하기

네트워크 정책을 만들기 전에 필요한 리소스를 만들어 보겠습니다. 구성 파일에 대한 새 폴더를 만듭니다.

```
mkdir ~/environment/calico_resources
cd ~/environment/calico_resources

```

다음 명령을 Cloud9 터미널에 복사/붙여넣기 하여 stars 네임스페이스를 생성합니다.

```
cd ~/environment/calico_resources
wget https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/namespace.yaml

```

`cat namespace.yaml`을 실행하여 파일을 살펴 보겠습니다.

![](/files/-MhEfo1PZvju8iX-ESAA)

stars라는 네임스페이스를 만듭니다.

```
kubectl apply -f namespace.yaml

```

이후 단계에서 이 네임 스페이스에 프런트 엔드 및 백엔드 [replication controllers](https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/)와 [services](https://kubernetes.io/docs/concepts/services-networking/service/)를 만듭니다.

다음 명령을 Cloud9 터미널에 복사/붙여넣기 합니다.

```
cd ~/environment/calico_resources
wget https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/management-ui.yaml
wget https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/backend.yaml
wget https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/frontend.yaml
wget https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/client.yaml

```

`cat management-ui.yaml`을 실행하여 파일을 살펴 봅니다.

![](/files/-MhEgJUG9jcBRbtMVS_q)

해당 네임 스페이스 내에서 관리 UI 서비스 및 레플리카 컨트롤러를 사용하여 관리 UI 네임 스페이스를 만듭니다.

```
kubectl apply -f management-ui.yaml

```

`cat backend.yaml` 과 `cat frontend.yaml`을 실행하여 백엔드 서비스와 프런트 엔드 서비스가 어떻게 구축 되었는지 확인 합니다.

stars 네임 스페이스 내에서 프런트 엔드 및 백엔드 레플리카 컨트롤러와 서비스를 만듭니다.

```
kubectl apply -f backend.yaml
kubectl apply -f frontend.yaml

```

마지막으로 `cat client.yaml`을 실행하여 클라이언트 네임 스페이스와 레플리카 컨트롤러에 대한 클라이언트 서비스를 살펴 보겠습니다.&#x20;

![](/files/-MhEh2a6xO9yozZgtuKm)

클라이언트 구성을 적용 합니다.

```
kubectl apply -f client.yaml

```

상태를 확인하고 모든 파드가 실행 중 상태가 될 때까지 기다립니다:

```
kubectl get pods --all-namespaces

```

출력은 다음과 같아야 합니다.

![](/files/-MhEhIHIYWa-4yKnXILJ)

필요한 모든 Docker 이미지를 다운로드 하는데 몇 분 정도 걸릴 수 있습니다.

생성한 리소스를 요약하면 다음과 같습니다.

* **stars**라는 네임스페이스
* **stars** 네임 스페이스 내의 **프런트엔드** 및 **백엔드** replica 및 service
* **management-ui**라는 네임스페이스
* **management-ui** 네임스페이스의 브라우저에 표시되는 사용자 인터페이스에 대한 배포 및 서비스 **management-ui**
* **client**라는 네임스페이스
* **client** 네임스페이스 내에 **client** deployment 및 service

## 2. 파드 간 기본 통신

쿠버네티스에서 **파드는 기본적으로 어떤 호스트에 연결 되었는지에 관계없이 다른 파드와 통신 할 수 있습니다**. 모든 파드에는 고유 한 IP 주소가 있으므로 파드간에 링크를 명시적으로 만들 필요가 없습니다. 이것은 **management-ui**에 의해 시연 됩니다.

![](/files/-MhEiATlhUB6NP_tX7ol)

관리 UI를 열려면 다음을 사용하여 관리 UI의 DNS 이름을 검색 하십시오:

```
kubectl get svc -o wide -n management-ui

```

결과에서 **EXTERNAL-IP**를 복사하고 브라우저에 붙여 넣습니다. EXTERNAL-IP 열에는 “elb.amazonaws.com”으로 끝나는 값이 포함됩니다.&#x20;

![](/files/-MhEiUH0sX2Zm-uDgHNL)

여기의 UI는 서로 연결할 수 있는 모든 서비스의 기본 동작을 보여 줍니다.

![](/files/-MhEicHK-NjaYms1ls2g)

## 3. 네트워크 정책 적용하기

프로덕션 수준의 클러스터에서 파드 간 통신을 개방하는 것은 안전하지 않습니다. 서비스를 서로 분리하는 방법을 살펴 보겠습니다.

다음 명령을 Cloud9 터미널에 복사/붙여넣기 하십시오.

```
cd ~/environment/calico_resources
wget https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/apply_network_policies.files/default-deny.yaml

```

`cat default-deny.yaml`을 실행하여 파일을 살펴 보겠습니다.

![](/files/-MhEj77ieUcoLHxj3mou)

네트워크 정책을 살펴 보면, 여기에서 podSelector에는 matchLabels가 없으므로 기본적으로 모든 pod가 액세스하지 못하도록 차단합니다.

**stars** 네임스페이스 (프런트 엔드 및 백엔드 서비스) 및 **client** 네임스페이스 (클라이언트 서비스)에 네트워크 정책을 적용합니다.

```
kubectl apply -n stars -f default-deny.yaml
kubectl apply -n client -f default-deny.yaml

```

브라우저를 새로 고치면 관리 UI가 노드에 도달 할 수 없으므로 UI에 아무것도 표시되지 않습니다.

쿠버네티스의 네트워크 정책은 레이블을 사용하여 파드를 선택하고 해당 파드에 도달 할 수 있는 트래픽에 대한 규칙을 정의 합니다. 수신 또는 송신 또는 둘 다를 지정 할 수 있습니다. 각 규칙은 from 및 ports 섹션 모두와 일치하는 트래픽을 허용합니다.

두 개의 새 네트워크 정책을 만듭니다.

다음 명령을 Cloud9 터미널에 복사/붙여넣기 하십시오.

```
cd ~/environment/calico_resources
wget https://eksworkshop.com/calico/stars_policy_demo/apply_network_policies.files/allow-ui.yaml
wget https://eksworkshop.com/calico/stars_policy_demo/apply_network_policies.files/allow-ui-client.yaml

```

다시 `cat allow-ui.yaml`을 실행하여 파일 내용을 검사 할 수 있습니다.

![](/files/-MhEjaryXve0Zz8srxHK)

`cat allow-ui-client.yaml`을 실행하여 파일 내용을 검사 할 수 있습니다.

![](/files/-MhEjjLrrQDTnesxBAmt)

해당 허용 정책을 적용하고 관리 UI를 확인합니다.

```
kubectl apply -f allow-ui.yaml
kubectl apply -f allow-ui-client.yaml

```

브라우저를 새로 고치면 관리 UI가 모든 서비스에 도달 할 수 있지만 서로 통신 할 수 없음을 알 수 있습니다.

![](/files/-MhElFQ36cMtmfveWT-O)

## 4. 방향성 트래픽 허용하기

클라이언트에서 프런트 엔드 및 백엔드로의 방향성 트래픽을 허용하는 방법을 살펴 보겠습니다.

다음 명령을 Cloud9 터미널에 복사/붙여넣기 하십시오.

```
cd ~/environment/calico_resources
wget https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/directional_traffic.files/backend-policy.yaml
wget https://eksworkshop.com/beginner/120_network-policies/calico/stars_policy_demo/directional_traffic.files/frontend-policy.yaml

```

이 백엔드 정책을 `cat backend-policy.yaml`로 살펴 보겠습니다.

![](/files/-MhElfvQEZn0ODPiimWh)

yaml 파일의 \<EDIT: \~\~\~>을 편집하여 프런트 엔드와 백엔드 통신이 가능하도록 합니다. [쿠버네티스 문서](https://kubernetes.io/docs/concepts/services-networking/network-policies/)에서 유용한 정보를 찾을 수 있습니다.&#x20;

```
  ingress:
    - from:
        - podSelector:
            matchLabels:
              role: frontend
```

`cat frontend-policy.yaml`로 프런트 엔드 정책을 살펴 보겠습니다.  프런트 엔드와 클라이언트가 통신이 가능하도록 편집합니다.

![](/files/-MhEn31S_Ud28Vzf8M9S)

```
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              role: client
```

수정한 허용 정책을 적용하고 관리 UI를 확인합니다.

```
kubectl apply -f backend-policy.yaml
kubectl apply -f frontend-policy.yaml

```

![](/files/-MhEnjXLOxU_Zam_9mti)

**결론**

백엔드 정책을 살펴 보면 Spec에는 라벨이 **role:backend**인 모든 파드를 선택하고 라벨이 **role:frontend**이고 TCP 포트 **6379**에 있는 모든 파드에서 수신을 허용하는 podSelector가 있습니다. 특정 포트 번호에서 한 방향으로 트래픽이 허용 됩니다.

![](/files/-MhEoFMFeQrFRqHs8ABR)

프런트 엔드 정책은 TCP 포트 **80**에서 **role:client** 라벨이 있는 **네임 스페이스**에서 수신을 허용 한다는 점을 제외하고 유사 합니다.

![](/files/-MhEoL_U4oeLCnW1r0Zb)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wjlee81.gitbook.io/amazon-eks/untitled-12/stars-policy-demo.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
