IRSA를 사용하도록 Amazon VPC CNI 플러그인 구성하기

IRSA를 사용하도록 Amazon VPC CNI 플러그인 구성하기 (Configure Amazon VPC CNI plugin to use IRSA)

Kubernetes용 Amazon VPC CNI 플러그인은 Amazon EKS 클러스터에서 Pod 네트워킹을 위한 네트워킹 플러그인이에요. 이 플러그인은 Kubernetes Pod에 VPC IP 주소를 할당하고 각 노드의 Pod에 필요한 네트워킹을 구성하는 역할을 해요.

참고

Amazon VPC CNI 플러그인은 Amazon EKS Pod Identities도 지원해요. 자세한 내용은 Kubernetes 서비스 계정에 IAM 역할 할당하기를 참고하세요.

출처: 문서

본문

플러그인은 다음을 수행해요.

  • AWS IAM(Identity and Access Management) 권한을 요구해요. 클러스터가 IPv4 패밀리를 사용한다면 권한은 AmazonEKS_CNI_Policy AWS 관리형 정책에 지정돼 있어요. 클러스터가 IPv6 패밀리를 사용한다면 권한을 여러분이 만드는 IAM 정책에 추가해야 해요. 지침은 IPv6 패밀리를 사용하는 클러스터용 IAM 정책 생성을 참고하세요. 정책을 Amazon EKS 노드 IAM 역할이나 별도의 IAM 역할에 연결할 수 있어요. Amazon EKS 노드 IAM 역할에 정책을 연결하는 지침은 Amazon EKS 노드 IAM 역할을 참고하세요. 이 주제에서 자세히 설명하는 것처럼 별도의 역할에 할당하는 것을 권장해요.

  • 배포될 때 aws-node라는 Kubernetes 서비스 계정을 만들고 이를 사용하도록 구성돼요. 이 서비스 계정은 aws-node라는 Kubernetes clusterrole에 바인딩되며, 이 역할에 필요한 Kubernetes 권한이 할당돼요.

참고

Kubernetes용 Amazon VPC CNI 플러그인의 Pod는 IMDS 접근을 차단하지 않는 한 Amazon EKS 노드 IAM 역할에 할당된 권한에 접근할 수 있어요. 자세한 내용은 워커 노드에 할당된 인스턴스 프로파일 접근 제한하기를 참고하세요.

  • 기존 Amazon EKS 클러스터를 요구해요. 배포하려면 Amazon EKS 시작하기를 참고하세요.

  • 클러스터용 기존 AWS IAM OIDC(OpenID Connect) 프로바이더를 요구해요. 이미 있는지 확인하거나 만들려면 클러스터용 IAM OIDC 프로바이더 생성하기를 참고하세요.

1단계: Kubernetes용 Amazon VPC CNI 플러그인 IAM 역할 생성

  1. 클러스터의 IP 패밀리를 확인해요.

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

    예시 출력은 다음과 같아요.

    "ipFamily": "ipv4"
    

    출력이 ipv6를 반환할 수도 있어요.

  2. IAM 역할을 만들어요. eksctl 또는 kubectl과 AWS CLI를 사용해 IAM 역할을 만들 수 있어요.

eksctl

클러스터의 IP 패밀리와 일치하는 명령으로 IAM 역할을 만들고 IAM 정책을 역할에 연결해요. 이 명령은 IAM 역할을 만들고, 지정한 정책을 역할에 연결하고, 생성된 IAM 역할의 ARN으로 기존 aws-node Kubernetes 서비스 계정에 어노테이션을 추가하는 AWS CloudFormation 스택을 만들고 배포해요.

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_Policy를 여러분의 IPv6 정책 이름으로 바꾸세요. IPv6 정책이 없다면 IPv6 패밀리를 사용하는 클러스터용 IAM 정책 생성을 참고해 하나 만드세요. 클러스터에서 IPv6를 사용하려면 여러 요구사항을 충족해야 해요. 자세한 내용은 클러스터, Pod, 서비스에 대한 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 및 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.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
                },
                "Action": "sts:AssumeRoleWithWebIdentity",
                "Condition": {
                    "StringEquals": {
                        "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com",
                        "oidc.eks.us-east-1.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_Policy를 여러분의 IPv6 정책 이름으로 바꾸세요. IPv6 정책이 없다면 IPv6 패밀리를 사용하는 클러스터용 IAM 정책 생성을 참고해 하나 만드세요. 클러스터에서 IPv6를 사용하려면 여러 요구사항을 충족해야 해요. 자세한 내용은 클러스터, Pod, 서비스에 대한 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 서비스 계정에 어노테이션을 추가하려면 다음 명령을 실행해요. 예시 값을 자신의 값으로 바꾸세요.

    kubectl annotate serviceaccount \
        -n kube-system aws-node \
        eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole
    
  6. (선택 사항) Kubernetes 서비스 계정이 사용하는 AWS Security Token Service 엔드포인트 유형을 구성해요. 자세한 내용은 서비스 계정용 AWS Security Token Service 엔드포인트 구성하기를 참고하세요.

2단계: Kubernetes용 Amazon VPC CNI 플러그인 Pod 재배포

자격 증명 환경 변수를 적용하려면 서비스 계정과 연결된 기존 Pod를 모두 삭제하고 다시 만들어요. 어노테이션은 어노테이션이 없는 현재 실행 중인 Pod에는 적용되지 않아요. 다음 명령은 기존 aws-node DaemonSet Pod를 삭제하고 서비스 계정 어노테이션으로 재배포해요.

kubectl delete Pods -n kube-system -l k8s-app=aws-node

모든 Pod가 재시작되었는지 확인해요.

kubectl get pods -n kube-system -l k8s-app=aws-node

Pod 중 하나를 설명하고 AWS_WEB_IDENTITY_TOKEN_FILE 및 AWS_ROLE_ARN 환경 변수가 있는지 확인해요. cpjw7를 이전 단계의 출력에서 반환된 Pod 중 하나의 이름으로 바꾸세요.

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 Regional 엔드포인트를 사용한다면 이전 출력에 다음 줄도 반환돼요.

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_Policy를 여러분의 IPv6 정책 이름으로 바꾸세요.

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

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

IPv6 패밀리를 사용하는 클러스터를 만들었고 클러스터에 Kubernetes용 Amazon VPC CNI 플러그인 추가 기능 버전 1.10.1 이상이 구성되어 있다면, IAM 역할에 할당할 수 있는 IAM 정책을 만들어야 해요. 생성 시 IPv6 패밀리로 구성하지 않은 기존 클러스터가 있다면 IPv6를 사용하려면 새 클러스터를 만들어야 해요. 클러스터에서 IPv6를 사용하는 방법에 대한 자세한 내용은 클러스터, Pod, 서비스에 대한 IPv6 주소 알아보기를 참고하세요.

다음 텍스트를 복사해 vpc-cni-ipv6-policy.json이라는 파일에 저장해요.

{
    "Version":"2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:AssignIpv6Addresses",
                "ec2:DescribeInstances",
                "ec2:DescribeTags",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DescribeInstanceTypes",
                "ec2:DescribeSubnets"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateTags"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:network-interface/*"
            ]
        }
    ]
}

IAM 정책을 만들어요.

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

더 알아보기 (Learn more)