Amazon EKS Pods의 보안 그룹에 대해 Amazon VPC CNI plugin for Kubernetes 구성 - Amazon EKS

Amazon EKS Pods의 보안 그룹에 대해 Amazon VPC CNI plugin for Kubernetes 구성

Amazon EC2 인스턴스에서 Pods를 사용하는 경우 보안 그룹에 대한 Amazon VPC CNI plugin for Kubernetes를 구성해야 합니다.

Fargate Pods만 사용하고 클러스터에 Amazon EC2 노드가 없는 경우 Amazon EKS Pod에 대한 보안 그룹 정책 사용 작업으로 건너뜁니다.

  1. 현재 Amazon VPC CNI plugin for Kubernetes 버전은 다음 명령을 통해 확인할 수 있습니다.

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

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

    v1.7.6

    Amazon VPC CNI plugin for Kubernetes 버전이 1.7.7 이하인 경우 플러그인을 버전 1.7.7 이상으로 업데이트합니다. 자세한 내용은 Amazon VPC CNI 단원을 참조하세요.

  2. Amazon EKS 클러스터와 연결된 클러스터 역할AmazonEKSVPCResourceController 관리형 IAM 정책을 추가합니다. 정책을 사용하면 역할이 네트워크 인터페이스, 프라이빗 IP 주소, 네트워크 인스턴스의 연결 및 분리를 관리할 수 있습니다.

    1. 클러스터 IAM 역할의 이름을 검색하고 변수에 저장합니다. my-cluster를 해당 클러스터의 이름으로 바꿉니다.

      cluster_role=$(aws eks describe-cluster --name my-cluster --query cluster.roleArn --output text | cut -d / -f 2)
    2. 책을 역할에 연결합니다.

      aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController --role-name $cluster_role
  3. aws-node DaemonSet에서 ENABLE_POD_ENI 변수를 true로 설정하여 Amazon VPC CNI 추가 기능이 Pods의 네트워크 인터페이스를 관리하도록 합니다. 이 설정이 true로 설정되면 클러스터의 각 노드에서 추가 기능이 cninode 사용자 지정 리소스를 생성합니다. VPC 리소스 컨트롤러는 설명 aws-k8s-trunk-eni를 사용하여 트렁크 네트워크 인터페이스라는 하나의 특수 네트워크 인터페이스를 생성하고 연결합니다.

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

    트렁크 네트워크 인터페이스는 인스턴스 유형에서 지원하는 최대 네트워크 인터페이스 수에 포함됩니다. 인스턴스 유형별로 지원되는 최대 네트워크 인터페이스 수 목록은 Amazon EC2 사용 설명서에서 인스턴스 유형별 네트워크 인터페이스당 IP 주소 섹션을 참조하세요. 노드에 이미 최대 수의 표준 네트워크 인터페이스가 연결되어 있는 경우 VPC 리소스 컨트롤러가 공간을 예약합니다. 컨트롤러가 표준 네트워크 인터페이스를 분리 및 삭제하고 트렁크 네트워크 인터페이스를 만든 다음 인스턴스에 연결할 수 있도록 실행 중인 Pods를 축소해야 합니다.

  4. 다음 명령을 사용하여 CNINode 사용자 지정 리소스를 포함하는 노드를 확인할 수 있습니다. No resources found가 반환된 경우 몇 초 정도 기다렸다가 다시 시도하세요. 이전 단계에서는 몇 초 정도 걸리는 Amazon VPC CNI plugin for Kubernetes Pods를 다시 시작해야 합니다.

    $ 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 plugin for Kubernetes Pods를 다시 시작해야 합니다.

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

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

    이후 단계에서 Pod에 대한 보안 그룹을 배포하면 VPC 리소스 컨트롤러가 aws-k8s-branch-eni의 설명과 함께 브랜치 네트워크 인터페이스라는 특수한 네트워크 인터페이스를 생성하고 거기에 보안 그룹을 연결합니다. 브랜치 네트워크 인터페이스는 노드에 연결된 표준 및 트렁크 네트워크 인터페이스와 함께 생성됩니다.

    라이브니스 또는 준비 상태 프로브를 사용하는 경우 kubelet가 TCP를 사용하여 브랜치 네트워크 인터페이스의 Pods에 연결할 수 있도록 TCP 초기 demux도 비활성화해야 합니다. TCP 초기 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 plugin for Kubernetes 추가 기능 중 1.11.0 이상을 사용하고 POD_SECURITY_GROUP_ENFORCING_MODE=standard를 설정한 경우에는 이전 명령을 실행할 필요가 없습니다.

  5. 클러스터에서 NodeLocal DNSCache를 사용하거나, 자체 보안 그룹이 있는 Pods를 통해 Calico 네트워크 정책을 사용하거나, 보안 그룹을 할당하려는 Pods에 대해 externalTrafficPolicyLocal로 설정한 인스턴스 대상을 사용하는 NodePortLoadBalancer 유형의 Kubernetes 서비스가 있는 경우 버전 1.11.0 이상의 Amazon VPC CNI plugin for Kubernetes 추가 기능을 사용하고 있어야 하며 다음 설정을 활성화해야 합니다.

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

    중요: Pod 보안 그룹 규칙은 동일한 노드에 있는 Pods 간 또는 Pods와 services(예: kubelet 또는 nodeLocalDNS) 간의 트래픽에는 적용되지 않습니다. 동일한 노드에서 서로 다른 보안 그룹을 사용하는 포드는 서로 다른 서브넷에 구성되어 있기 때문에 통신할 수 없으며, 이러한 서브넷 사이에 라우팅이 비활성화되어 있습니다. Pods에서 VPC 외부의 주소로 향하는 아웃바운드 트래픽은 인스턴스의 기본 네트워크 인터페이스의 IP 주소로 변환된 네트워크 주소입니다(AWS_VPC_K8S_CNI_EXTERNALSNAT=true로 설정하지 않은 경우 제외). 이 트래픽의 경우 Pod’s 보안 그룹의 규칙이 아닌 기본 네트워크 인터페이스에 대한 보안 그룹의 규칙이 사용됩니다. ** 이 설정을 기존 Pods에 적용하려면 Pods 또는 Pods가 실행되고 있는 노드를 다시 시작해야 합니다.

  6. Pod에 대한 보안 그룹 정책을 사용하는 방법을 보려면 Amazon EKS Pod에 대한 보안 그룹 정책 사용 섹션을 참조하세요.