포드의 보안 그룹 - Amazon EKS

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

포드의 보안 그룹

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

Considerations

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

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

  • 연결된 보안 그룹이 있는 포드를 주고받는 트래픽 흐름은Calico 네트워크 정책시행에만 적용되며, Amazon EC2 보안 그룹 적용으로만 제한됩니다. 이러한 제한을 없애기 위한 커뮤니티의 노력이 진행 중입니다.

  • 포드가 실행되는 포드에 대해서만 보안 그룹을 사용할 수 있습니다.AWSFargate클러스터가 플랫폼 버전의 1.18 인 경우eks.7플랫폼 버전 1.19 이상eks.5이상 또는 1.20 이상.

  • 포드에 대한 보안 그룹은 Windows 노드와 함께 사용할 수 없습니다.

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

  • 아웃바운드 보안 그룹 규칙이 적용되도록 보안 그룹이 할당된 포드에서 아웃바운드 트래픽에 대해 소스 NAT를 사용하지 않도록 설정합니다. 인터넷에 액세스하려면 보안 그룹이 할당된 포드를 NAT 게이트웨이 또는 인스턴스로 구성된 프라이빗 서브넷에 배포된 노드에서 실행해야 합니다. 공용 서브넷에 할당된 보안 그룹이 있는 포드는 인터넷에 액세스할 수 없습니다.

  • 유형의 쿠버네테스 서비스NodePortLoadBalancer인스턴스 대상을externalTrafficPolicy이 로 설정된Local는 보안 그룹을 할당하는 포드에서는 지원되지 않습니다. 인스턴스 대상으로 로드 밸런서 사용에 대한 자세한 내용은 단원을 참조하십시오.Amazon EKS.

  • 포드 보안 정책을 사용하여 포드 돌연변이에 대한 액세스를 제한하는 경우eks-vpc-resource-controllervpc-resource-controllerKubernetes 서비스 계정은 Kubernetes에서 지정되어야 합니다.ClusterRoleBinding에 대 한Role당신의psp가 에 할당됩니다. 를 사용하는 경우Amazon EKSpsp,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 주소를 검색하기 때문입니다. 이 설정이 없으면 플러그인이 호스트의 pod 네트워크를 제거하지 않습니다.

포드에 대한 보안 그룹 배포

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

  1. Fargate 포드에만 보안 그룹을 사용하고 있고 클러스터에 Amazon EC2 노드가 없는 경우 4단계로 건너뜁니다. 다음 명령을 사용하여 현재 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 VPC CNI Amazon EKS 추가 기능을 업데이트합니다. 단원을 참조하세요.

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

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController \ --role-name <eksClusterRole>
  3. CNI 플러그인을 활성화하여 포드의 네트워크 인터페이스를 관리하려면ENABLE_POD_ENI변수를trueaws-nodeDaemonSet. 일단 이 설정을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
    참고

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

    이 노드 중 어느 노드가 있는지 확인할 수 있습니다.aws-k8s-trunk-eni이 로 설정된true다음 명령으로 를 입력합니다.

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

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

    이후 단계에서 포드에 대한 보안 그룹을 배포하면 VPC 리소스 컨트롤러가브랜치 네트워크 인터페이스설명입니다.aws-k8s-branch-eni에서 보안 그룹을 연결하고 보안 그룹을 해당 그룹에 연결합니다. 브랜치 네트워크 인터페이스는 노드에 연결된 표준 및 트렁크 네트워크 인터페이스와 함께 생성됩니다. 활력 또는 준비 프로브를 사용하는 경우 TCP 초기 demux를 비활성화해야합니다.kubelet는 TCP를 통해 분기 네트워크 인터페이스의 포드에 연결할 수 있습니다. 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 EKS 배포SecurityGroupPolicy를 클러스터에 추가합니다.

    1. 다음 예제 보안 정책을 이라는 파일에 저장합니다.내 보안 그룹 정책.yaml. 를 바꿀 수 있습니다.podSelector다음으로 바꿉니다.serviceAccountSelector를 사용하여 서비스 계정 레이블을 기반으로 창을 선택하려는 경우 두 선택기 중 하나만 지정해야 합니다. 비어 있는podSelector(예:podSelector: {}) 네임스페이스의 모든 포드를 선택합니다. 비어 있는serviceAccountSelector네임스페이스의 모든 서비스 계정을 선택합니다. 에 대해 1-5개의 보안 그룹 ID를 지정해야 합니다.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 통신도 허용해야 합니다.

      • Fargate 에서 보안 그룹 정책을 사용하는 경우 보안 그룹에 포드가 Kubernetes 제어판과 통신할 수 있도록 허용하는 규칙이 있는지 확인합니다. 이 작업을 수행할 수 있는 가장 쉬운 방법은 클러스터 보안 그룹을 보안 그룹 중 하나로 지정하는 것입니다.

    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 my-security-group-policy.yaml
      참고
      • 포드가Waiting상태를 볼 수 있으며Insufficient permissions: Unable to create Elastic Network Interface.를 사용하는 경우 이전 단계에서 IAM 클러스터 역할에 IAM 정책을 추가했는지 확인합니다.

      • 포드가Pending상태에서 노드 인스턴스 유형이Amazon EC2 지원 인스턴스 및 브랜치 네트워크 인터페이스를 사용하고 인스턴스 유형에서 지원하는 최대 분기 네트워크 인터페이스 수에 노드 그룹의 노드 수를 곱한 값이 아직 충족되지 않았는지 확인합니다. 예를 들어,m5.large인스턴스는 9개의 분기 네트워크 인터페이스를 지원합니다. 노드 그룹에 5개의 노드가 있는 경우 노드 그룹에 대해 최대 45개의 분기 네트워크 인터페이스를 생성할 수 있습니다. 배포하려는 46 번째 포드는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

      인스턴스 유형에서 실행할 수 있는 최대 포드 수를 초과할 수 없습니다. 각 인스턴스 유형에서 실행할 수 있는 최대 포드 수 목록은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.metal 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.metal 107
