서비스 계정에 IAM 역할을 사용하도록 Amazon VPC CNI plugin for Kubernetes 구성 - Amazon EKS

서비스 계정에 IAM 역할을 사용하도록 Amazon VPC CNI plugin for Kubernetes 구성

Amazon VPC CNI plugin for Kubernetes는 Amazon EKS 클러스터에 있는 Pod 네트워킹용 네트워킹 플러그 인입니다. 플러그인은 Kubernetes 노드에 VPC IP 주소를 할당하고 각 노드의 Pods에 대한 필수 네트워킹을 구성하는 역할을 합니다. 플러그 인의 기능:

  • AWS Identity and Access Management(IAM) 권한이 필요합니다. 클러스터에서 IPv4 패밀리를 사용하는 경우 권한은 AmazonEKS_CNI_Policy AWS 관리형 정책에 지정됩니다. 클러스터에서 IPv6 패밀리를 사용하는 경우 권한이 생성하는 IAM 정책에 추가되어야 합니다. 정책을 Amazon EKS 노드 IAM 역할 또는 별도의 IAM 역할에 연결할 수 있습니다. 이 주제에 설명된 대로 별도의 역할에 할당하는 것이 좋습니다.

  • 배포되면 aws-node라는 Kubernetes 서비스 계정을 생성하고 해당 계정을 사용하도록 구성됩니다. 이 서비스 계정은 aws-node라는 Kubernetes clusterrole에 바인딩되어 있습니다. 이 역할에는 필요한 Kubernetes 권한이 할당되어 있습니다.

참고

IMDS에 대한 액세스 권한을 차단하지 않는 한 Amazon VPC CNI plugin for Kubernetes의 Pods은 Amazon EKS 노드 IAM 역할에 할당된 권한에 액세스 권한이 있습니다. 자세한 내용은 워커 노드에 할당된 인스턴스 프로파일에 대한 액세스 제한 섹션을 참조하세요.

사전 조건
  • 기존 Amazon EKS 클러스터. 배포하려면 Amazon EKS 시작하기 섹션을 참조하세요.

  • 클러스터에 대한 기존 AWS Identity and Access Management(IAM) OpenID Connect(OIDC) 제공업체입니다. 이미 있는지 아니면 생성해야 하는지 확인하려면 클러스터의 IAM OIDC 제공업체 생성 부분을 참조하세요.

1단계 - Amazon VPC CNI plugin for Kubernetes IAM 역할 생성

IAM 역할 생성
  1. 클러스터의 IP 패밀리를 확인합니다.

    aws eks describe-cluster --name my-cluster | grep ipFamily

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

    "ipFamily": "ipv4"

    출력에서 대신 ipv6가 반환될 수 있습니다.

  2. IAM 역할을 생성합니다. eksctl 또는 kubectl 및 AWS CLI를 사용하여 IAM 역할을 생성할 수 있습니다.

    eksctl

    IAM 역할을 생성하고 클러스터의 IP 패밀리와 일치하는 명령을 사용하여 역할에 IAM 정책을 연결합니다. 명령은 IAM 역할을 생성하는 AWS CloudFormation 스택을 생성 및 배포하고, 여기에 지정한 정책을 연결하고, 생성된 IAM 역할의 ARN으로 기존 aws-node Kubernetes 서비스 계정에 주석을 추가합니다.

    • IPv4

      my-cluster를 사용자의 고유한 값으로 교체합니다.

      eksctl create iamserviceaccount \ --name aws-node \ --namespace kube-system \ --cluster my-cluster \ --role-name AmazonEKSVPCCNIRole \ --attach-policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \ --override-existing-serviceaccounts \ --approve
    • IPv6

      my-cluster를 사용자의 고유한 값으로 교체합니다. 111122223333를 계정 ID로 바꾸고 AmazonEKS_CNI_IPv6_PolicyIPv6 정책 이름으로 바꿉니다. IPv6 정책이 없는 경우 IPv6 패밀리를 사용하는 클러스터에 대한 IAM 정책 생성 섹션을 참조하여 생성합니다. 클러스터에서 IPv6를 사용하려면 여러 요구 사항을 충족해야 합니다. 자세한 내용은 자습서: Pods 및 services에 IPv6 주소 할당 섹션을 참조하세요.

      eksctl create iamserviceaccount \ --name aws-node \ --namespace kube-system \ --cluster my-cluster \ --role-name AmazonEKSVPCCNIRole \ --attach-policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy \ --override-existing-serviceaccounts \ --approve
    kubectl and the AWS CLI
    1. 클러스터의 OIDC 공급자 URL을 확인합니다.

      aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text

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

      https://oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE

      출력이 반환되지 않은 경우 해당 클러스터에 대한 IAM OIDC 공급자를 생성해야 합니다.

    2. 다음 콘텐츠를 vpc-cni-trust-policy.json라는 파일에 복사합니다. 111122223333을 계정 ID로 바꾸고, EXAMPLED539D4633E53DE1B71EXAMPLE을 이전 단계에서 반환된 값으로 바꿉니다. region-code를 클러스터가 있는 AWS 리전으로 바꿉니다.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com", "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:aws-node" } } } ] }
    3. 역할을 생성합니다. AmazonEKSVPCCNIRole을 선택한 모든 이름으로 바꿀 수 있습니다.

      aws iam create-role \ --role-name AmazonEKSVPCCNIRole \ --assume-role-policy-document file://"vpc-cni-trust-policy.json"
    4. 필요한 IAM 정책을 역할에 연결합니다. 클러스터의 IP 패밀리와 일치하는 명령을 실행합니다.

      • IPv4

        aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \ --role-name AmazonEKSVPCCNIRole
      • IPv6

        111122223333를 계정 ID로 바꾸고 AmazonEKS_CNI_IPv6_PolicyIPv6 정책 이름으로 바꿉니다. IPv6 정책이 없는 경우 IPv6 패밀리를 사용하는 클러스터에 대한 IAM 정책 생성 섹션을 참조하여 생성합니다. 클러스터에서 IPv6를 사용하려면 여러 요구 사항을 충족해야 합니다. 자세한 내용은 자습서: Pods 및 services에 IPv6 주소 할당 섹션을 참조하세요.

        aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy \ --role-name AmazonEKSVPCCNIRole
    5. 다음 명령을 실행하여 이전에 생성한 IAM 역할의 ARN을 사용하여 aws-node 서비스 계정에 주석을 추가합니다. example values를 고유한 값으로 바꿉니다.

      kubectl annotate serviceaccount \ -n kube-system aws-node \ eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole
  3. (선택 사항) Kubernetes 서비스 계정에서 사용하는 AWS Security Token Service 엔드포인트 유형을 구성합니다. 자세한 내용은 서비스 계정의 AWS Security Token Service 엔드포인트 구성 섹션을 참조하세요.

