기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
AWS 보안 그룹은 EC2 인스턴스가 인바운드 및 아웃바운드 트래픽을 제어하는 가상 방화벽 역할을 합니다. 기본적으로 Amazon VPC CNI는 노드의 기본 ENI와 연결된 보안 그룹을 사용합니다. 더 구체적으로 말하자면 인스턴스와 연결된 모든 ENI는 동일한 EC2 보안 그룹을 갖게 됩니다. 따라서 노드의 모든 포드는 노드가 실행되는 노드와 동일한 보안 그룹을 공유합니다.
아래 이미지에서 볼 수 있듯이 작업자 노드에서 작동하는 모든 애플리케이션 포드는 RDS 데이터베이스 서비스에 액세스할 수 있습니다(RDS 인바운드가 노드 보안 그룹을 허용함을 고려). 보안 그룹은 노드에서 실행되는 모든 포드에 적용되므로 너무 세분화되어 있습니다. 포드용 보안 그룹은 심층 방어 전략의 필수 부분인 워크로드에 대한 네트워크 세분화를 제공합니다.

포드용 보안 그룹을 사용하면 공유 컴퓨팅 리소스에서 다양한 네트워크 보안 요구 사항이 있는 애플리케이션을 실행하여 컴퓨팅 효율성을 개선할 수 있습니다. Pod-to-Pod 및 Pod-to-External AWS 서비스와 같은 여러 유형의 보안 규칙을 EC2 보안 그룹을 사용하여 한 곳에서 정의하고 Kubernetes 네이티브 APIs. 아래 이미지는 포드 수준에서 적용된 보안 그룹과 이러한 보안 그룹이 애플리케이션 배포 및 노드 아키텍처를 간소화하는 방법을 보여줍니다. 이제 포드가 Amazon RDS 데이터베이스에 액세스할 수 있습니다.

VPC CNI에를 설정하여 포드ENABLE_POD_ENI=true
에 대한 보안 그룹을 활성화할 수 있습니다. 활성화되면 컨트롤 플레인(EKS에서 관리)에서 실행되는 VPC 리소스 컨트롤러는AmazonEKSVPCResourceController
관리형 정책을 추가해야 합니다.
또한 컨트롤러는 "aws-k8s-branch-eni"라는 브랜치 인터페이스를 생성하고 트렁크 인터페이스와 연결합니다. 포드에는 SecurityGroupPolicy

