Kubernetes 서비스 계정에 IAM 역할 할당 - Amazon EKS

이 페이지 개선에 도움 주기

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

Kubernetes 서비스 계정에 IAM 역할 할당

이 주제에서는 Kubernetes 서비스 계정이 AWS Identity and Access Management(IAM) 역할을 수임하도록 구성하는 방법에 대해 설명합니다. 서비스 계정을 사용하도록 구성된 모든 포드는 해당 역할에 액세스 권한이 있는 모든 AWS 서비스에 액세스할 수 있습니다.

사전 조건

  • 기존 클러스터가 있어야 합니다. 아직 없는 경우 Amazon EKS 시작하기 안내서 중 하나에 따라 생성할 수 있습니다.

  • 클러스터에 대한 기존 IAM OpenID Connect(OIDC) 공급자. 이미 있는지 확인하거나 생성하는 방법을 알아보려면 클러스터에 대한 IAM OIDC 공급자 생성 섹션을 참조하세요.

  • 장치에 설치 및 구성된 AWS 명령줄 인터페이스(AWS CLI)의 버전 2.12.3 이상 또는 버전 1.27.160 이상 또는 AWS CloudShell. 현재 버전을 확인하려면 aws --version | cut -d / -f2 | cut -d ' ' -f1을 사용합니다. yum, apt-get 또는 macOS용 Homebrew와 같은 패키지 관리자는 최신 버전의 AWS CLI 이전에 나온 버전이 몇 가지 있을 때도 있습니다. 최신 버전을 설치하려면 AWS 명령줄 인터페이스 사용 설명서에서 설치aws config를 사용하여 빠른 구성을 참조하세요. AWS CloudShell에 설치된 AWS CLI 버전도 최신 버전보다 여러 버전 이전일 수도 있습니다. 업데이트하려면 AWS CloudShell 사용 설명서홈 디렉터리에 AWS CLI 설치하기를 참조하세요.

  • kubectl 명령줄 도구는 장치 또는 AWS CloudShell에 설치됩니다. 버전은 클러스터의 Kubernetes 버전과 동일하거나 최대 하나 이전 또는 이후의 마이너 버전일 수 있습니다. 예를 들어, 클러스터 버전이 1.29인 경우 kubectl 버전 1.28, 1.29 또는 1.30를 함께 사용할 수 있습니다. kubectl을 설치하거나 업그레이드하려면 kubectl 및 eksctl 설정 부분을 참조하세요.

  • 클러스터 구성이 포함된 기존 kubectl config 파일입니다. kubectl config 파일을 생성하려면 Kubeconfig 파일을 생성하여 kubectl을 EKS 클러스터에 연결 섹션을 참조하세요.

1단계: IAM 정책 생성

IAM 역할에 기존 IAM 정책을 연결하려면 다음 단계로 건너뜁니다.

  1. IAM 정책을 생성합니다. 자체 정책을 생성하거나 필요한 권한 중 일부를 이미 부여하는 AWS 관리형 정책을 복사하여 특정 요구 사항에 맞게 사용자 지정할 수 있습니다. 자세한 내용은 IAM 사용 설명서에서 IAM 정책 생성을 참조하세요.

  2. 포드가 액세스할 AWS 서비스에 대한 권한이 포함된 파일을 생성합니다. 모든 AWS 서비스에 대한 모든 작업 목록은 서비스 승인 참조에서 확인하세요.

    다음 명령을 실행하여 Amazon S3 버킷에 대한 읽기 전용 액세스를 허용하는 예제 정책 파일을 생성할 수 있습니다. 이 버킷에 구성 정보 또는 부트스트랩 스크립트를 저장할 수도 있고, 의 컨테이너는 이 버킷에서 파일을 읽어 애플리케이션으로 로드할 수 있습니다. 이 예제 정책을 생성하려면 다음 내용을 디바이스에 복사합니다. my-pod-secrets-bucket을 버킷 이름으로 바꾸고 명령을 실행합니다.

    cat >my-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] } EOF
  3. IAM 정책을 생성합니다.

    aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json

