Amazon EKS Pod용 보안 그룹으로 Amazon VPC CNI 플러그인 구성

Amazon EKS Pod용 보안 그룹으로 Amazon VPC CNI 플러그인 구성

Amazon EC2 인스턴스가 있는 Pod를 사용한다면 Amazon VPC CNI 플러그인 for Kubernetes를 보안 그룹용으로 구성해야 합니다.

Fargate Pod만 사용하고 클러스터에 Amazon EC2 노드가 없다면 Amazon EKS Pod용 보안 그룹 정책 사용을 참조하세요.

출처: 문서

본문

다음 명령으로 현재 Amazon VPC CNI 플러그인 for Kubernetes 버전을 확인합니다.

kubectl describe daemonset aws-node --namespace kube-system | grep amazon-k8s-cni: | cut -d : -f 3

예시 출력은 다음과 같습니다.

v1.7.6

Amazon VPC CNI 플러그인 for Kubernetes 버전이 1.7.7보다 낮으면 플러그인을 버전 1.7.7 이상으로 업데이트합니다. 자세한 내용은 Amazon VPC CNI로 Pod에 IP 할당을 참조하세요.

AmazonEKSVPCResourceController 관리형 IAM 정책을 Amazon EKS 클러스터와 연결된 클러스터 역할에 추가합니다. 이 정책은 역할이 네트워크 인터페이스와 해당 프라이빗 IP 주소를 관리하고 네트워크 인터페이스를 인스턴스에 연결/해제할 수 있게 합니다.

클러스터 IAM 역할의 이름을 가져와 변수에 저장합니다. my-cluster를 클러스터 이름으로 바꿉니다.

cluster_role=$(aws eks describe-cluster --name my-cluster --query cluster.roleArn --output text | cut -d / -f 2)

역할에 정책을 연결합니다.

aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController --role-name $cluster_role

aws-node DaemonSet에서 ENABLE_POD_ENI 변수를 true로 설정하여 Amazon VPC CNI 추가 기능이 Pod용 네트워크 인터페이스를 관리하도록 활성화합니다. 이 설정이 true로 설정되면 클러스터의 각 노드에 대해 추가 기능이 cninode 사용자 지정 리소스를 만듭니다. VPC 리소스 컨트롤러는 aws-k8s-trunk-eni 설명이 있는 트렁크(trunk) 네트워크 인터페이스라는 특수 네트워크 인터페이스를 하나 만들고 연결합니다.

kubectl set env daemonset aws-node -n kube-system ENABLE_POD_ENI=true

참고

트렁크 네트워크 인터페이스는 인스턴스 유형이 지원하는 최대 네트워크 인터페이스 수에 포함됩니다. 각 인스턴스 유형이 지원하는 최대 네트워크 인터페이스 수 목록은 Amazon EC2 User Guide의 인스턴스 유형별 네트워크 인터페이스당 IP 주소(IP addresses per network interface per instance type)를 참조하세요. 노드에 이미 표준 네트워크 인터페이스가 최대 개수만큼 연결되어 있다면 VPC 리소스 컨트롤러가 공간을 예약합니다. 컨트롤러가 표준 네트워크 인터페이스를 분리·삭제하고 트렁크 네트워크 인터페이스를 만들어 인스턴스에 연결할 수 있도록 실행 중인 Pod를 충분히 축소해야 합니다.

다음 명령으로 어떤 노드에 CNINode 사용자 지정 리소스가 있는지 확인할 수 있습니다. No resources found가 반환되면 몇 초 기다린 뒤 다시 시도하세요. 이전 단계에서는 Amazon VPC CNI 플러그인 for Kubernetes Pod를 다시 시작해야 하며 몇 초가 걸립니다.

kubectl get cninode -A
     NAME FEATURES
     ip-192-168-64-141.us-west-2.compute.internal [{"name":"SecurityGroupsForPods"}]
     ip-192-168-7-203.us-west-2.compute.internal [{"name":"SecurityGroupsForPods"}]

