서비스 계정에 IAM 역할을 사용하도록 Amazon VPC CNI 플러그 인 구성 - Amazon EKS

서비스 계정에 IAM 역할을 사용하도록 Amazon VPC CNI 플러그 인 구성

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

  • IAM 권한이 필요합니다. 클러스터에 IPv4를 사용하려는 경우 AmazonEKS_CNI_Policy AWS 관리형 정책에서 권한을 제공합니다. 클러스터에 IPv6를 사용하려는 경우 다음 절차에서 사용자 정의 IAM 정책을 생성합니다. 정책을 Amazon EKS 노드 IAM 역할 또는 별도의 IAM 역할에 연결할 수 있습니다. 이 주제에 설명된 대로 별도의 역할에 할당하는 것이 좋습니다.

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

참고

서비스 계정에 IAM 역할을 사용하도록 Amazon VPC CNI 플러그 인을 구성하는지 여부에 관계없이 포드는 IMDS에 대한 액세스를 차단하지 않는 한 Amazon EKS 노드 IAM 역할에 할당된 액세스 권한을 갖습니다. 자세한 내용은 작업자 노드에 할당된 인스턴스 프로파일에 대한 액세스 제한 섹션을 참조하세요.

사전 조건

1단계: (선택 사항) IPv6에 대한 IAM 정책 생성

IPv6 패밀리를 사용하는 1.21 이상 클러스터를 생성했고 클러스터에 VPC CNI 추가 기능 버전 1.10.1 이상이 구성되어 있으면 이후 단계에서 IAM 역할에 할당할 수 있는 IAM 정책을 생성해야 합니다. 생성할 때 IPv6 패밀리로 구성하지 않은 기존 1.21 이상 클러스터가 있는 경우 IPv6를 사용하려면 새 클러스터를 생성해야 합니다. 클러스터에서 IPv6 사용에 대한 자세한 내용은 포드 및 서비스에 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

2단계: Amazon VPC CNI 플러그 인 IAM 역할 생성

클러스터에 IPv4를 사용하는 경우 AmazonEKS_CNI_Policy 관리형 IAM 정책을 역할에 연결합니다. 클러스터에 IPv6를 사용하는 경우 AmazonEKS_CNI_IPv6_Policy를 연결합니다.

eksctl 또는 AWS Management Console을 사용하여 CNI 플러그 인 IAM 역할을 생성할 수 있습니다.

eksctl
  1. IAM 역할을 생성하고 다음 명령을 사용하여 역할에 IAM 정책을 연결합니다. my-cluster을 사용자의 고유한 값으로 교체합니다. 이 명령은 IAM 역할을 생성하는 AWS CloudFormation 스택을 생성 및 배포하고, 여기에 지정한 정책을 연결하고, 생성된 IAM 역할의 ARN으로 기존 aws-node 서비스 계정에 주석을 추가합니다.

    eksctl create iamserviceaccount \ --name aws-node \ --namespace kube-system \ --cluster my-cluster \ --attach-policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \ --approve \ --override-existing-serviceaccounts
  2. (선택 사항) 글로벌 엔드포인트가 아닌 AWS Security Token Service AWS 리전 엔드포인트를 사용하려면 서비스 계정에 주석을 추가합니다. 자세한 내용은 서비스 계정에 IAM 역할 연결을 참조하세요.

  3. 실행 중인 Amazon VPC CNI 포드를 봅니다.

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

    kubectl exec -n kube-system aws-node-9rgzw -c aws-node -- env | grep AWS

    결과:

    ... AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token ... AWS_ROLE_ARN=arn:arn:aws::111122223333:role/eksctl-prod-addon-iamserviceaccount-kube-sys-Role1-V66K5I6JLDGK ...

    글로벌 엔드포인트가 아닌 AWS Security Token Service AWS 리전 엔드포인트를 사용하도록 서비스 계정에 주석을 추가한 경우 이전 출력에서도 다음 줄이 반환되는지 확인합니다.

    AWS_STS_REGIONAL_ENDPOINTS=regional
AWS Management Console

사전 조건

클러스터에 대한 기존 AWS Identity and Access Management(IAM) OpenID Connect(OIDC) 공급자. 이미 있는지 아니면 생성해야 하는지 확인하려면 클러스터에 대한 IAM OIDC 공급자 생성 섹션을 참조하세요.