2단계: IAM 역할 생성 및 연결

IAM 역할을 생성하고 Kubernetes 서비스 계정에 연결합니다. eksctl 또는 AWS CLI를 사용할 수 있습니다.

역할 생성 및 연결(eksctl)

장치에 설치된 eksctl 명령줄 도구의 버전 0.204.0 이상 또는 AWS CloudShell이 필요합니다. eksctl을 설치 또는 업그레이드하려면 eksctl 설명서에서 설치를 참조하세요.

my-service-accounteksctl이 생성하고 IAM 역할과 연결할 Kubernetes 서비스 계정의 이름으로 바꿉니다. 기본eksctl이 서비스 계정을 생성할 네임스페이스로 바꿉니다. my-cluster를 해당 클러스터의 이름으로 바꿉니다. my-role을 서비스 계정을 연결할 역할의 이름으로 바꿉니다. 역할이 아직 없는 경우 eksctl이 자동으로 역할을 생성합니다. 111122223333을 계정 ID로 바꾸고 my-policy를 기존 정책의 이름으로 바꿉니다.

eksctl create iamserviceaccount --name my-service-account --namespace default --cluster my-cluster --role-name my-role \ --attach-policy-arn arn:aws:iam::111122223333:policy/my-policy --approve
중요

역할 또는 서비스 계정이 이미 있는 경우 이전 명령이 실패할 수 있습니다. eksctl에는 이러한 상황에서 제공할 수 있는 다양한 옵션이 있습니다. 자세한 내용을 알아보려면 eksctl create iamserviceaccount --help를 실행하세요.

역할 생성 및 연결(AWS CLI)

