포드에 대한 보안 그룹 - Amazon EKS

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

포드에 대한 보안 그룹

포드의 보안 그룹은 Amazon EC2 보안 그룹을 Kubernetes 포드와 통합합니다. Amazon EC2 보안 그룹을 사용하여 많은 Amazon EC2 인스턴스 유형에서 실행 중인 노드에 배포하는 포드와의 인바운드 및 아웃바운드 네트워크 트래픽을 허용하는 규칙을 정의할 수 있습니다. 이 기능에 대한 자세한 설명은 Introducing security groups for pods 블로그 게시물을 참조하십시오.

Considerations

포드에 대한 보안 그룹을 배포하기 전에 다음 제한 및 조건을 고려하십시오.

  • Amazon EKS 클러스터에서 Kubernetes 버전 1.17 및 Amazon EKS 플랫폼 버전 eks.3 이상을 실행해야 합니다. 에 배포한 Kubernetes 클러스터의 포드에는 보안 그룹을 사용할 수 없습니다Amazon EC2.

  • 연결된 보안 그룹이 있는 포드와의 트래픽 흐름은 Calico 네트워크 정책 적용의 대상이 아니며 Amazon EC2 보안 그룹 적용으로만 제한됩니다. 이러한 제한을 제거하기 위한 커뮤니티 노력이 진행 중입니다.

  • 포드의 보안 그룹은 에 배포된 포드와 함께 사용할 수 없습니다Fargate.

  • 포드의 보안 그룹은 Windows 노드에서 사용할 수 없습니다.

  • 포드의 보안 그룹은 , , , , , Amazon EC2 m5 c5 r5, 및 p3 인스턴스 패밀리를 포함하여 대부분의 m6gNitro 기반c6g r6g 인스턴스 패밀리에서 지원됩니다. t3 인스턴스 패밀리는 지원되지 않습니다. 지원되는 인스턴스의 전체 목록은 단원을 참조하십시오Amazon EC2 지원되는 인스턴스 및 브랜치 네트워크 인터페이스. 노드는 지원되는 인스턴스 유형 중 하나여야 합니다.

  • 아웃바운드 보안 그룹 규칙이 적용되도록 소스 NAT는 보안 그룹이 할당된 포드의 아웃바운드 트래픽에 대해 비활성화됩니다. 인터넷에 액세스하려면 NAT 게이트웨이 또는 인스턴스로 구성된 프라이빗 서브넷에 배포된 노드에서 보안 그룹이 할당된 포드를 시작해야 합니다. 퍼블릭 서브넷에 배포된 보안 그룹이 할당된 포드는 인터넷에 액세스할 수 없습니다.

  • 유형의 Kubernetes 서비스 NodePortLoadBalancer 이 로 externalTrafficPolicy 설정된 인스턴스 대상 Local 사용은 보안 그룹을 할당하는 포드에서 지원되지 않습니다. 인스턴스 대상과 함께 로드 밸런서를 사용하는 방법에 대한 자세한 내용은 단원을 참조하십시오로드 밸런서 – 인스턴스 대상.

  • 포드 보안 정책을 사용하여 포드 변형에 eks-vpc-resource-controller 대한 액세스를 제한하는 경우 vpc-resource-controllerClusterRoleBinding Kubernetes 서비스 계정을 Role psp 가 할당된 의 Kubernetes에 지정해야 합니다. 기본 Amazon EKS psp, Role및 ClusterRoleBinding 를 사용하는 경우 이는 eks:podsecuritypolicy:authenticated 입니다ClusterRoleBinding. 예를 들어 다음 예제와 같이 서비스 계정을 subjects: 섹션에 추가합니다.

    ... subjects: - kind: Group apiGroup: rbac.authorization.k8s.io name: system:authenticated - kind: ServiceAccount name: vpc-resource-controller - kind: ServiceAccount name: eks-vpc-resource-controller
  • 포드에 대해 사용자 지정 네트워킹 및 보안 그룹을 함께 사용하는 경우 포드에 대한 보안 그룹에서 지정한 보안 그룹이 에 지정된 보안 그룹 대신 사용됩니다ENIconfig.

  • 보안 그룹을 사용하는 포드는 포드 사양에 terminationGracePeriodSeconds 를 포함해야 합니다. 이는 Amazon EKS VPC CNI 플러그인이 호스트에서 포드 네트워크를 삭제하기 전에 API 서버를 쿼리하여 포드 IP 주소를 검색하기 때문입니다. 이 설정이 없으면 플러그인이 호스트에서 포드 네트워크를 제거하지 않습니다.