2단계: Amazon VPC CNI plugin for KubernetesPods 재배포

  1. 서비스 계정에 연결된 기존 Pods를 삭제하고 다시 생성하여 보안 인증 정보 환경 변수를 적용합니다. 주석은 현재 주석 없이 실행 중인 Pods에는 적용되지 않습니다. 다음 명령은 기존의 aws-node DaemonSet Pods를 삭제하고 서비스 계정 주석을 사용하여 배포합니다.

    kubectl delete Pods -n kube-system -l k8s-app=aws-node
  2. 모든 Pods가 다시 시작되었는지 확인합니다.

    kubectl get pods -n kube-system -l k8s-app=aws-node
  3. Pods 중 하나를 설명하고 AWS_WEB_IDENTITY_TOKEN_FILEAWS_ROLE_ARN 환경 변수가 있는지 확인합니다. cpjw7을 이전 단계의 출력에서 반환된 Pods 중 하나의 이름으로 바꿉니다.

    kubectl describe pod -n kube-system aws-node-cpjw7 | grep 'AWS_ROLE_ARN:\|AWS_WEB_IDENTITY_TOKEN_FILE:'

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

    AWS_ROLE_ARN:                 arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole
          AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token
          AWS_ROLE_ARN:                           arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole
          AWS_WEB_IDENTITY_TOKEN_FILE:            /var/run/secrets/eks.amazonaws.com/serviceaccount/token

    Pod에 두 개의 컨테이너가 포함되어 있으므로 두 세트의 중복 결과가 반환됩니다. 두 컨테이너의 값이 같은 경우입니다.

    Pod에서 AWS 리전 엔드포인트를 사용하고 있는 경우 이전 출력에서 다음 줄도 반환됩니다.

    AWS_STS_REGIONAL_ENDPOINTS=regional

3단계: 노드 IAM 역할에서 CNI 정책 제거

Amazon EKS 노드 IAM 역할에 현재 AmazonEKS_CNI_Policy IAM(IPv4) 정책 또는 IPv6 정책이 연결되어 있고 별도의 IAM 역할을 생성한 경우, 정책을 대신 연결한 다음 aws-node Kubernetes 서비스 계정에 할당한 후 클러스터의 IP 패밀리와 일치하는 AWS CLI 명령을 사용하여 노드 역할에서 정책을 제거하는 것이 좋습니다. AmazonEKSNodeRole을 노드 역할의 이름으로 바꿉니다.

  • IPv4

    aws iam detach-role-policy --role-name AmazonEKSNodeRole --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
  • IPv6

    111122223333를 계정 ID로 바꾸고 AmazonEKS_CNI_IPv6_PolicyIPv6 정책 이름으로 바꿉니다.

    aws iam detach-role-policy --role-name AmazonEKSNodeRole --policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy

IPv6 패밀리를 사용하는 클러스터에 대한 IAM 정책 생성

IPv6 패밀리를 사용하는 클러스터를 생성했고 클러스터에 버전 1.10.1 이상의 Amazon VPC CNI plugin for Kubernetes 추가 기능이 구성되어 있으면 IAM 역할에 할당할 수 있는 IAM 정책을 생성해야 합니다. 생성할 때 IPv6 패밀리로 구성하지 않은 기존 클러스터가 있는 경우 IPv6을 사용하려면 새 클러스터를 생성해야 합니다. 클러스터에서 IPv6 사용에 대한 자세한 내용을 알아보려면 자습서: Pods 및 services에 IPv6 주소 할당 섹션을 참조하세요.

  1. 다음 텍스트를 복사해 vpc-cni-ipv6-policy.json 파일에 저장합니다.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:AssignIpv6Addresses", "ec2:DescribeInstances", "ec2:DescribeTags", "ec2:DescribeNetworkInterfaces", "ec2:DescribeInstanceTypes" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": [ "arn:aws:ec2:*:*:network-interface/*" ] } ] }
  2. IAM 정책을 생성합니다.

    aws iam create-policy --policy-name AmazonEKS_CNI_IPv6_Policy --policy-document file://vpc-cni-ipv6-policy.json