Kubernetes 네트워크 정책으로 Pod 네트워크 트래픽 제한
Kubernetes 네트워크 정책을 사용하여 Pods에서 송수신되는 네트워크 트래픽을 제한할 수 있습니다. 자세한 내용은 Kubernetes 설명서의 네트워크 정책
이 기능을 사용하려면 다음을 구성해야 합니다.
-
Pod 시작 시 정책 적용을 설정합니다. VPC CNI
DaemonSet
의aws-node
컨테이너에서 이 작업을 수행합니다. -
추가 기능의 네트워크 정책 파라미터를 활성화합니다.
-
Kubernetes 네트워크 정책을 사용하도록 클러스터 구성
시작하기 전에 고려 사항을 검토하세요. 자세한 내용은 고려 사항 단원을 참조하십시오.
사전 조건
다음은 기능의 사전 조건입니다.
* .최소 클러스터 버전 기존 Amazon EKS 클러스터입니다. 배포하려면 Amazon EKS 시작하기 섹션을 참조하세요. 클러스터는 Kubernetes 버전 1.25
이상이어야 합니다. 클러스터는 다음 표에 나열된 Kubernetes 버전 및 플랫폼 버전 중 하나를 실행해야 합니다. 나열된 것보다 이후의 모든 Kubernetes 및 플랫폼 버전도 지원됩니다. 다음 명령에서 my-cluster
를 본인의 클러스터 이름으로 바꾼 다음 수정된 명령을 실행하여 현재 Kubernetes 버전을 확인할 수 있습니다.
+
aws eks describe-cluster --name my-cluster --query cluster.version --output text
+
Kubernetes 버전 | 플랫폼 버전 |
---|---|
|
|
|
|
|
|
* .클러스터의 Amazon VPC CNI plugin for Kubernetes 최소 VPC CNI 버전이 1.14
이상이어야 합니다. 다음 명령을 사용하여 현재 버전을 확인할 수 있습니다.
+
kubectl describe daemonset aws-node --namespace kube-system | grep amazon-k8s-cni: | cut -d : -f 3
+ 버전이 1.14
이하인 경우 Amazon VPC CNI(Amazon EKS 애드온) 업데이트하기의 내용을 참조하여 버전을 1.14
이상으로 업그레이드합니다. * .최소 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 시작 시 정책 적용 설정
Amazon VPC CNI plugin for Kubernetes는 포드 프로비저닝과 병행하여 포드에 대한 네트워크 정책을 구성합니다. 새 포드에 대해 모든 정책이 구성될 때까지 새 포드의 컨테이너는 기본 허용 정책으로 시작됩니다. 이를 표준 모드라고 합니다. 기본 허용 정책은 새 포드를 오가는 모든 수신 및 송신 트래픽이 허용됨을 의미합니다. 예를 들어 새 포드가 활성 정책으로 업데이트될 때까지 포드에는 방화벽 규칙이 적용되지 않습니다(모든 트래픽이 허용됨).
NETWORK_POLICY_ENFORCING_MODE
변수가 strict
로 설정되면 VPC CNI를 사용하는 포드는 기본 거부 정책으로 시작하고, 정책이 구성됩니다. 이를 엄격 모드라고 합니다. 엄격 모드에서는 클러스터에서 포드가 액세스해야 하는 모든 엔드포인트에 대한 네트워크 정책이 있어야 합니다. 이 요구 사항은 CoreDNS 포드에 적용됩니다. 호스트 네트워킹을 사용하는 포드에는 기본 거부 정책이 구성되어 있지 않습니다.
VPC CNI DaemonSet
의 aws-node
컨테이너에서 환경 변수 NETWORK_POLICY_ENFORCING_MODE
를 strict
로 설정하여 기본 네트워크 정책을 변경할 수 있습니다.
env: - name: NETWORK_POLICY_ENFORCING_MODE value: "strict"
2단계: 추가 기능의 네트워크 정책 파라미터 활성화
네트워크 정책 기능은 기본적으로 노드의 포트 8162
를 지표에 사용합니다. 또한 이 기능은 상태 프로브에 포트 8163
을 사용했습니다. 이러한 포트를 사용해야 하는 노드 또는 포드 내부에서 다른 애플리케이션을 실행하면 앱이 실행되지 않습니다. VPC CNI 버전 v1.14.1
이상에서는 이러한 포트를 변경할 수 있습니다.
다음 절차를 사용하여 추가 기능에 대한 네트워크 정책 파라미터를 활성화합니다.
- AWS Management Console
-
-
Amazon EKS 콘솔
을 엽니다. -
왼쪽 탐색 창에서 클러스터를 선택한 다음 Amazon VPC CNI 추가 기능을 구성할 클러스터의 이름을 선택합니다.
-
추가 기능(Add-ons) 탭을 선택합니다.
-
추가 기능 상자의 오른쪽 상단에 있는 상자를 선택한 다음에 Edit(편집)를 선택합니다.
-
name of add-on
구성 페이지에서 다음을 수행합니다.-
버전 목록에서
v1.14.0-eksbuild.3
이상 버전을 선택합니다. -
선택적 구성 설정을 확장합니다.
-
구성 값에 JSON 키
"enableNetworkPolicy":
및 값"true"
를 입력합니다. 결과 텍스트는 유효한 JSON 객체여야 합니다. 이 키와 값이 텍스트 상자의 유일한 데이터인 경우 키와 값을 중괄호({ }
)로 둘러쌉니다.다음 예제에서는 네트워크 정책 기능이 활성화되어 있고 지표 및 상태 프로브가 기본 포트 번호로 설정되어 있습니다.
{ "enableNetworkPolicy": "true", "nodeAgent": { "healthProbeBindAddr": "8163", "metricsBindAddr": "8162" } }
-
-
- Helm
-
helm
을 통해 Amazon VPC CNI plugin for Kubernetes를 설치한 경우 구성을 업데이트하여 포트를 변경할 수 있습니다.-
다음 명령을 실행하여 포트를 변경합니다. 키
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
데몬 세트 매니페스트의aws-network-policy-agent
컨테이너에 있는args:
의 다음 명령 인수에서 포트 번호를 바꿉니다.- args: - --metrics-bind-addr=:8162 - --health-probe-bind-addr=:8163
-
3단계: 각 노드에 Berkeley Packet Filter(BPF) 파일 시스템 탑재
각 노드에 Berkeley Packet Filter(BPF) 파일 시스템을 탑재해야 합니다.
참고
클러스터가 버전 1.27
이상인 경우 모든 Amazon EKS 최적화 Amazon Linux 및 Bottlerocket AMI 1.27
이상에 이미 이 기능이 있습니다.
다른 모든 클러스터 버전의 경우 Amazon EKS 최적화 Amazon Linux를 v20230703
이상으로 업그레이드하거나 Bottlerocket AMI를 버전 v1.0.2
이상으로 업그레이드한 경우 이 단계를 건너뛸 수 있습니다.
-
각 노드에 버클리 패킷 필터(BPF) 파일 시스템을 탑재합니다.
sudo mount -t bpf bpffs /sys/fs/bpf
-
그런 다음 Amazon EC2 Auto Scaling 그룹용 시작 템플릿의 사용자 데이터에 동일한 명령을 추가합니다.
4단계: Kubernetes 네트워크 정책을 사용하도록 클러스터 구성
Kubernetes 네트워크 정책을 사용하도록 클러스터를 구성합니다. Amazon EKS 추가 기능 또는 자체 관리형 추가 기능에 대해 이를 설정할 수 있습니다.
- AWS Management Console
-
-
Amazon EKS 콘솔
을 엽니다. -
왼쪽 탐색 창에서 클러스터를 선택한 다음 Amazon VPC CNI 추가 기능을 구성할 클러스터의 이름을 선택합니다.
-
추가 기능(Add-ons) 탭을 선택합니다.
-
추가 기능 상자의 오른쪽 상단에 있는 상자를 선택한 다음에 Edit(편집)를 선택합니다.
-
name of add-on
구성 페이지에서 다음을 수행합니다.-
버전 목록에서
v1.14.0-eksbuild.3
이상 버전을 선택합니다. -
선택적 구성 설정을 확장합니다.
-
구성 값에 JSON 키
"enableNetworkPolicy":
및 값"true"
를 입력합니다. 결과 텍스트는 유효한 JSON 객체여야 합니다. 이 키와 값이 텍스트 상자의 유일한 데이터인 경우 키와 값을 중괄호({ }
)로 둘러쌉니다. 다음 예시는 네트워크 정책이 활성화된 것을 보여줍니다.{ "enableNetworkPolicy": "true" }
다음 스크린샷은 이 시나리오의 예를 보여줍니다.
-
-
- AWS CLI
-
-
다음 AWS CLI 명령을 실행합니다.
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"}'
-
- Helm
-
helm
을 통해 Amazon VPC CNI plugin for Kubernetes를 설치한 경우 구성을 업데이트하여 네트워크 정책을 활성화할 수 있습니다.-
다음 명령을 실행하여 네트워크 정책을 활성화합니다.
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
데몬 세트 매니페스트의aws-network-policy-agent
컨테이너에 있는args:
의 명령 인수--enable-network-policy=false
에서false
를true
로 바꿉니다.- args: - --enable-network-policy=true
-
5단계. 다음 단계
구성을 완료한 후 aws-node
포드가 클러스터에서 실행 중인지 확인합니다.
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
포드에 2개의 컨테이너가 있습니다. 이전 버전에서 네트워크 정책이 비활성화된 경우 aws-node
포드에 하나의 컨테이너만 있습니다.
이제 클러스터에 Kubernetes 네트워크 정책을 배포할 수 있습니다.
생성한 Kubernetes NetworkPolicy
개체에 Kubernetes 네트워크 정책을 구현하고 이를 클러스터에 배포하려면 NetworkPolicy
개체 범위는 네임스페이스로 지정됩니다. 정책을 구현하여 레이블 선택기, 네임스페이스 및 IP 주소 범위를 기반으로 Pods 사이의 트래픽을 허용 또는 거부합니다. NetworkPolicy
개체 생성에 관한 자세한 내용은 Kubernetes 설명서의 네트워크 정책
Kubernetes NetworkPolicy
개체의 적용은 Extended Berkeley Packet Filter(eBPF)를 사용하여 구현됩니다. iptables
기반 구현에 따라 지연 시간을 낮추고 CPU 활용률 감소 및 순차 조회 방지를 포함한 성능 특성을 제공합니다. 추가로 eBPF 프로브는 복잡한 커널 수준 문제를 디버깅하고 관찰성을 개선하는 데 도움이 되도록 컨텍스트가 풍부한 데이터에 대한 액세스를 제공합니다. Amazon EKS는 프로브를 활용하여 각 노드에 정책 결과를 기록하고 외부 로그 수집기로 데이터를 내보내 디버깅을 지원하는 eBPF 기반 익스포터를 지원합니다. 자세한 내용은 eBDF 설명