포드에 대한 보안 그룹 배포

포드에 대한 보안 그룹을 배포하려면

  1. 다음 명령을 사용하여 현재 CNI 플러그인 버전을 확인합니다.

    kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2

    출력은 다음 출력과 비슷합니다.

    amazon-k8s-cni:<1.7.7>

    CNI 플러그인 버전이 1.7.7 이전이면 CNI 플러그인을 버전 1.7.7 이상으로 업그레이드합니다. 자세한 내용은 단원을 참조하세요.Amazon VPCKubernetes 업그레이드용 CNI 플러그인.

  2. AmazonEKSVPCResourceController 클러스터와 연결된 클러스터 역할에 Amazon EKS 관리형 정책을 추가합니다. 이 정책은 역할이 네트워크 인터페이스, 프라이빗 IP 주소, 인스턴스와의 연결 및 분리를 관리하도록 허용합니다. 다음 명령은 라는 클러스터 역할에 정책을 추가합니다<eksClusterRole>.

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController \ --role-name <eksClusterRole>
  3. ENABLE_POD_ENI 에서 true 변수를 로 설정하여 포드의 네트워크 인터페이스를 관리하도록 CNI 플러그인aws-node을 활성화합니다DaemonSet. 이 설정이 로 설정되면 클러스터의 각 노드true에 대해 플러그인이 값의 레이블을 추가합니다vpc.amazonaws.com/has-trunk-attached=true. VPC 리소스 컨트롤러는 설명과 함께 트렁크 네트워크 인터페이스라는 하나의 특수 네트워크 인터페이스를 생성하고 연결합니다aws-k8s-trunk-eni.

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

    트렁크 네트워크 인터페이스는 인스턴스 유형에서 지원하는 최대 네트워크 인터페이스 수에 포함됩니다. 각 인스턴스 유형에서 지원하는 최대 인터페이스 수 목록은 https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI 에서 인스턴스 유형별 네트워크 인터페이스Linux 인스턴스용 Amazon EC2 사용 설명서당 IP 주소를 참조하십시오. 노드에 이미 연결된 최대 표준 네트워크 인터페이스 수가 있는 경우 VPC 리소스 컨트롤러가 공간을 예약합니다. 컨트롤러가 표준 네트워크 인터페이스를 분리 및 삭제하고 트렁크 네트워크 인터페이스를 생성한 다음 인스턴스에 연결할 수 있도록 실행 중인 포드를 충분히 축소해야 합니다.

    다음 명령을 사용하여 를 aws-k8s-trunk-enitrue 설정한 노드를 확인할 수 있습니다.

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

    트렁크 네트워크 인터페이스가 생성되면 포드에 트렁크 또는 표준 네트워크 인터페이스의 보조 IP 주소를 할당할 수 있습니다. 노드가 삭제되면 트렁크 인터페이스가 자동으로 삭제됩니다.

    이후 단계에서 포드에 대한 보안 그룹을 배포하면 VPC 리소스 컨트롤러는 의 설명과 함께 브랜치 네트워크 인터페이스라는 특수 네트워크 인터페이스를 생성하고 보안 그룹을 이 인터페이스에 aws-k8s-branch-eni 연결합니다. 분기 네트워크 인터페이스는 노드에 연결된 표준 및 트렁크 네트워크 인터페이스 외에 생성됩니다. 라이브 또는 준비 프로브를 사용하는 경우 가 TCP를 통해 브랜치 네트워크 인터페이스의 포드에 연결할 kubelet 수 있도록 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"}]}}}}'
  4. 리소스를 배포할 네임스페이스를 생성합니다.

    kubectl create namespace <my-namespace>
  5. 클러스터Amazon EKSSecurityGroupPolicy에 를 배포합니다.

    1. 다음 예제 보안 정책을 이라는 파일에 저장합니다<my-security-group-policy.yaml>. 서비스 계정 레이블에 따라 포드를 선택하려는 podSelector 경우 를 serviceAccountSelector 로 바꿀 수 있습니다. 선택기 하나를 지정해야 합니다. 비어 있음podSelector(예: podSelector: {})은 네임스페이스의 모든 포드를 선택합니다. 비어 있으면 네임스페이스의 모든 서비스 계정이 serviceAccountSelector 선택됩니다. 에 IDs 대해 1-5 보안 그룹을 지정해야 합니다groupIds. ID를 두 개 이상 지정하면 선택한 포드에 대해 모든 보안 그룹의 모든 규칙 조합이 적용됩니다.

      apiVersion: vpcresources.k8s.aws/v1beta1 kind: SecurityGroupPolicy metadata: name: <my-security-group-policy> namespace: <my-namespace> spec: <podSelector>: matchLabels: <role>: <my-role> securityGroups: groupIds: - <sg-abc123>
      중요
      • 정책에서 지정한 보안 그룹이 있어야 합니다. 존재하지 않으면 선택기와 일치하는 포드를 배포할 때 포드가 생성 프로세스에서 멈춰 있는 상태로 유지됩니다. 포드를 설명하는 경우 와 비슷한 오류 메시지가 표시됩니다An error occurred (InvalidSecurityGroupID.NotFound) when calling the CreateNetworkInterface operation: The securityGroup ID '<sg-abc123>' does not exist.

      • 보안 그룹은 프로브를 구성한 포트를 통해 클러스터 보안 그룹(용kubelet)에서 인바운드 통신을 허용해야 합니다.

      • 보안 그룹은 TCP 및 UDP 포트 53을 통해 클러스터 보안 그룹(용CoreDNS)에 대한 아웃바운드 통신을 허용해야 합니다. 또한 클러스터 보안 그룹은 포드에 연결된 모든 보안 그룹으로부터의 인바운드 TCP 및 UDP 포트 53 통신을 허용해야 합니다.

    2. 정책을 배포합니다.

      kubectl apply -f <my-security-group-policy.yaml>
  6. 이전 단계에서 <my-role> 지정한 의 <podSelector> 값과 일치하는 레이블이 있는 샘플 애플리케이션을 배포합니다.

    1. 다음 내용을 파일에 저장합니다.

      apiVersion: apps/v1 kind: Deployment metadata: name: <my-deployment> namespace: <my-namespace> labels: app: <my-app> spec: replicas: <1> selector: matchLabels: app: <my-app> template: metadata: labels: app: <my-app> role: <my-role> spec: containers: - name: <my-container> image: <my-image> ports: - containerPort: <80>
    2. 다음 명령을 사용하여 애플리케이션을 배포합니다. 애플리케이션을 배포할 때 CNI 플러그인이 role 레이블과 일치하고 이전 단계에서 지정한 보안 그룹이 포드에 적용됩니다.

      kubectl apply -f <file-name-you-used-in-previous-step.yaml>
      참고
      • 포드가 Waiting 상태에서 멈춰 있고 포드를 설명할 Insufficient permissions: Unable to create Elastic Network Interface. 때 가 표시되는 경우 이전 단계에서 IAM 클러스터 역할에 IAM 정책을 추가했는지 확인합니다.

      • 포드가 Pending 상태에 멈춰 있는 경우 노드 인스턴스 유형이 에 나열되어 Amazon EC2 지원되는 인스턴스 및 브랜치 네트워크 인터페이스 있고 인스턴스 유형에서 지원하는 브랜치 네트워크 인터페이스의 최대 수에 노드 그룹의 노드 수를 곱한 값이 충족되지 않았는지 확인합니다. 예를 들어 m5.large 인스턴스는 9개의 브랜치 네트워크 인터페이스를 지원합니다. 노드 그룹에 5개의 노드가 있는 경우 노드 그룹에 대해 최대 45개의 브랜치 네트워크 인터페이스를 생성할 수 있습니다. 배포하려는 46th 포드는 연결된 보안 그룹이 있는 다른 포드가 삭제될 때까지 Pending 상태로 유지됩니다.

      를 실행하고 다음 메시지와 비슷한 메시지가 kubectl describe pod <my-deployment-xxxxxxxxxx-xxxxx> -n <my-namespace> 표시되면 무시해도 됩니다. 이 메시지는 CNI 플러그인이 호스트 네트워킹을 설정하려고 하는데 네트워크 인터페이스가 생성되는 동안 실패할 때 나타날 수 있습니다. CNI 플러그인은 네트워크 인터페이스가 생성될 때까지 이 이벤트를 기록합니다.

      Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "<e24268322e55c8185721f52df6493684f6c2c3bf4fd59c9c121fd4cdc894579f>" network for pod "<my-deployment-59f5f68b58-c89wx>": networkPlugin cni failed to set up pod "<my-deployment-59f5f68b58-c89wx_my-namespace>" network: add cmd: failed to assign an IP address to container

      인스턴스 유형에서 실행할 수 있는 최대 포드 수를 초과할 수 없습니다. 각 인스턴스 유형에서 실행할 수 있는 최대 포드 수 목록은 의 https://github.com/awslabs/amazon-eks-ami/blob/master/files/eni-max-pods.txt eni-max-pods.txt를 참조하십시오GitHub. 연결된 보안 그룹이 있는 포드를 삭제하거나 포드가 실행 중인 노드를 삭제하면 VPC 리소스 컨트롤러가 브랜치 네트워크 인터페이스를 삭제합니다. 보안 그룹에 대해 포드를 사용하는 포드가 있는 클러스터를 삭제할 경우 컨트롤러는 브랜치 네트워크 인터페이스를 삭제하지 않으므로 직접 삭제해야 합니다.

