Kubernetes 서비스 계정에 IAM 역할 할당
Kubernetes 서비스 계정에 IAM 역할 할당 (EKS Pod Identity)
EKS Pod Identity로 Kubernetes 서비스 계정이 AWS Identity and Access Management(IAM) 역할을 수임하도록 구성하는 방법을 설명합니다. 해당 서비스 계정을 사용하도록 구성된 모든 Pod는 역할이 액세스 권한을 가진 모든 AWS 서비스에 액세스할 수 있습니다.
출처: 문서
본문
이 주제는 EKS Pod Identity로 Kubernetes 서비스 계정이 AWS Identity and Access Management(IAM) 역할을 수임하도록 구성하는 방법을 다룹니다. 해당 서비스 계정을 사용하도록 구성된 모든 Pod는 역할이 액세스 권한을 가진 모든 AWS 서비스에 액세스할 수 있습니다.
EKS Pod Identity 연결을 만들려면 단일 단계만 있습니다. AWS Management Console, AWS CLI, AWS SDK, AWS CloudFormation 및 기타 도구를 통해 EKS에서 연결을 만듭니다. 클러스터 내부의 Kubernetes 객체에는 연결에 대한 데이터나 메타데이터가 없으며 서비스 계정에 주석을 추가하지도 않습니다.
전제 조건
- 기존 클러스터. 없다면 "Amazon EKS 시작하기"의 안내 중 하나를 따라 생성할 수 있습니다.
- 연결을 만드는 IAM 보안 주체는
iam:PassRole권한이 있어야 합니다. - 사용 기기나 AWS CloudShell에 최신 버전의 AWS CLI가 설치되어 구성되어 있어야 합니다. 현재 버전은
aws --version | cut -d / -f2 | cut -d ' ' -f1으로 확인할 수 있습니다.yum,apt-get, macOS용 Homebrew 같은 패키지 관리자는 AWS CLI 최신 버전보다 몇 버전 뒤처져 있는 경우가 많습니다. 최신 버전 설치 방법은 AWS Command Line Interface 사용 설명서의 "Installing" 및 "aws configure를 사용한 빠른 구성"을 참고하세요. AWS CloudShell에 설치된 AWS CLI 버전도 최신 버전보다 몇 버전 뒤처져 있을 수 있습니다. 업데이트 방법은 AWS CloudShell 사용 설명서의 "홈 디렉터리에 AWS CLI 설치"를 참고하세요. - 사용 기기나 AWS CloudShell에
kubectl명령줄 도구가 설치되어 있어야 합니다. 버전은 클러스터의 Kubernetes 버전과 같거나 최대 한 개의 부 버전 앞뒤가 될 수 있습니다. 예를 들어 클러스터 버전이1.29라면kubectl버전1.28,1.29,1.30을 사용할 수 있습니다.kubectl설치 또는 업그레이드 방법은 "kubectl 및 eksctl 설정"을 참고하세요. - 클러스터 구성이 포함된 기존
kubectlconfig파일.kubectlconfig파일을 만들려면 "kubeconfig 파일을 만들어 kubectl을 EKS 클러스터에 연결"을 참고하세요.
Pod Identity 연결 생성 (AWS 콘솔)
- Amazon EKS 콘솔을 엽니다.
- 왼쪽 탐색 창에서 Clusters를 선택하고, EKS Pod Identity Agent 애드온을 구성할 클러스터의 이름을 선택합니다.
- Access 탭을 선택합니다.
- Pod Identity associations에서 Create를 선택합니다.
- IAM role에서 워크로드에 부여하려는 권한을 가진 IAM 역할을 선택합니다.
참고: 목록에는 EKS Pod Identity가 사용할 수 있게 하는 다음 신뢰 정책을 가진 역할만 포함됩니다.
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
"Effect": "Allow",
"Principal": {
"Service": "pods.eks.amazonaws.com"
},
"Action": [
"sts:AssumeRole",
"sts:TagSession"
]
}
]
}
sts:AssumeRole– EKS Pod Identity는 임시 자격 증명을 Pod에 전달하기 전에 IAM 역할을 수임하기 위해AssumeRole을 사용합니다.sts:TagSession– EKS Pod Identity는 AWS STS에 대한 요청에 세션 태그를 포함하기 위해TagSession을 사용합니다.
신뢰 정책의 조건 키에서 이러한 태그를 사용해 이 역할을 사용할 수 있는 서비스 계정, 네임스페이스 및 클러스터를 제한할 수 있습니다. Amazon EKS 조건 키 목록은 Service Authorization Reference의 "Conditions defined by Amazon Elastic Kubernetes Service"를, 조건 키를 사용할 수 있는 작업과 리소스는 "Actions defined by Amazon Elastic Kubernetes Service"를 참고하세요.
- Kubernetes namespace에서 서비스 계정과 워크로드가 포함된 Kubernetes 네임스페이스를 선택합니다. 선택적으로 클러스터에 존재하지 않는 네임스페이스 이름을 지정할 수 있습니다.
- Kubernetes service account에서 사용할 Kubernetes 서비스 계정을 선택합니다. Kubernetes 워크로드의 매니페스트는 이 서비스 계정을 지정해야 합니다. 선택적으로 클러스터에 존재하지 않는 서비스 계정 이름을 지정할 수 있습니다.
- (선택 사항) Disable session tags를 선택해 Pod Identity가 역할을 수임할 때 자동으로 추가하는 기본 세션 태그를 비활성화합니다.
- (선택 사항) Configure session policy를 토글해 IAM 역할에 연결된 IAM 정책에 정의된 권한을 넘어 이 Pod Identity 연결에 추가 제한을 적용하는 IAM 정책을 구성합니다.
참고: 세션 정책은 Disable session tags 설정이 선택된 경우에만 적용할 수 있습니다.
- (선택 사항) Tags에서 Add tag를 선택해 키-값 쌍으로 메타데이터를 추가합니다. 이 태그는 연결에 적용되며 IAM 정책에서 사용할 수 있습니다. 이 단계를 반복해 여러 태그를 추가할 수 있습니다.
- Create를 선택합니다.
Pod Identity 연결 생성 (AWS CLI)
기존 IAM 정책을 IAM 역할에 연결하려면 다음 단계로 건너뛰세요.
- IAM 정책을 생성합니다. 직접 정책을 만들거나, 이미 필요한 권한 중 일부를 부여하는 AWS 관리형 정책을 복사해 특정 요구 사항에 맞게 사용자 지정할 수 있습니다. 자세한 내용은 IAM 사용 설명서의 "IAM 정책 생성"을 참고하세요.
- Pod가 액세스하려는 AWS 서비스의 권한이 포함된 파일을 생성합니다. 모든 AWS 서비스의 모든 작업 목록은 Service Authorization Reference를 참고하세요.
다음 예제 정책 파일은 Amazon S3 버킷에 대한 읽기 전용 액세스를 허용합니다. 선택적으로 이 버킷에 구성 정보나 부트스트랩 스크립트를 저장하고, Pod의 컨테이너가 버킷에서 파일을 읽어 애플리케이션에 로드할 수 있습니다. 이 예제 정책을 생성하려면 다음 내용을 기기에 복사하고, my-pod-secrets-bucket을 버킷 이름으로 바꾼 다음 명령을 실행하세요.
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-pod-secrets-bucket"
}
]
}
- IAM 정책을 생성합니다.
aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
- IAM 역할을 생성해 Kubernetes 서비스 계정과 연결합니다.
IAM 역할을 수임할 기존 Kubernetes 서비스 계정이 있다면 이 단계를 건너뛸 수 있습니다.
Kubernetes 서비스 계정을 생성합니다. 다음 내용을 기기에 복사합니다. my-service-account를 원하는 이름으로, 필요에 따라 default를 다른 네임스페이스로 바꾸세요. default를 변경하는 경우 해당 네임스페이스가 이미 존재해야 합니다.
cat >my-service-account.yaml Note
참고: 서비스 계정용 IAM 역할과 달리, EKS Pod Identity는 서비스 계정의 주석을 사용하지 않습니다.
- 다음 명령을 실행해 연결을 생성합니다.
my-cluster를 클러스터 이름으로,my-service-account를 원하는 이름으로 바꾸고, 필요에 따라default를 다른 네임스페이스로 바꾸세요.
aws eks create-pod-identity-association --cluster-name my-cluster --role-arn arn:aws:iam::111122223333:role/my-role --namespace default --service-account my-service-account
예제 출력은 다음과 같습니다.
{
"association": {
"clusterName": "my-cluster",
"namespace": "default",
"serviceAccount": "my-service-account",
"roleArn": "arn:aws:iam::111122223333:role/my-role",
"associationArn": "arn:aws::111122223333:podidentityassociation/my-cluster/a-abcdefghijklmnop1",
"associationId": "a-abcdefghijklmnop1",
"tags": {},
"createdAt": 1700862734.922,
"modifiedAt": 1700862734.922
}
}
참고: 클러스터에 존재하지 않는 네임스페이스와 서비스 계정을 이름으로 지정할 수 있습니다. EKS Pod Identity 연결이 작동하려면 네임스페이스, 서비스 계정, 그리고 해당 서비스 계정을 사용하는 워크로드를 생성해야 합니다.
구성 확인
- IAM 역할의 신뢰 정책이 올바르게 구성되었는지 확인합니다.
aws iam get-role --role-name my-role --query Role.AssumeRolePolicyDocument
예제 출력은 다음과 같습니다.
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "pods.eks.amazonaws.com"
},
"Action": [
"sts:AssumeRole",
"sts:TagSession"
]
}
]
}
- 이전 단계에서 역할에 연결한 정책이 역할에 연결되어 있는지 확인합니다.
aws iam list-attached-role-policies --role-name my-role --query 'AttachedPolicies[].PolicyArn' --output text
예제 출력은 다음과 같습니다.
arn:aws:iam::111122223333:policy/my-policy
- 사용할 정책의 Amazon Resource Name(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",
[...]
}
}
- Pod에 필요한 모든 권한이 정책에 포함되어 있는지 정책 내용을 확인합니다. 필요하면 다음 명령의
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"
}
]
}
이전 단계에서 예제 정책을 생성했다면 출력이 동일합니다. 다른 정책을 만들었다면 example 내용이 다릅니다.
다음 단계
- 서비스 계정으로 Pod가 AWS 서비스에 액세스하도록 구성