Amazon EKS 네트워크 정책 Stars 데모

Amazon EKS 네트워크 정책 Stars 데모

이 데모를 통해 Amazon EKS 클러스터에 프론트엔드, 백엔드, 클라이언트 서비스를 만들 수 있습니다. 데모는 각 서비스 사이의 사용 가능한 인그레스(ingress)와 이그레스(egress) 경로를 보여 주는 관리형 그래픽 사용자 인터페이스(management GUI)도 함께 만들니다. 프로덕션 워크로드를 실행하지 않는 클러스터에서 데모를 완료하는 것을 권장합니다.

출처: 문서

본문

프론트엔드, 백엔드, 클라이언트, 관리 UI 서비스 적용

아직 네트워크 정책을 만들기 전에는 모든 서비스가 양방향으로 통신할 수 있습니다. 네트워크 정책을 적용한 뒤에는 클라이언트가 프론트엔드 서비스와만 통신할 수 있고, 백엔드는 프론트엔드로부터의 트래픽만 받는 것을 확인할 수 있습니다.

프론트엔드, 백엔드, 클라이언트, 관리 사용자 인터페이스 서비스를 적용합니다.

kubectl apply -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/management-ui.yaml
kubectl apply -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/backend.yaml
kubectl apply -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/frontend.yaml
kubectl apply -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/client.yaml

클러스터의 모든 Pod를 확인합니다.

kubectl get pods -A

예시 출력은 다음과 같습니다. 출력에서 다음 네임스페이스 영역에 Pod가 보여야 합니다. Pod의 NAMES와 READY 열의 Pod 수는 아래 출력과 다를 수 있습니다. 비슷한 이름의 Pod가 보이고 모두 STATUS 열에 Running이 표시될 때까지 계속 진행하지 마세요.

NAMESPACE         NAME                                       READY   STATUS    RESTARTS   AGE
[...]
client            client-xlffc                               1/1     Running   0          5m19s
[...]
management-ui     management-ui-qrb2g                        1/1     Running   0          5m24s
stars             backend-sz87q                              1/1     Running   0          5m23s
stars             frontend-cscnf                             1/1     Running   0          5m21s
[...]

관리 사용자 인터페이스에 연결하려면 클러스터에서 실행 중인 서비스의 EXTERNAL-IP로 연결합니다.

kubectl get service/management-ui -n management-ui

이전 단계에서 얻은 주소로 브라우저를 엽니다. 관리 사용자 인터페이스가 보일 것입니다. C 노드는 클라이언트 서비스, F 노드는 프론트엔드 서비스, B 노드는 백엔드 서비스입니다. 각 노드는 굵은 색상 선으로 표시된 것처럼 모든 다른 노드와 완전한 통신 권한을 가집니다.

서비스를 서로 격리하려면 stars와 client 네임스페이스에 다음 네트워크 정책을 적용합니다.

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: default-deny
spec:
  podSelector:
    matchLabels: {}

다음 명령을 사용해 두 네임스페이스에 정책을 적용할 수 있습니다.

kubectl apply -n stars -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/apply_network_policies.files/default-deny.yaml
kubectl apply -n client -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/apply_network_policies.files/default-deny.yaml

브라우저를 새로고침합니다. 관리 사용자 인터페이스가 더 이상 어떤 노드에도 도달할 수 없어서 노드가 사용자 인터페이스에 표시되지 않는 것을 확인할 수 있습니다.

관리 사용자 인터페이스가 서비스에 접근할 수 있도록 다음 네트워크 정책을 적용합니다. UI를 허용하려면 이 정책을 적용합니다.

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  namespace: stars
  name: allow-ui
spec:
  podSelector:
    matchLabels: {}
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              role: management-ui

클라이언트를 허용하려면 이 정책을 적용합니다.

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  namespace: client
  name: allow-ui
spec:
  podSelector:
    matchLabels: {}
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              role: management-ui

두 정책을 모두 적용하려면 다음 명령을 사용할 수 있습니다.

kubectl apply -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/apply_network_policies.files/allow-ui.yaml
kubectl apply -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/apply_network_policies.files/allow-ui-client.yaml

브라우저를 새로고침합니다. 관리 사용자 인터페이스가 노드에 다시 도달할 수 있지만, 노드들은 서로 통신할 수 없는 것을 확인할 수 있습니다.

프론트엔드 서비스에서 백엔드 서비스로의 트래픽을 허용하려면 다음 네트워크 정책을 적용합니다.

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  namespace: stars
  name: backend-policy
spec:
  podSelector:
    matchLabels:
      role: backend
  ingress:
    - from:
        - podSelector:
            matchLabels:
              role: frontend
      ports:
        - protocol: TCP
          port: 6379

브라우저를 새로고침합니다. 프론트엔드가 백엔드와 통신할 수 있는 것을 확인할 수 있습니다.

클라이언트에서 프론트엔드 서비스로의 트래픽을 허용하려면 다음 네트워크 정책을 적용합니다.

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  namespace: stars
  name: frontend-policy
spec:
  podSelector:
    matchLabels:
      role: frontend
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              role: client
      ports:
        - protocol: TCP
          port: 80

브라우저를 새로고침합니다. 클라이언트가 프론트엔드 서비스와 통신할 수 있는 것을 확인할 수 있습니다. 프론트엔드 서비스는 여전히 백엔드 서비스와 통신할 수 있습니다.

(선택) 데모 리소스 삭제

(선택 사항) 데모가 끝나면 리소스를 삭제할 수 있습니다.

kubectl delete -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/client.yaml
kubectl delete -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/frontend.yaml
kubectl delete -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/backend.yaml
kubectl delete -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/management-ui.yaml
kubectl delete -f https://raw.githubusercontent.com/aws-samples/eks-workshop/2f9d29ed3f82ed6b083649e975a0e574fb8a4058/content/beginner/120_network-policies/calico/stars_policy_demo/create_resources.files/namespace.yaml

리소스를 삭제한 뒤에도 노드에 네트워크 정책 엔드포인트가 남아 클러스터의 네트워킹을 예상치 못한 방식으로 방해할 수 있습니다. 이러한 규칙을 확실히 제거하는 유일한 방법은 노드를 재부팅하거나 모든 노드를 종료한 뒤 다시 재활용하는 것입니다. 모든 노드를 종료하려면 Auto Scaling Group desired count를 0으로 설정한 뒤 다시 desired 수로 되돌리거나, 노드를 직접 종료하면 됩니다.

더 알아보기 (Learn more)