Amazon EC2 지원되는 인스턴스 및 브랜치 네트워크 인터페이스

다음 표에는 지원되는 각 Amazon EC2 인스턴스 유형에 사용할 수 있는 브랜치 네트워크 인터페이스의 수가 나와 있습니다.

인스턴스 유형 브랜치 네트워크 인터페이스
a1.medium 10
a1.large 9
a1.xlarge 18
a1.2xlarge 38
a1.4xlarge 54
a1.금속 54
c5.large 9
c5.xlarge 18
c5.2xlarge 38
c5.4xlarge 54
c5.9xlarge 54
c5.12xlarge 54
c5.18xlarge 107
c5.24xlarge 107
c5.금속 107
c5a.라지 9
c5a.xlarge 18
c5a.2xlarge 38
c5a.4xlarge 54
c5a.8xlarge 54
c5a.12xlarge 54
c5a.16xlarge 107
c5a.24xlarge 107
c5d.large 9
c5d.xlarge 18
c5d.2xlarge 38
c5d.4xlarge 54
c5d.9xlarge 54
c5d.12xlarge 54
c5d.18xlarge 107
c5d.24xlarge 107
c5d.금속 107
c5n.large 9
c5n.xlarge 18
c5n.2xlarge 38
c5n.4xlarge 54
c5n.9xlarge 54
c5n.18xlarge 107
c5n.금속 107
c6g.medium 4
c6g.large 9
c6g.xlarge 18
c6g.2xlarge 38
c6g.4xlarge 54
c6g.8xlarge 54
c6g.12xlarge 54
c6g.16xlarge 107
c6g.metal 107
g4dn.xlarge 39
g4dn.2xlarge 39
g4dn.4xlarge 59
g4dn.8xlarge 58
g4dn.12xlarge 54
g4dn.16xlarge 118
g4dn.metal 107
i3en.large 5
i3en.xlarge 12
i3en.2xlarge 28
i3en.3xlarge 38
i3en.6xlarge 54
i3en.12xlarge 114
i3en.24xlarge 107
i3en.metal 107
inf1.xlarge 38
inf1.2xlarge 38
inf16xlarge 54
inf1.24xlarge 107
m5.large 9
m5.xlarge 18
m5.2xlarge 38
m5.4xlarge 54
m5.8xlarge 54
m5.12xlarge 54
m5.16xlarge 107
m5.24xlarge 107
m5.metal 107
m5a.large 9
m5a.xlarge 18
m5a.2xlarge 38
m5a.4xlarge 54
m5a.8xlarge 54
m5a.12xlarge 54
m5a.16xlarge 107
m5a.24xlarge 107
m5ad.large 9
m5ad.xlarge 18
m5ad.2xlarge 38
m5ad.4xlarge 54
m5ad.8xlarge 54
m5ad.12xlarge 54
m5ad.16xlarge 107
m5ad.24xlarge 107
m5d.large 9
m5d.xlarge 18
m5d.2xlarge 38
m5d.4xlarge 54
m5d.8xlarge 54
m5d.12xlarge 54
m5d.16xlarge 107
m5d.24xlarge 107
m5d.metal 107
m5dn.large 9
m5dn.xlarge 18
m5dn.2xlarge 38
m5dn.4xlarge 54
m5dn.8xlarge 54
m5dn.12xlarge 54
m5dn.16xlarge 107
m5dn.24xlarge 107
m5n.large 9
m5n.xlarge 18
m5n.2xlarge 38
m5n.4xlarge 54
m5n.8xlarge 54
m5n.12xlarge 54
m5n.16xlarge 107
m5n.24xlarge 107
m6g.medium 4
m6g.large 9
m6g.xlarge 18
m6g.2xlarge 38
m6g.4xlarge 54
m6g.8xlarge 54
m6g.12xlarge 54
m6g.16xlarge 107
m6g.metal 107
p3.2xlarge 38
p3.8xlarge 54
p3.16xlarge 114
p3dn.24xlarge 107
r5.large 9
r5.xlarge 18
r5.2xlarge 38
r5.4xlarge 54
r5.8xlarge 54
r5.12xlarge 54
r5.16xlarge 107
r5.24xlarge 107
r5.metal 107
r5a.large 9
r5a.xlarge 18
r5a.2xlarge 38
r5a.4xlarge 54
r5a.8xlarge 54
r5a.12xlarge 54
r5a.16xlarge 107
r5a.24xlarge 107
r5ad.large 9
r5ad.xlarge 18
r5ad.2xlarge 38
r5ad.4xlarge 54
r5ad.8xlarge 54
r5ad.12xlarge 54
r5ad.16xlarge 107
r5ad.24xlarge 107
r5d.large 9
r5d.xlarge 18
r5d.2xlarge 38
r5d.4xlarge 54
r5d.8xlarge 54
r5d.12xlarge 54
r5d.16xlarge 107
r5d.24xlarge 107
r5d.metal 107
r5dn.large 9
r5dn.xlarge 18
r5dn.2xlarge 38
r5dn.4xlarge 54
r5dn.8xlarge 54
r5dn.12xlarge 54
r5dn.16xlarge 107
r5dn.24xlarge 107
r5n.large 9
r5n.xlarge 18
r5n.2xlarge 38
r5n.4xlarge 54
r5n.8xlarge 54
r5n.12xlarge 54
r5n.16xlarge 107
r5n.24xlarge 107
r6g.medium 4
r6g.large 9
r6g.xlarge 18
r6g.2xlarge 38
r6g.4xlarge 54
r6g.8xlarge 54
r6g.12xlarge 54
r6g.16xlarge 107
z1d.large 13
z1d.xlarge 28
z1d.2xlarge 58
z1d.3xlarge 54
z1d.6xlarge 54
z1d.12xlarge 107
z1d.metal 107