크다르 9
크라지크 18
c5a.2xlarge 38
c5a.4xlarge 54
c5a.8xlarge 54
c5a.12xlarge 54
c5a.16xlarge 107
r5a.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
메탈 107
c5n.large 9
c5n.xlarge 18
c5n.2xlarge 38
c5n.4xlarge 54
c5n.9xlarge 54
c5n.18xlarge 107
금속 5N 107
미디엄 4
C6g.라지 9
크라지크 18
c6g.2xlarge 38
c6g.4xlarge 54
c6g.8xlarge 54
c6g.12xlarge 54
c6g.16xlarge 107
금속 6g 107
g4dn.xlarge 39
g4dn.2xlarge 39
g4dn.4xlarge 59
g4dn.8xlarge 58
g4dn.12xlarge 54
g4dn.16xlarge 118
G4dn 메탈 107
i3en.라지 5
i3en.xlarge 12
i3en.2xlarge 28
i3en.3xlarge 38
i3en.6xlarge 54
i3en.12xlarge 114
i3en.24xlarge 107
I3엔 메탈 107
in1.xlarge 38
인프1.2x라지 38
인프1.6x라지 54
인프1.24x라지 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
대형 9
엠5dn.x라지 18
m5dn.2xlarge 38
m5dn.4xlarge 54
m5dn.8xlarge 54
m5dn.12xlarge 54
m5dn.16xlarge 107
m5dn.24xlarge 107
m5n.라지 9
m5n.x라지 18
m5n.2xlarge 38
m5n.4xlarge 54
m5n.8xlarge 54
m5n.12xlarge 54
m5n.16xlarge 107
m5n.24xlarge 107
m6g 미디엄 4
m6g.라지 9
m6g.x라지 18
m6g.2xlarge 38
m6g.4xlarge 54
m6g.8xlarge 54
m6g.12xlarge 54
m6g.16xlarge 107
금속 m6g 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.라지 9
크라지 18
r5dn.2xlarge 38
r5dn.4xlarge 54
r5dn.8xlarge 54
r5dn.12xlarge 54
r5dn.16xlarge 107
r5dn.24xlarge 107
r5n.라지 9
r5n.x라지 18
r5n.2xlarge 38
r5n.4xlarge 54
r5n.8xlarge 54
r5n.12xlarge 54
r5n.16xlarge 107
r5n.24xlarge 107
r6g.미디엄 4
r6g.라지 9
r6g.x라지 18
r6g.2xlarge 38
r6g.4xlarge 54
r6g.8xlarge 54
r6g.12xlarge 54
r6g.16xlarge 107
z1d.라지 13
z1d.xlarge 28
z1d.2xlarge 58
z1d.3xlarge 54
z1d.6xlarge 54
z1d.12xlarge 107
z1d.metal 107