브랜치 인터페이스 용량은 보조 IP 주소에 대한 기존 인스턴스 유형 제한에 추가됩니다. 보안 그룹을 사용하는 포드는 max-pods 공식에서 고려되지 않으므로 포드에 보안 그룹을 사용하는 경우 max-pods 값을 높이는 것을 고려하거나 노드가 실제로 지원할 수 있는 것보다 적은 수의 포드를 실행하는 것이 좋습니다.
m5.large는 최대 9개의 브랜치 네트워크 인터페이스와 표준 네트워크 인터페이스에 할당된 최대 27개의 보조 IP 주소를 가질 수 있습니다. 아래 예제에서 볼 수 있듯이 m5.large의 기본 최대 포드는 29이며 EKS는 보안 그룹을 사용하는 포드를 최대 포드에 계산합니다. 노드의 최대 포드를 변경하는 방법에 대한 지침은 EKS 사용 설명서를 참조하세요.
포드의 보안 그룹을 사용자 지정 네트워킹과 함께 사용하는 경우, ENIConfig에 지정된 보안 그룹이 아닌 포드의 보안 그룹에 정의된 보안 그룹이 사용됩니다. 따라서 사용자 지정 네트워킹이 활성화되면 포드당 보안 그룹을 사용하는 동안 보안 그룹 순서를 신중하게 평가합니다.
추천
Liveness 프로브에 대한 TCP 초기 Demux 비활성화
라이브니스 또는 준비 프로브를 사용하는 경우 kubelet이 TCP를 통해 브랜치 네트워크 인터페이스의 포드에 연결할 수 있도록 TCP 초기 Demux도 비활성화해야 합니다. 이는 엄격한 모드에서만 필요합니다. 이렇게 하려면 다음 명령을 실행합니다.
kubectl edit daemonset aws-node -n kube-system
initContainer
섹션에서의 값을 DISABLE_TCP_EARLY_DEMUX
로 변경합니다. true.
포드용 보안 그룹을 사용하여 기존 AWS 구성 투자를 활용합니다.
보안 그룹을 사용하면 RDS 데이터베이스 또는 EC2 인스턴스와 같은 VPC 리소스에 대한 네트워크 액세스를 더 쉽게 제한할 수 있습니다. 포드당 보안 그룹의 한 가지 명확한 이점은 기존 AWS 보안 그룹 리소스를 재사용할 수 있다는 것입니다. 보안 그룹을 네트워크 방화벽으로 사용하여 AWS 서비스에 대한 액세스를 제한하는 경우 브랜치 ENIs를 사용하여 포드에 보안 그룹을 적용하는 것이 좋습니다. EC2 인스턴스에서 EKS로 앱을 전송하고 보안 그룹이 있는 다른 AWS 서비스에 대한 액세스를 제한하는 경우 포드에 대한 보안 그룹을 사용하는 것이 좋습니다.
포드 보안 그룹 적용 모드 구성
Amazon VPC CNI 플러그인 버전 1.11에 라는 새 설정POD_SECURITY_GROUP_ENFORCING_MODE
("적용 모드")이 추가되었습니다. 적용 모드는 포드에 적용되는 보안 그룹과 소스 NAT가 활성화되어 있는지 여부를 모두 제어합니다. 적용 모드를 엄격 또는 표준으로 지정할 수 있습니다. 엄격은 기본값으로,가 로 ENABLE_POD_ENI
설정된 VPC CNI의 이전 동작을 반영합니다true
.
엄격한 모드에서는 브랜치 ENI 보안 그룹만 적용됩니다. 소스 NAT도 비활성화됩니다.
표준 모드에서는 기본 ENI 및 브랜치 ENI(포드와 연결됨)와 연결된 보안 그룹이 적용됩니다. 네트워크 트래픽은 두 보안 그룹을 모두 준수해야 합니다.
주의
모드 변경은 새로 시작된 포드에만 영향을 미칩니다. 기존 포드는 포드가 생성될 때 구성된 모드를 사용합니다. 고객은 트래픽 동작을 변경하려는 경우 보안 그룹으로 기존 포드를 재활용해야 합니다.
적용 모드: 포드 및 노드 트래픽을 격리하려면 엄격한 모드를 사용합니다.
기본적으로 포드의 보안 그룹은 "엄격 모드"로 설정됩니다. 포드 트래픽을 노드의 나머지 트래픽과 완전히 분리해야 하는 경우이 설정을 사용합니다. 엄격 모드에서는 브랜치 ENI 아웃바운드 보안 그룹을 사용할 수 있도록 소스 NAT가 꺼져 있습니다.
주의
엄격 모드가 활성화되면 포드의 모든 아웃바운드 트래픽이 노드에서 나가 VPC 네트워크에 들어갑니다. 동일한 노드의 포드 간 트래픽은 VPC를 통과합니다. 이렇게 하면 VPC 트래픽이 증가하고 노드 기반 기능이 제한됩니다. NodeLocal DNSCache는 엄격한 모드에서 지원되지 않습니다.
적용 모드: 다음 상황에서 표준 모드 사용
포드의 컨테이너에 표시되는 클라이언트 소스 IP
클라이언트 소스 IP를 포드의 컨테이너에 계속 표시해야 하는 경우를 POD_SECURITY_GROUP_ENFORCING_MODE
로 설정하는 것이 좋습니다standard
. Kubernetes 서비스는 클라이언트 소스 IP(기본 유형 클러스터)의 보존을 지원하기 위해 externalTrafficPolicy=local을 지원합니다. 이제 표준 모드에서 externalTrafficPolicy가 Local로 설정된 인스턴스 대상을 사용하여 NodePort 및 LoadBalancer 유형의 Kubernetes 서비스를 실행할 수 있습니다.는 클라이언트 소스 IP를 Local
보존하고 LoadBalancer 및 NodePort 유형 서비스에 대한 두 번째 홉을 방지합니다.
NodeLocal DNSCache 배포
포드에 보안 그룹을 사용하는 경우 NodeLocal DNSCache
노드에 대한 모든 네트워크 트래픽이 VPC에 들어오기 때문에 NodeLocal DNSCache는 엄격한 모드에서 지원되지 않습니다.
Kubernetes 네트워크 정책 지원
보안 그룹이 연결된 포드와 함께 네트워크 정책을 사용할 때는 표준 적용 모드를 사용하는 것이 좋습니다.
클러스터에 속하지 않는 AWS 서비스에 대한 네트워크 수준 액세스를 제한하려면 포드에 대한 보안 그룹을 활용하는 것이 좋습니다. 네트워크 정책을 고려하여 클러스터 내의 포드 간 네트워크 트래픽을 제한합니다. 이를 동부/서부 트래픽이라고도 합니다.
포드당 보안 그룹과의 비호환성 식별
Windows 기반 및 비nitro 인스턴스는 포드에 대한 보안 그룹을 지원하지 않습니다. 포드가 있는 보안 그룹을 활용하려면 인스턴스에 isTrunkingEnabled로 태그를 지정해야 합니다. 포드가 VPC 내부 또는 외부의 AWS 서비스에 의존하지 않는 경우 네트워크 정책을 사용하여 보안 그룹 대신 포드 간 액세스를 관리합니다.
포드당 보안 그룹을 사용하여 AWS 서비스로의 트래픽을 효율적으로 제어
EKS 클러스터 내에서 실행되는 애플리케이션이 RDS 데이터베이스와 같은 VPC 내의 다른 리소스와 통신해야 하는 경우 포드에 SGs를 사용하는 것이 좋습니다. CIDR 또는 DNS 이름을 지정할 수 있는 정책 엔진이 있지만, VPC 내에 엔드포인트가 있는 AWS 서비스와 통신할 때는 최적의 선택이 아닙니다.
반대로 Kubernetes 네트워크 정책은
Amazon EKS를 사용하면 Calico
AWS Loadbalancer Controller를 사용하도록 단일 보안 그룹에 태그 지정
많은 보안 그룹이 포드에 할당되면 Amazon EKS는 kubernetes.io/cluster/$name
아웃바운드 트래픽에 대한 NAT 구성
소스 NAT는 보안 그룹이 할당된 포드의 아웃바운드 트래픽에 대해 비활성화됩니다. NAT 게이트웨이 또는 인스턴스로 구성된 프라이빗 서브넷에서 인터넷 시작 작업자 노드에 액세스하고 CNI에서 외부 SNAT를 활성화해야 하는 보안 그룹을 사용하는 포드의 경우.
kubectl set env daemonset -n kube-system aws-node AWS_VPC_K8S_CNI_EXTERNALSNAT=true
보안 그룹이 있는 포드를 프라이빗 서브넷에 배포
보안 그룹이 할당된 포드는 프라이빗 서브넷에 배포된 노드에서 실행해야 합니다. 퍼블릭 서브넷에 배포된 보안 그룹이 할당된 포드는 인터넷에 액세스할 수 없습니다.
포드 사양 파일에서 terminationGracePeriodSeconds 확인
포드 사양 파일에서가 0terminationGracePeriodSeconds
이 아닌지 확인합니다(기본값은 30초). 이는 Amazon VPC CNI가 작업자 노드에서 포드 네트워크를 삭제하는 데 필수적입니다. 0으로 설정하면 CNI 플러그인이 호스트에서 포드 네트워크를 제거하지 않고 브랜치 ENI가 효과적으로 정리되지 않습니다.
Fargate에서 포드에 보안 그룹 사용
Fargate에서 실행되는 포드의 보안 그룹은 EC2 작업자 노드에서 실행되는 포드와 매우 유사하게 작동합니다. 예를 들어 Fargate 포드와 연결하는 SecurityGroupPolicy에서 참조하기 전에 보안 그룹을 생성해야 합니다. 기본적으로 SecurityGroupPolicy를 Fargate 포드에 명시적으로 할당하지 않으면 클러스터 보안 그룹이 모든 Fargate 포드에 연결됩니다. 단순화를 위해 Fagate Pod의 SecurityGroupPolicy에 클러스터 보안 그룹을 추가하고 싶을 수 있습니다. 그렇지 않으면 보안 그룹에 최소 보안 그룹 규칙을 추가해야 합니다. describe-cluster API를 사용하여 클러스터 보안 그룹을 찾을 수 있습니다.
aws eks describe-cluster --name CLUSTER_NAME --query 'cluster.resourcesVpcConfig.clusterSecurityGroupId'
cat >my-fargate-sg-policy.yaml <<EOF
apiVersion: vpcresources.k8s.aws/v1beta1
kind: SecurityGroupPolicy
metadata:
name: my-fargate-sg-policy
namespace: my-fargate-namespace
spec:
podSelector:
matchLabels:
role: my-fargate-role
securityGroups:
groupIds:
- cluster_security_group_id
- my_fargate_pod_security_group_id
EOF
최소 보안 그룹 규칙은 여기에 나열되어 있습니다. 이러한 규칙을 통해 Fargate 포드는 kube-apiserver, kubelet 및 CoreDNS와 같은 클러스터 내 서비스와 통신할 수 있습니다. 또한 Fargate 포드와의 인바운드 및 아웃바운드 연결을 허용하는 규칙을 추가해야 합니다. 이렇게 하면 포드가 VPC의 다른 포드 또는 리소스와 통신할 수 있습니다. 또한 Fargate가 Amazon ECR 또는 DockerHub와 같은 다른 컨테이너 레지스트리에서 컨테이너 이미지를 가져오는 규칙을 포함해야 합니다. 자세한 내용은 AWS 일반 참조의 AWS IP 주소 범위를 참조하세요.
아래 명령을 사용하여 Fargate 포드에 적용된 보안 그룹을 찾을 수 있습니다.
kubectl get pod FARGATE_POD -o jsonpath='{.metadata.annotations.vpc\.amazonaws\.com/pod-eni}{"\n"}'
위 명령의 eniId를 기록해 둡니다.
aws ec2 describe-network-interfaces --network-interface-ids ENI_ID --query 'NetworkInterfaces[*].Groups[*]'
새 보안 그룹을 적용하려면 기존 Fargate 포드를 삭제하고 다시 생성해야 합니다. 예를 들어 다음 명령은 example-app의 배포를 시작합니다. 특정 포드를 업데이트하려면 아래 명령에서 네임스페이스와 배포 이름을 변경할 수 있습니다.
kubectl rollout restart -n example-ns deployment example-pod