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 수로 되돌리거나, 노드를 직접 종료하면 됩니다.