기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
포드당 보안 그룹
AWS 보안 그룹은 EC2 인스턴스가 인바운드 및 아웃바운드 트래픽을 제어하는 가상 방화벽 역할을 합니다. 기본적으로 AmazonVPCCNI은 ENI 노드의 기본 와 연결된 보안 그룹을 사용합니다. 보다 구체적으로, 인스턴스와 ENI 연결된 모든 에는 동일한 EC2 보안 그룹이 있습니다. 따라서 노드의 모든 포드는 노드가 실행되는 노드와 동일한 보안 그룹을 공유합니다.
아래 이미지와 같이 작업자 노드에서 작동하는 모든 애플리케이션 포드는 RDS 데이터베이스 서비스에 액세스할 수 있습니다(RDS인바운드 허용 노드 보안 그룹 고려). 보안 그룹은 노드에서 실행되는 모든 포드에 적용되기 때문에 너무 조대합니다. 포드용 보안 그룹은 워크로드에 대한 네트워크 세분화를 제공하며, 이는 심층 방어 전략의 중요한 부분입니다.
포드용 보안 그룹을 사용하면 공유 컴퓨팅 리소스에서 다양한 네트워크 보안 요구 사항이 있는 애플리케이션을 실행하여 컴퓨팅 효율성을 개선할 수 있습니다. 및 Pod-to-External AWS 서비스와 같은 Pod-to-Pod 여러 유형의 보안 규칙을 EC2 보안 그룹을 사용하여 한 곳에서 정의하고 Kubernetes 네이티브 를 사용하여 워크로드에 적용할 수 있습니다APIs. 아래 이미지는 포드 수준에서 적용된 보안 그룹과 이러한 그룹이 애플리케이션 배포 및 노드 아키텍처를 간소화하는 방법을 보여줍니다. 이제 포드가 Amazon RDS 데이터베이스에 액세스할 수 있습니다.
를 VPC 로 설정하여 포드ENABLE_POD_ENI=true
에 대한 보안 그룹을 활성화할 수 있습니다CNI. 활성화되면 제어 영역(로 관리됨EKS)에서 실행되는 VPC 리소스 컨트롤러는AmazonEKSVPCResourceController
관리형 정책을 추가해야 합니다.
또한 컨트롤러는 'aws-k8s-branch-eni'이라는 브랜치 인터페이스를 생성하고 이를 트렁크 인터페이스와 연결합니다. 포드에는 SecurityGroupPolicy
브랜치 인터페이스 용량은 보조 IP 주소의 기존 인스턴스 유형 제한에 추가됩니다. 보안 그룹을 사용하는 포드는 최대 포드 공식에서 설명되지 않으며 포드에 보안 그룹을 사용하는 경우 최대 포드 값을 늘리거나 노드가 실제로 지원할 수 있는 것보다 더 적은 포드를 실행하는 것이 좋습니다.
m5.large에는 최대 9개의 브랜치 네트워크 인터페이스와 표준 네트워크 인터페이스에 할당된 최대 27개의 보조 IP 주소가 있을 수 있습니다. 아래 예제와 같이 m5.large의 기본 최대 포드는 29이며 보안 그룹을 사용하는 포드를 최대 포드로 EKS 계산합니다. 노드의 최대 포드를 변경하는 방법에 대한 지침은 EKS 사용 설명서를 참조하세요.
포드의 보안 그룹을 사용자 지정 네트워킹 과 함께 사용하는 경우 포드의 보안 그룹에 정의된 보안 그룹이 에 지정된 보안 그룹이 아닌 사용됩니다ENIConfig. 따라서 사용자 지정 네트워킹이 활성화되면 포드당 보안 그룹을 사용하는 동안 보안 그룹 순서를 신중하게 평가합니다.
추천
Liveness Probe용 TCP Early Demux 비활성화
라이브니스 또는 준비 프로브를 사용하는 경우 kubelet이 를 통해 브랜치 네트워크 인터페이스의 포드에 연결할 수 있도록 TCP 조기 해제도 비활성화해야 합니다TCP. 이는 엄격한 모드에서만 필요합니다. 이렇게 하려면 다음 명령을 실행합니다.
kubectl edit daemonset aws-node -n kube-system
initContainer
섹션에서 의 값을 DISABLE_TCP_EARLY_DEMUX
로 변경합니다. true.
Security Group For Pod를 사용하여 기존 AWS 구성 투자를 활용합니다.
보안 그룹을 사용하면 RDS 데이터베이스 또는 EC2 인스턴스와 같은 VPC 리소스에 대한 네트워크 액세스를 더 쉽게 제한할 수 있습니다. 포드당 보안 그룹의 분명한 이점 중 하나는 기존 AWS 보안 그룹 리소스를 재사용할 수 있다는 것입니다. 보안 그룹을 네트워크 방화벽으로 사용하여 AWS 서비스에 대한 액세스를 제한하는 경우 브랜치를 사용하여 포드에 보안 그룹을 적용하는 것이 좋습니다ENIs. EC2 인스턴스에서 로 앱을 전송EKS하고 보안 그룹이 있는 다른 AWS 서비스에 대한 액세스를 제한하는 경우 포드에 대한 보안 그룹을 사용하는 것이 좋습니다.
포드 보안 그룹 적용 모드 구성
Amazon VPC CNI 플러그인 버전 1.11에 POD_SECURITY_GROUP_ENFORCING_MODE
('강제 모드')라는 새 설정이 추가되었습니다. 적용 모드는 포드에 적용되는 보안 그룹과 소스NAT가 활성화되어 있는지 여부를 모두 제어합니다. 적용 모드를 엄격 또는 표준으로 지정할 수 있습니다. 엄격은 가 로 VPC CNI ENABLE_POD_ENI
설정된 의 이전 동작을 반영하는 기본값입니다true
.
엄격한 모드에서는 브랜치 ENI 보안 그룹만 적용됩니다. 소스도 비활성화NAT됩니다.
표준 모드에서는 기본 ENI 및 브랜치ENI(포드와 연결됨)와 연결된 보안 그룹이 적용됩니다. 네트워크 트래픽은 두 보안 그룹을 모두 준수해야 합니다.
주의
모드 변경은 새로 시작된 포드에만 영향을 미칩니다. 기존 포드는 포드가 생성될 때 구성된 모드를 사용합니다. 고객은 트래픽 동작을 변경하려는 경우 보안 그룹으로 기존 포드를 재활용해야 합니다.
적용 모드: 포드 및 노드 트래픽을 격리하기 위해 엄격한 모드 사용:
기본적으로 포드의 보안 그룹은 “엄격 모드”로 설정됩니다. 노드의 나머지 트래픽과 포드 트래픽을 완전히 분리해야 하는 경우 이 설정을 사용합니다. 엄격한 모드에서는 브랜치 ENI 아웃바운드 보안 그룹을 사용할 수 있도록 소스NAT가 꺼집니다.
주의
엄격한 모드가 활성화되면 포드의 모든 아웃바운드 트래픽이 노드를 떠나 VPC 네트워크에 들어갑니다. 동일한 노드의 포드 간 트래픽은 를 통과합니다VPC. 이렇게 하면 VPC 트래픽이 증가하고 노드 기반 기능이 제한됩니다. NodeLocal DNSCache 는 엄격한 모드에서 지원되지 않습니다.
적용 모드: 다음 상황에서 표준 모드 사용
포드의 컨테이너에 표시되는 클라이언트 소스 IP
클라이언트 소스 IP를 포드의 컨테이너에 계속 표시해야 하는 경우 를 POD_SECURITY_GROUP_ENFORCING_MODE
로 설정하는 것이 좋습니다standard
. Kubernetes 서비스는 클라이언트 소스 IP(기본 유형 클러스터)의 보존을 지원하는 externalTrafficPolicy로컬을 지원합니다. 이제 표준 모드에서 로컬로 externalTrafficPolicy 설정된 인스턴스 대상을 LoadBalancer 사용하여 유형 NodePort 및 의 Kubernetes 서비스를 실행할 수 있습니다. 는 클라이언트 소스 IP를 Local
보존하고 LoadBalancer 및 NodePort 유형의 서비스에 대한 두 번째 홉을 방지합니다.
배포 NodeLocal DNSCache
포드에 보안 그룹을 사용하는 경우 를 사용하는 포드를 지원하도록 표준 모드를 구성합니다NodeLocal DNSCache
NodeLocal DNSCache 는 노드에 대한 모든 네트워크 트래픽이 에 들어가므로 엄격한 모드에서 지원되지 않습니다VPC.
Kubernetes 네트워크 정책 지원
연결된 보안 그룹이 있는 포드와 함께 네트워크 정책을 사용할 때는 표준 적용 모드를 사용하는 것이 좋습니다.
클러스터의 일부가 아닌 AWS 서비스에 대한 네트워크 수준 액세스를 제한하려면 포드에 대한 보안 그룹을 사용하는 것이 좋습니다. 네트워크 정책을 고려하여 클러스터 내의 포드 간 네트워크 트래픽을 제한합니다. 이를 동서 트래픽이라고 합니다.
포드당 보안 그룹과의 비호환성 식별
Windows 기반 및 비nitro 인스턴스는 포드에 대한 보안 그룹을 지원하지 않습니다. 포드가 있는 보안 그룹을 활용하려면 인스턴스에 로 태그를 지정해야 합니다 isTrunkingEnabled. 포드가 내외부의 AWS 서비스에 의존하지 않는 경우 네트워크 정책을 사용하여 보안 그룹 대신 포드 간의 액세스를 관리합니다VPC.
포드당 보안 그룹을 사용하여 AWS 서비스 트래픽을 효율적으로 제어
EKS 클러스터 내에서 실행되는 애플리케이션이 RDS 데이터베이스VPC와 같은 내 다른 리소스와 통신해야 하는 경우 포드SGs에 를 사용하는 것이 좋습니다. CIDR 또는 DNS 이름을 지정할 수 있는 정책 엔진이 있지만 내에 엔드포인트가 있는 AWS 서비스와 통신할 때는 최적의 선택이 아닙니다VPC.
반대로 Kubernetes 네트워크 정책은
Amazon을 EKS 사용하면 Calico
AWS Loadbalancer 컨트롤러를 사용하도록 단일 보안 그룹에 태그 지정
많은 보안 그룹이 포드에 할당되는 경우 Amazon은 kubernetes.io/cluster/$name
아웃바운드 트래픽에 NAT 대해 구성
보안 그룹이 할당된 포드의 아웃바운드 트래픽에 대해서는 소스가 비활성화NAT됩니다. NAT 게이트웨이 또는 인스턴스로 구성된 프라이빗 서브넷에서 인터넷 시작 작업자 노드에 액세스해야 하는 보안 그룹을 사용하는 포드의 경우 에서 외부SNAT를 활성화합니다CNI.
kubectl set env daemonset -n kube-system aws-node AWS_VPC_K8S_CNI_EXTERNALSNAT=true
보안 그룹이 있는 포드를 프라이빗 서브넷에 배포
보안 그룹이 할당된 포드는 프라이빗 서브넷에 배포된 노드에서 실행해야 합니다. 퍼블릭 서브넷에 배포된 보안 그룹이 할당된 포드는 인터넷에 액세스할 수 없습니다.
포드 사양 파일에서 terminationGracePeriod초 확인
포드 사양 파일에서 가 0terminationGracePeriodSeconds
이 아닌지 확인합니다(기본값은 30초). 이는 Amazon이 작업자 노드에서 포드 네트워크를 삭제VPCCNI하는 데 필수적입니다. 0으로 설정하면 CNI 플러그인이 호스트에서 Pod 네트워크를 제거하지 않고 브랜치ENI가 효과적으로 정리되지 않습니다.
Fargate에서 포드에 보안 그룹 사용
Fargate에서 실행되는 포드의 보안 그룹은 EC2 작업자 노드에서 실행되는 포드와 매우 유사하게 작동합니다. 예를 들어 Fargate 포드와 연결된 에서 참조 SecurityGroupPolicy 하기 전에 보안 그룹을 생성해야 합니다. 기본적으로 클러스터 보안 그룹은 Fargate 포드에 를 명시적으로 할당하지 않으면 모든 Fargate 포드 SecurityGroupPolicy 에 연결됩니다. 단순성을 위해 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 Pod는 kube-apiserver, kubelet 및 Core와 같은 클러스터 내 서비스와 통신할 수 있습니다DNS. 또한 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