1.15보다 오래된 VPC CNI 버전을 사용한다면 CNINode 사용자 지정 리소스 대신 노드 레이블이 사용되었습니다. 다음 명령으로 어떤 노드에 aws-k8s-trunk-eni 노드 레이블이 true로 설정되어 있는지 확인할 수 있습니다. No resources found가 반환되면 몇 초 기다린 뒤 다시 시도하세요. 이전 단계에서는 Amazon VPC CNI 플러그인 for Kubernetes Pod를 다시 시작해야 하며 몇 초가 걸립니다.

kubectl get nodes -o wide -l vpc.amazonaws.com/has-trunk-attached=true

트렁크 네트워크 인터페이스가 만들어지면 Pod에 트렁크 또는 표준 네트워크 인터페이스의 보조 IP 주소가 할당됩니다. 노드가 삭제되면 트렁크 인터페이스는 자동으로 삭제됩니다.

이후 단계에서 Pod용 보안 그룹을 배포하면 VPC 리소스 컨트롤러가 aws-k8s-branch-eni 설명이 있는 분기(branch) 네트워크 인터페이스라는 특수 네트워크 인터페이스를 만들고 보안 그룹을 연결합니다. 분기 네트워크 인터페이스는 노드에 연결된 표준 및 트렁크 네트워크 인터페이스에 더해 만들어집니다.

liveness 또는 readiness 프로브를 사용한다면 kubelet이 TCP를 사용해 분기 네트워크 인터페이스의 Pod에 연결할 수 있도록 TCP early demux도 비활성화해야 합니다. TCP early demux를 비활성화하려면 다음 명령을 실행합니다.

kubectl patch daemonset aws-node -n kube-system \
  -p '{"spec": {"template": {"spec": {"initContainers": [{"env":[{"name":"DISABLE_TCP_EARLY_DEMUX","value":"true"}],"name":"aws-vpc-cni-init"}]}}}}'

참고

Amazon VPC CNI 플러그인 for Kubernetes 추가 기능 버전 1.11.0 이상을 사용하고 다음 단계에서 설명하는 대로 POD_SECURITY_GROUP_ENFORCING_MODE=standard로 설정한다면 이전 명령을 실행할 필요가 없습니다.

클러스터가 NodeLocal DNSCache를 사용하거나, 자체 보안 그룹이 있는 Pod와 함께 Calico 네트워크 정책을 사용하려 하거나, 보안 그룹을 할당하려는 Pod에 대해 externalTrafficPolicy가 Local로 설정된 인스턴스 대상을 사용하는 NodePort 및 LoadBalancer 유형의 Kubernetes 서비스가 있다면 Amazon VPC CNI 플러그인 for Kubernetes 추가 기능 버전 1.11.0 이상을 사용하고 다음 설정을 활성화해야 합니다.

kubectl set env daemonset aws-node -n kube-system POD_SECURITY_GROUP_ENFORCING_MODE=standard

중요

  • Pod 보안 그룹 규칙은 같은 노드에 있는 Pod 간 또는 kubelet이나 nodeLocalDNS 같은 서비스와 Pod 간 트래픽에는 적용되지 않습니다. 같은 노드에서 다른 보안 그룹을 사용하는 Pod는 서로 다른 서브넷에 구성되어 있고 이 서브넷 간 라우팅이 비활성화되어 있으므로 통신할 수 없습니다.
  • VPC 밖의 주소로 향하는 Pod의 아웃바운드 트래픽은 인스턴스의 기본 네트워크 인터페이스 IP 주소로 네트워크 주소 변환됩니다(AWS_VPC_K8S_CNI_EXTERNALSNAT=true를 설정하지 않은 경우). 이 트래픽에는 Pod의 보안 그룹 규칙이 아니라 기본 네트워크 인터페이스의 보안 그룹 규칙이 사용됩니다.
  • 이 설정을 기존 Pod에 적용하려면 Pod 또는 Pod가 실행 중인 노드를 다시 시작해야 합니다.

Pod에 보안 그룹 정책을 사용하는 방법은 Amazon EKS Pod용 보안 그룹 정책 사용을 참조하세요.

더 알아보기 (Learn more)