이 페이지 개선에 도움 주기
이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 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 정책을 연결하려면 다음 단계로 건너뜁니다.
-
IAM 정책을 생성합니다. 자체 정책을 생성하거나 필요한 권한 중 일부를 이미 부여하는 AWS 관리형 정책을 복사하여 특정 요구 사항에 맞게 사용자 지정할 수 있습니다. 자세한 내용은 IAM 사용 설명서에서 IAM 정책 생성을 참조하세요.
-
포드가 액세스할 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
-
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-account
를 eksctl
이 생성하고 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 서비스 계정이 있는 경우 이 단계를 건너뛸 수 있습니다.
-
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
-
다음 명령을 사용해 AWS 계정 ID를 환경 변수로 설정합니다.
account_id=$(aws sts get-caller-identity --query "Account" --output text)
-
다음 명령을 사용해 클러스터의 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:\/\///")
-
서비스 계정의 네임스페이스 및 이름에 대한 변수를 설정합니다.
my-service-account
를 역할을 수임할 Kubernetes 서비스 계정으로 바꿉니다.기본
을 서비스 계정의 네임스페이스로 바꿉니다.export namespace=default export service_account=my-service-account
-
다음 명령을 실행하여 IAM 역할에 대한 신뢰 정책 파일을 생성합니다. 네임스페이스 내의 모든 서비스 계정이 역할을 사용하도록 허용하려면 다음 내용을 디바이스에 복사합니다.
StringEquals
를StringLike
로 바꾸고$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
-
역할을 생성합니다.
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"
-
역할에 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
-
서비스 계정이 수임할 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
-
(선택 사항) 서비스 계정에 대한 AWS Security Token Service 엔드포인트를 구성합니다. AWS는 글로벌 엔드포인트 대신 리전 AWS STS 엔드포인트를 사용할 것을 권장합니다. 이렇게 하면 지연 시간이 줄고, 중복성이 기본 제공되고, 세션 토큰 유효성이 향상됩니다.
3단계: 구성 확인
-
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" } } } ] }
-
이전 단계에서 역할에 연결한 정책이 해당 역할에 연결되었는지 확인합니다.
aws iam list-attached-role-policies --role-name my-role --query AttachedPolicies[].PolicyArn --output text
예제 출력은 다음과 같습니다.
arn:aws:iam::111122223333:policy/my-policy
-
사용하려는 정책의 Amazon 리소스 이름(ARN)을 저장할 변수를 설정합니다.
my-policy
를 권한을 확인하려는 정책의 이름으로 바꿉니다.export policy_arn=arn:aws:iam::111122223333:policy/my-policy
-
정책의 기본 버전을 봅니다.
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", [...] } }
-
정책 내용을 보고 포드에 필요한 모든 권한이 정책에 포함되어 있는지 확인합니다. 필요한 경우 다음 명령에서
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" } ] }
이전 단계에서 예제 정책을 생성한 경우 출력은 동일합니다. 다른 정책을 생성한 경우
예제
내용이 다릅니다. -
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 [...]