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을 실행하여 파일을 살펴 보겠습니다.

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

kubectl apply -f namespace.yaml

이후 단계에서 이 네임 스페이스에 프런트 엔드 및 백엔드 replication controllersservices를 만듭니다.

다음 명령을 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을 실행하여 파일을 살펴 봅니다.

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

kubectl apply -f management-ui.yaml

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

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

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

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

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

kubectl apply -f client.yaml

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

kubectl get pods --all-namespaces

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

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

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

  • stars라는 네임스페이스

  • stars 네임 스페이스 내의 프런트엔드백엔드 replica 및 service

  • management-ui라는 네임스페이스

  • management-ui 네임스페이스의 브라우저에 표시되는 사용자 인터페이스에 대한 배포 및 서비스 management-ui

  • client라는 네임스페이스

  • client 네임스페이스 내에 client deployment 및 service

2. 파드 간 기본 통신

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

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

kubectl get svc -o wide -n management-ui

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

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

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을 실행하여 파일을 살펴 보겠습니다.

네트워크 정책을 살펴 보면, 여기에서 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을 실행하여 파일 내용을 검사 할 수 있습니다.

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

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

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

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

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로 살펴 보겠습니다.

yaml 파일의 <EDIT: ~~~>을 편집하여 프런트 엔드와 백엔드 통신이 가능하도록 합니다. 쿠버네티스 문서에서 유용한 정보를 찾을 수 있습니다.

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

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

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

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

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

결론

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

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

Last updated