Kubernetes 네트워크 정책으로 Pod 네트워크 트래픽 제한하기
Kubernetes 네트워크 정책으로 Pod 네트워크 트래픽 제한하기 (Restrict Pod network traffic with Kubernetes network policies)
Kubernetes 네트워크 정책을 사용해 Pod와의 네트워크 트래픽을 제한할 수 있어요. 자세한 내용은 Kubernetes 문서의 Network Policies를 참고하세요.
이 기능을 사용하려면 다음을 구성해야 해요.
- Pod 시작 시 정책 적용을 설정해요. 이는 VPC CNI
DaemonSet의aws-node컨테이너에서 수행해요. - 추가 기능에 대한 네트워크 정책 매개변수를 활성화해요.
- 클러스터가 Kubernetes 네트워크 정책을 사용하도록 구성해요.
시작하기 전에 고려 사항을 검토하세요. 자세한 내용은 고려 사항을 참고하세요.
출처: 문서
본문
사전 요구 사항 (Prerequisites)
최소 클러스터 버전
기존 Amazon EKS 클러스터. 배포하려면 Amazon EKS 시작하기를 참고하세요. 클러스터는 다음 표에 나열된 Kubernetes 버전과 플랫폼 버전 중 하나를 실행해야 해요. 나열된 것보다 이후의 Kubernetes 및 플랫폼 버전도 지원된다는 점에 유의하세요. 현재 Kubernetes 버전은 다음 명령에서 my-cluster를 클러스터 이름으로 바꾸고 실행해 확인할 수 있어요.
aws eks describe-cluster --name my-cluster --query cluster.version --output text
| Kubernetes 버전 | 플랫폼 버전 |
|---|---|
1.27.4 |
eks.5 |
1.26.7 |
eks.6 |
최소 VPC CNI 버전
표준 Kubernetes 네트워크 정책과 관리자 네트워크 정책을 모두 만들려면 VPC CNI 플러그인 버전 1.21을 실행해야 해요. 현재 버전은 다음 명령으로 확인할 수 있어요.
kubectl describe daemonset aws-node --namespace kube-system | grep amazon-k8s-cni: | cut -d : -f 3
버전이 1.21보다 이전이라면 Amazon VPC CNI 업데이트하기(Amazon EKS 추가 기능)를 참고해 1.21 이상으로 업그레이드하세요.
최소 Linux 커널 버전
노드에는 Linux 커널 버전 5.10 이상이 있어야 해요. 커널 버전은 uname -r로 확인할 수 있어요. 최신 버전의 Amazon EKS 최적화 Amazon Linux, Amazon EKS 최적화 가속 Amazon Linux AMI, Bottlerocket AMI를 사용한다면 이미 필요한 커널 버전이 있어요.
Amazon EKS 최적화 가속 Amazon Linux AMI 버전 v20231116 이상은 커널 버전 5.10을 가져요.
1단계: Pod 시작 시 정책 적용 설정
Kubernetes용 Amazon VPC CNI 플러그인은 Pod 프로비저닝과 병렬로 Pod에 대한 네트워크 정책을 구성해요. 새 Pod에 대한 모든 정책이 구성될 때까지 새 Pod의 컨테이너는 기본 허용(default allow) 정책으로 시작돼요. 이를 표준 모드(standard mode)라고 해요. 기본 허용 정책은 새 Pod와의 모든 인그레스 및 이그레스 트래픽이 허용된다는 뜻이에요. 예를 들어 새 Pod가 활성 정책으로 업데이트될 때까지 Pod에는 방화벽 규칙이 적용되지 않아요(모든 트래픽 허용).
NETWORK_POLICY_ENFORCING_MODE 변수를 strict로 설정하면 VPC CNI를 사용하는 Pod가 기본 거부(default deny) 정책으로 시작한 다음 정책이 구성돼요. 이를 엄격 모드(strict mode)라고 해요. 엄격 모드에서는 Pod가 클러스터에서 접근해야 하는 모든 엔드포인트에 대한 네트워크 정책이 있어야 해요. 이 요구사항은 CoreDNS Pod에도 적용된다는 점에 유의하세요. 기본 거부 정책은 호스트 네트워킹(host networking)이 있는 Pod에는 구성되지 않아요.
VPC CNI DaemonSet의 aws-node 컨테이너에서 환경 변수 NETWORK_POLICY_ENFORCING_MODE를 strict로 설정해 기본 네트워크 정책을 변경할 수 있어요.
env:
- name: NETWORK_POLICY_ENFORCING_MODE
value: "strict"
2단계: 추가 기능에 대한 네트워크 정책 매개변수 활성화
네트워크 정책 기능은 기본적으로 노드의 포트 8162를 메트릭에 사용해요. 또한 이 기능은 포트 8163을 상태 프로브(health probe)에 사용해요. 노드나 Pod 안에서 이 포트를 사용해야 하는 다른 애플리케이션을 실행한다면 그 앱은 실행에 실패해요. VPC CNI 버전 v1.14.1 이상부터는 이 포트를 변경할 수 있어요.
추가 기능에 대한 네트워크 정책 매개변수를 활성화하려면 다음 절차를 사용하세요.
AWS Management Console
- Amazon EKS 콘솔을 엽니다.
- 왼쪽 탐색 창에서 Clusters를 선택한 다음, Amazon VPC CNI 추가 기능을 구성하려는 클러스터 이름을 선택합니다.
- Add-ons 탭을 선택합니다.
- 추가 기능 상자 오른쪽 위의 확인란을 선택한 다음 Edit을 선택합니다.
- Configure
Amazon VPC CNI페이지에서:- Version 목록에서
v1.14.0-eksbuild.3이상 버전을 선택합니다. - Optional configuration settings를 확장합니다.
- Configuration values에 JSON 키
"enableNetworkPolicy":와 값"true"를 입력합니다. 결과 텍스트는 유효한 JSON 객체여야 해요. 이 키와 값이 텍스트 상자의 유일한 데이터라면 키와 값을 중괄호{ }로 감쌉니다. 다음 예시는 네트워크 정책 기능이 활성화되고 메트릭과 상태 프로브가 기본 포트 번호로 설정된 경우예요.
{ "enableNetworkPolicy": "true", "nodeAgent": { "healthProbeBindAddr": "8163", "metricsBindAddr": "8162" } } - Version 목록에서
Helm
helm을 통해 Kubernetes용 Amazon VPC CNI 플러그인을 설치했다면 구성을 업데이트해 포트를 변경할 수 있어요. 다음 명령을 실행해 포트를 변경해요. nodeAgent.metricsBindAddr 키 또는 nodeAgent.healthProbeBindAddr 키의 값에 각각 포트 번호를 설정하세요.
helm upgrade --set nodeAgent.metricsBindAddr=8162 --set nodeAgent.healthProbeBindAddr=8163 aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
kubectl
편집기에서 aws-node DaemonSet을 엽니다.
kubectl edit daemonset -n kube-system aws-node
VPC CNI aws-node daemonset 매니페스트의 aws-network-policy-agent 컨테이너에 있는 args:의 다음 명령 인수에서 포트 번호를 바꾸세요.
- args:
- --metrics-bind-addr=:8162
- --health-probe-bind-addr=:8163
3단계: 클러스터가 Kubernetes 네트워크 정책을 사용하도록 구성
이는 Amazon EKS 추가 기능 또는 자체 관리형 추가 기능에 대해 설정할 수 있어요.
AWS CLI를 사용하면 다음 명령을 실행해 클러스터가 Kubernetes 네트워크 정책을 사용하도록 구성할 수 있어요. my-cluster를 클러스터 이름으로, IAM 역할 ARN을 사용 중인 역할로 바꾸세요.
aws eks update-addon --cluster-name my-cluster --addon-name vpc-cni --addon-version v1.14.0-eksbuild.3 \
--service-account-role-arn arn:aws:iam::123456789012:role/AmazonEKSVPCCNIRole \
--resolve-conflicts PRESERVE --configuration-values '{"enableNetworkPolicy": "true"}'
AWS Management Console을 사용해 구성하려면 아래 단계를 따르세요.
- Amazon EKS 콘솔을 엽니다.
- 왼쪽 탐색 창에서 Clusters를 선택한 다음, Amazon VPC CNI 추가 기능을 구성하려는 클러스터 이름을 선택합니다.
- Add-ons 탭을 선택합니다.
- 추가 기능 상자 오른쪽 위의 확인란을 선택한 다음 Edit을 선택합니다.
- Configure
Amazon VPC CNI페이지에서:- Version 목록에서
v1.14.0-eksbuild.3이상 버전을 선택합니다. - Optional configuration settings를 확장합니다.
- Configuration values에 JSON 키
"enableNetworkPolicy":와 값"true"를 입력합니다. 결과 텍스트는 유효한 JSON 객체여야 해요. 이 키와 값이 텍스트 상자의 유일한 데이터라면 키와 값을 중괄호{ }로 감쌉니다. 다음 예시는 네트워크 정책이 활성화된 경우를 보여줘요.
{ "enableNetworkPolicy": "true" } - Version 목록에서
Helm
helm을 통해 Kubernetes용 Amazon VPC CNI 플러그인을 설치했다면 구성을 업데이트해 네트워크 정책을 활성화할 수 있어요. 다음 명령을 실행해 네트워크 정책을 활성화하세요.
helm upgrade --set enableNetworkPolicy=true aws-vpc-cni --namespace kube-system eks/aws-vpc-cni
kubectl
편집기에서 amazon-vpc-cni ConfigMap을 엽니다.
kubectl edit configmap -n kube-system amazon-vpc-cni -o yaml
ConfigMap의 data에 다음 줄을 추가해요.
enable-network-policy-controller: "true"
줄을 추가하면 ConfigMap은 다음 예시와 같아야 해요.
apiVersion: v1
kind: ConfigMap
metadata:
name: amazon-vpc-cni
namespace: kube-system
data:
enable-network-policy-controller: "true"
편집기에서 aws-node DaemonSet을 엽니다.
kubectl edit daemonset -n kube-system aws-node
VPC CNI aws-node daemonset 매니페스트의 aws-network-policy-agent 컨테이너에 있는 args:의 명령 인수 --enable-network-policy=false에서 false를 true로 바꾸세요.
- args:
- --enable-network-policy=true
4단계: 다음 단계
구성을 완료한 후 aws-node Pod가 클러스터에서 실행 중인지 확인해요.
kubectl get pods -n kube-system | grep 'aws-node\|amazon'
예시 출력은 다음과 같아요.
aws-node-gmqp7 2/2 Running 1 (24h ago) 24h
aws-node-prnsh 2/2 Running 1 (24h ago) 24h
버전 1.14 이상의 aws-node Pod에는 컨테이너가 2개 있어요. 이전 버전과 네트워크 정책이 비활성화된 경우에는 aws-node Pod에 컨테이너가 하나만 있어요.
이제 클러스터에 Kubernetes 네트워크 정책을 배포할 수 있어요.
Kubernetes 네트워크 정책을 구현하려면 Kubernetes NetworkPolicy 또는 ClusterNetworkPolicy 객체를 만들고 클러스터에 배포할 수 있어요. NetworkPolicy 객체는 네임스페이스로 범위가 지정되는 반면, ClusterNetworkPolicy 객체는 전체 클러스터나 여러 네임스페이스로 범위를 지정할 수 있어요. 레이블 선택기, 네임스페이스, IP 주소 범위를 기반으로 Pod 간 트래픽을 허용하거나 거부하는 정책을 구현해요. NetworkPolicy 객체 생성에 대한 자세한 내용은 Kubernetes 문서의 Network Policies를 참고하세요.
Kubernetes NetworkPolicy 객체의 적용은 eBPF(Extended Berkeley Packet Filter)를 사용해 구현돼요. iptables 기반 구현에 비해 낮은 지연 시간과 우수한 성능 특성(CPU 사용률 감소, 순차 조회 회피 포함)을 제공해요. 또한 eBPF 프로브는 복잡한 커널 수준 문제를 디버깅하고 관찰 가능성을 개선하는 데 도움이 되는 콘텍스트 풍부한 데이터에 접근을 제공해요. Amazon EKS는 각 노드에서 정책 결과를 기록하고 외부 로그 수집기로 데이터를 내보내 디버깅을 돕는 프로브를 활용하는 eBPF 기반 익스포터를 지원해요. 자세한 내용은 eBPF 문서를 참고하세요.