AWS Management Console을 사용하여 CNI 플러그 인 IAM 역할을 생성하려면

  1. 왼쪽 탐색 창에서 역할을 선택합니다. 그런 다음 역할 생성을 선택합니다.

  2. 신뢰할 수 있는 엔터티 유형(Trusted entity type) 섹션에서 웹 자격 증명(Web identity)을 선택합니다.

  3. 웹 자격 증명(Web identity) 섹션에서:

    1. 자격 증명 공급자에서 클러스터의 URL을 선택합니다.

    2. Audience(대상)에서 sts.amazonaws.com을 입력합니다.

  4. 다음을 선택합니다.

  5. 정책 필터링(Filter policies) 상자에 AmazonEKS_CNI_Policy 또는 AmazonEKS_CNI_IPv6_Policy를 입력한 다음 검색에 반환된 정책 이름 왼쪽에 있는 확인란을 선택합니다.

  6. 다음을 선택합니다.

  7. Role name(역할 이름)에 역할의 고유한 이름(예: AmazonEKSCNIRole)을 입력합니다.

  8. 설명(Description)에서 Amazon EKS - CNI role과 같은 설명 텍스트를 입력합니다.

  9. 역할 생성(Create role)을 선택합니다.

  10. 역할을 생성한 후 편집할 수 있도록 콘솔에서 이 역할을 선택하여 엽니다.

  11. 신뢰 관계(Trust relationships) 탭을 선택한 후 신뢰 정책 편집(Edit trust policy)을 선택합니다.

  12. 다음과 비슷한 줄을 찾습니다.

    "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com"

    해당 줄을 다음 줄처럼 변경합니다. EXAMPLED539D4633E53DE1B716D3041E를 클러스터의 OIDC 공급자 ID로 바꾸고, region-code를 클러스터가 있는 AWS 리전 코드로 바꾸고, 다음 문자열에서 이전 출력의 audsub로 변경합니다.

    "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:kube-system:aws-node"
  13. 신뢰 정책 업데이트(Update Trust Policy)를 선택하여 종료합니다.

IAM 역할을 사용하여 aws-node Kubernetes 서비스 계정을 추가하려면

  1. 1.18 이상 Amazon EKS 클러스터에서 Amazon EKS 추가 기능을 사용하는 경우 이 절차를 완료하는 대신 Amazon VPC CNI Amazon EKS 추가 기능 업데이트 섹션을 참조하세요. Amazon VPC CNI Amazon EKS 추가 기능을 사용하지 않는 경우 다음 명령을 사용하여 aws-node 서비스 계정에 이전에 생성한 IAM 역할의 ARN를 추가합니다. example values를 고유한 값으로 바꿉니다.

    kubectl annotate serviceaccount \ -n kube-system aws-node \ eks.amazonaws.com/role-arn=arn:aws:iam::AWS_ACCOUNT_ID:role/AmazonEKSCNIRole
  2. (선택 사항) 글로벌 엔드포인트가 아닌 AWS Security Token Service AWS 리전 엔드포인트를 사용하려면 서비스 계정에 주석을 더 추가합니다. 자세한 내용은 서비스 계정에 IAM 역할 연결을 참조하세요.

  3. 서비스 계정에 연결된 기존 포드를 삭제하고 다시 생성하여 자격 증명 환경 변수를 적용합니다. 변형 웹 후크는 이미 실행 중인 포드에 이 변수를 적용하지 않습니다. 다음 명령은 기존의 aws-node DaemonSet 포드를 삭제하고 서비스 계정 주석을 사용하여 배포합니다.

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

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

    kubectl exec -n kube-system aws-node-9rgzw -c aws-node -- env | grep AWS

    결과:

    ... AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token ... AWS_ROLE_ARN=arn:arn:aws::111122223333:role/eksctl-prod-addon-iamserviceaccount-kube-sys-Role1-V66K5I6JLDGK ...

    글로벌 엔드포인트가 아닌 AWS Security Token Service AWS 리전 엔드포인트를 사용하도록 서비스 계정에 주석을 추가한 경우 이전 출력에서도 다음 줄이 반환되는지 확인합니다.

    AWS_STS_REGIONAL_ENDPOINTS=regional

노드 IAM 역할에서 CNI 정책 제거

만약 Amazon EKS 노드 IAM 역할에 현재 AmazonEKS_CNI_Policy IAM 정책이나 IPv6 정책이 연결되어 있고 별도의 IAM 역할을 생성한 경우, 정책을 대신 연결한 다음 aws-node Kubernetes 서비스 계정에 할당한 후 노드 역할에서 정책을 제거하는 것이 좋습니다.

  1. https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 역할(Roles)을 선택하고 해당 노드 인스턴스 역할을 검색합니다.

  3. 노드 인스턴스 역할의 권한(Permissions) 탭을 선택한 다음 AmazonEKS_CNI_Policy 또는 AmazonEKS_CNI_IPv6_Policy의 오른쪽에 있는 X를 선택합니다.

  4. 분리를 선택하여 종료합니다.