

 **이 페이지 개선에 도움 주기** 

이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 **GitHub에서 이 페이지 편집** 링크를 선택합니다.

# IRSA를 사용하도록 Amazon VPC CNI 플러그인 구성
<a name="cni-iam-role"></a>

[Kubernetes용 Amazon VPC CNI 플러그인](https://github.com/aws/amazon-vpc-cni-k8s)은 Amazon EKS 클러스터에 있는 포드 네트워킹용 네트워킹 플러그인입니다. 플러그인은 Kubernetes 노드에 VPC IP 주소를 할당하고 각 노드의 포드에 대한 필수 네트워킹을 구성하는 역할을 합니다.

**참고**  
Amazon VPC CNI 플러그인은 Amazon EKS Pod Identity도 지원합니다. 자세한 내용은 [Kubernetes 서비스 계정에 IAM 역할 할당](pod-id-association.md) 섹션을 참조하세요.

플러그 인의 기능:
+ AWS ID 및 액세스 관리(IAM) 권한이 필요합니다. 클러스터에서 `IPv4` 패밀리를 사용하는 경우 권한은 [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEKS_CNI_Policy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEKS_CNI_Policy.html) AWS 관리형 정책에 지정됩니다. 클러스터에서 `IPv6` 패밀리를 사용하는 경우 권한이 생성하는 IAM 정책에 추가되어야 합니다. 지침은 [`IPv6` 패밀리를 사용하는 클러스터에 대한 IAM 정책 생성](#cni-iam-role-create-ipv6-policy) 섹션을 참조하세요. 정책을 Amazon EKS 노드 IAM 역할 또는 별도의 IAM 역할에 연결할 수 있습니다. 정책을 Amazon EKS 노드 IAM 역할에 연결하는 지침은 [Amazon EKS 노드 IAM 역할](create-node-role.md)을 참조하세요. 이 주제에 설명된 대로 별도의 역할에 할당하는 것이 좋습니다.
+ 배포되면 `aws-node`라는 Kubernetes 서비스 계정을 생성하고 해당 계정을 사용하도록 구성됩니다. 이 서비스 계정은 `aws-node`라는 Kubernetes `clusterrole`에 바인딩되어 있습니다. 이 역할에는 필요한 Kubernetes 권한이 할당되어 있습니다.

**참고**  
IMDS에 대한 액세스 권한을 차단하지 않는 한 Kubernetes용 Amazon VPC CNI 플러그인의 포드는 [Amazon EKS 노드 IAM 역할](create-node-role.md)에 할당된 권한에 대한 액세스 권한이 있습니다. 자세한 내용은 [작업자 노드에 할당된 인스턴스 프로필에 대한 액세스 제한](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node) 부분을 참조하세요.
+ 기존 Amazon EKS 클러스터가 필요합니다. 배포하려면 [Amazon EKS 시작하기](getting-started.md) 부분을 참조하세요.
+ 클러스터에 대한 기존 AWS Identity and Access Management(IAM) OpenID Connect(OIDC) 공급자가 필요합니다. 이미 있는지 아니면 생성해야 하는지 확인하려면 [클러스터에 대한 IAM OIDC 공급자 생성](enable-iam-roles-for-service-accounts.md) 부분을 참조하세요.

## 1단계: Kubernetes용 Amazon VPC CNI 플러그인 IAM 역할 생성
<a name="cni-iam-role-create-role"></a>

1. 클러스터의 IP 패밀리를 확인합니다.

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

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

   ```
   "ipFamily": "ipv4"
   ```

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

1. 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\$1CNI\$1IPv6\$1Policy*를 `IPv6` 정책 이름으로 바꿉니다. `IPv6` 정책이 없는 경우 [`IPv6` 패밀리를 사용하는 클러스터에 대한 IAM 정책 생성](#cni-iam-role-create-ipv6-policy) 섹션을 참조하여 생성합니다. 클러스터에서 `IPv6`를 사용하려면 여러 요구 사항을 충족해야 합니다. 자세한 내용은 [클러스터, 포드 및 서비스에 대한 IPv6 주소에 대해 알아보기](cni-ipv6.md) 섹션을 참조하세요.

       ```
       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 공급자를 생성해야](enable-iam-roles-for-service-accounts.md) 합니다.

   1. 다음 콘텐츠를 *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"
                      }
                  }
              }
          ]
      }
      ```

   1. 역할을 생성합니다. *AmazonEKSVPCCNIRole*을 선택한 이름으로 바꿀 수 있습니다.

      ```
      aws iam create-role \
        --role-name AmazonEKSVPCCNIRole \
        --assume-role-policy-document file://"vpc-cni-trust-policy.json"
      ```

   1. 필요한 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\$1CNI\$1IPv6\$1Policy*를 `IPv6` 정책 이름으로 바꿉니다. `IPv6` 정책이 없는 경우 [`IPv6` 패밀리를 사용하는 클러스터에 대한 IAM 정책 생성](#cni-iam-role-create-ipv6-policy) 섹션을 참조하여 생성합니다. 클러스터에서 `IPv6`를 사용하려면 여러 요구 사항을 충족해야 합니다. 자세한 내용은 [클러스터, 포드 및 서비스에 대한 IPv6 주소에 대해 알아보기](cni-ipv6.md) 섹션을 참조하세요.

        ```
        aws iam attach-role-policy \
          --policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy \
          --role-name AmazonEKSVPCCNIRole
        ```

   1. 다음 명령을 실행하여 이전에 생성한 IAM 역할의 ARN을 사용하여 `aws-node` 서비스 계정에 주석을 추가합니다. 예제 값을 사용자의 값으로 바꿉니다.

      ```
      kubectl annotate serviceaccount \
          -n kube-system aws-node \
          eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole
      ```

1. (선택 사항) Kubernetes 서비스 계정에서 사용하는 AWS 보안 토큰 Kubernetes 서비스 엔드포인트 유형을 구성합니다. 자세한 내용은 [서비스 계정의 AWS 보안 토큰 서비스 엔드포인트 구성](configure-sts-endpoint.md) 섹션을 참조하세요.

## 2단계: Kubernetes용 Amazon VPC CNI 플러그인 포드 재배포
<a name="cni-iam-role-redeploy-pods"></a>

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

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

1. 포드가 모두 다시 시작되었는지 확인합니다.

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

1. 포드 중 하나를 설명하고 `AWS_WEB_IDENTITY_TOKEN_FILE` 및 `AWS_ROLE_ARN` 환경 변수가 있는지 확인합니다. *cpjw7*을 이전 단계의 출력에서 반환된 포드 중 하나의 이름으로 바꿉니다.

   ```
   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
   ```

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

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

   ```
   AWS_STS_REGIONAL_ENDPOINTS=regional
   ```

## 3단계: 노드 IAM 역할에서 CNI 정책 제거
<a name="remove-cni-policy-node-iam-role"></a>

현재 [Amazon EKS 노드 IAM 역할](create-node-role.md)에 `AmazonEKS_CNI_Policy` IAM(`IPv4`) 정책 또는 [IPv6 정책](#cni-iam-role-create-ipv6-policy)이 연결되어 있고 별도의 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\$1CNI\$1IPv6\$1Policy*를 `IPv6` 정책 이름으로 바꿉니다.

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

## `IPv6` 패밀리를 사용하는 클러스터에 대한 IAM 정책 생성
<a name="cni-iam-role-create-ipv6-policy"></a>

`IPv6` 패밀리를 사용하는 클러스터를 생성했고 클러스터에 버전 `1.10.1` 이상의 Kubernetes용 Amazon VPC CNI 플러그인 추가 기능이 구성되어 있으면 IAM 역할에 할당할 수 있는 IAM 정책을 생성해야 합니다. 생성할 때 `IPv6` 패밀리로 구성하지 않은 기존 클러스터가 있는 경우 `IPv6`을 사용하려면 새 클러스터를 생성해야 합니다. 클러스터에서 `IPv6` 사용에 대한 자세한 내용을 알아보려면 [클러스터, 포드 및 서비스에 대한 IPv6 주소에 대해 알아보기](cni-ipv6.md) 섹션을 참조하세요.

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/*"
               ]
           }
       ]
   }
   ```

1. IAM 정책을 생성합니다.

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