IAM 역할을 수임하려는 기존 Kubernetes 서비스 계정이 있는 경우 이 단계를 건너뛸 수 있습니다.

  1. Kubernetes 서비스 계정을 생성합니다. 다음 콘텐츠를 디바이스에 복사합니다. my-service-account를 원하는 이름으로 바꾸고 필요한 경우 기본을 다른 네임스페이스로 바꿉니다. 기본을 변경하는 경우, 네임스페이스가 이미 존재해야 합니다.

    cat >my-service-account.yaml <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: my-service-account namespace: default EOF kubectl apply -f my-service-account.yaml
  2. 다음 명령을 사용해 AWS 계정 ID를 환경 변수로 설정합니다.

    account_id=$(aws sts get-caller-identity --query "Account" --output text)
  3. 다음 명령을 사용해 클러스터의 OIDC ID 제공업체를 환경 변수로 설정합니다. my-cluster를 해당 클러스터의 이름으로 바꿉니다.

    oidc_provider=$(aws eks describe-cluster --name my-cluster --region $AWS_REGION --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
  4. 서비스 계정의 네임스페이스 및 이름에 대한 변수를 설정합니다. my-service-account를 역할을 수임할 Kubernetes 서비스 계정으로 바꿉니다. 기본을 서비스 계정의 네임스페이스로 바꿉니다.

    export namespace=default export service_account=my-service-account
  5. 다음 명령을 실행하여 IAM 역할에 대한 신뢰 정책 파일을 생성합니다. 네임스페이스 내의 모든 서비스 계정이 역할을 사용하도록 허용하려면 다음 내용을 디바이스에 복사합니다. StringEqualsStringLike로 바꾸고 $service_account*로 바꿉니다. 여러 서비스 계정 또는 네임스페이스가 역할을 수임할 수 있도록 StringEquals 또는 StringLike 조건에 여러 항목을 추가할 수 있습니다. 클러스터가 속한 계정과 다른 AWS 계정의 역할이 역할을 수임하도록 허용하려면 IRSA를 사용하여 다른 계정에 인증 섹션에서 자세한 내용을 참조하세요.

    cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::$account_id:oidc-provider/$oidc_provider" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "$oidc_provider:aud": "sts.amazonaws.com", "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account" } } } ] } EOF
  6. 역할을 생성합니다. my-role을 IAM 역할의 이름으로 바꾸고, my-role-description을 역할에 대한 설명으로 바꿉니다.

    aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
  7. 역할에 IAM 정책을 연결합니다. my-role을 IAM 역할의 이름으로 바꾸고 my-policy를 생성한 기존 정책의 이름으로 바꿉니다.

    aws iam attach-role-policy --role-name my-role --policy-arn=arn:aws:iam::$account_id:policy/my-policy
  8. 서비스 계정이 수임할 IAM 역할의 Amazon 리소스 이름(ARN)을 서비스 계정에 주석으로 답니다. my-role을 기존 IAM 역할의 이름으로 바꿉니다. 클러스터가 속한 계정과 다른 AWS 계정의 역할이 이전 단계에서 역할을 수임하도록 허용했다고 가정합니다. 그런 다음 AWS 계정과 다른 계정의 역할을 지정해야 합니다. 자세한 내용은 IRSA를 사용하여 다른 계정에 인증 단원을 참조하십시오.

    kubectl annotate serviceaccount -n $namespace $service_account eks.amazonaws.com/role-arn=arn:aws:iam::$account_id:role/my-role
  9. (선택 사항) 서비스 계정에 대한 AWS Security Token Service 엔드포인트를 구성합니다. AWS는 글로벌 엔드포인트 대신 리전 AWS STS 엔드포인트를 사용할 것을 권장합니다. 이렇게 하면 지연 시간이 줄고, 중복성이 기본 제공되고, 세션 토큰 유효성이 향상됩니다.

3단계: 구성 확인

  1. IAM 역할의 신뢰 정책이 올바르게 구성되었는지 확인합니다.

    aws iam get-role --role-name my-role --query Role.AssumeRolePolicyDocument

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

    { "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:sub": "system:serviceaccount:default:my-service-account", "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com" } } } ] }
  2. 이전 단계에서 역할에 연결한 정책이 해당 역할에 연결되었는지 확인합니다.

    aws iam list-attached-role-policies --role-name my-role --query AttachedPolicies[].PolicyArn --output text

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

    arn:aws:iam::111122223333:policy/my-policy
  3. 사용하려는 정책의 Amazon 리소스 이름(ARN)을 저장할 변수를 설정합니다. my-policy를 권한을 확인하려는 정책의 이름으로 바꿉니다.

    export policy_arn=arn:aws:iam::111122223333:policy/my-policy
  4. 정책의 기본 버전을 봅니다.

    aws iam get-policy --policy-arn $policy_arn

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

    { "Policy": { "PolicyName": "my-policy", "PolicyId": "EXAMPLEBIOWGLDEXAMPLE", "Arn": "arn:aws:iam::111122223333:policy/my-policy", "Path": "/", "DefaultVersionId": "v1", [...] } }
  5. 정책 내용을 보고 포드에 필요한 모든 권한이 정책에 포함되어 있는지 확인합니다. 필요한 경우 다음 명령에서 1을 이전 출력에서 반환된 버전으로 바꿉니다.

    aws iam get-policy-version --policy-arn $policy_arn --version-id v1

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

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] }

    이전 단계에서 예제 정책을 생성한 경우 출력은 동일합니다. 다른 정책을 생성한 경우 예제 내용이 다릅니다.

  6. Kubernetes 서비스 계정에 역할이 주석으로 달렸는지 확인합니다.

    kubectl describe serviceaccount my-service-account -n default

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

    Name: my-service-account Namespace: default Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/my-role Image pull secrets: <none> Mountable secrets: my-service-account-token-qqjfl Tokens: my-service-account-token-qqjfl [...]

다음 단계