Amazon EKS에서 OIDC 공급자 및 IRSA 문제를 해결하려면 어떻게 해야 하나요?
내 포드는 Amazon Elastic Kubernetes Service(Amazon EKS) 계정 토큰과 함께 AWS Identity and Access Management(IAM) 역할 권한을 사용할 수 없습니다.
해결 방법
클러스터에 기존 IAM OIDC 공급자가 있는지 확인
제공자가 이미 있는 경우 다음과 비슷한 오류가 나타납니다. "WebIdentityErr: failed to retrieve credentials\ncaused by: InvalidIdentityToken: No OpenIDConnect provider found in your account for https://oidc.eks.eu-west-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E\n\tstatus code: 400";
기존 IAM OIDC 공급자가 있는지 확인하려면 다음 단계를 완료하세요.
-
클러스터의 OIDC 제공자 URL을 확인하세요.
$ aws eks describe-cluster --name cluster_name --query "cluster.identity.oidc.issuer" --output text
출력 예시:
https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
-
계정의 IAM OIDC 공급자를 나열하세요. EXAMPLED539D4633E53DE1B716D3041E를 이전 명령이 반환한 값으로 바꿉니다.
aws iam list-open-id-connect-providers | grep EXAMPLED539D4633E53DE1B716D3041E
출력 예시:
"Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"
명령이 출력을 반환하면 클러스터에 이미 공급자가 있는 것입니다. 명령이 출력을 반환하지 않는 경우 IAM OIDC 공급자를 생성해야 합니다.
IAM 역할에 필요한 권한과 연결된 IAM 정책이 있는지 확인하세요.
참고: AWS Command Line Interface(AWS CLI) 명령 실행 시 오류가 발생하는 경우, AWS CLI 오류 문제 해결을 참고하세요. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하세요.
IAM 역할에 필요한 권한이 있는지 확인하려면 다음 단계를 완료하세요.
- IAM 콘솔을 엽니다.
- 탐색 창에서 역할을 선택합니다.
- 확인하려는 역할을 선택합니다.
- 권한 탭에서 필요한 정책이 역할에 연결되어 있는지 확인합니다.
- IAM 역할 신뢰 관계가 올바르게 설정되었는지 확인합니다.
IAM 역할에 연결된 정책이 있는지 확인하려면 다음 단계를 완료하세요.
-
IAM 콘솔을 엽니다.
-
탐색 창에서 역할을 선택합니다.
-
확인하려는 역할을 선택합니다.
-
신뢰 관계 탭을 선택합니다. 정책 형식이 다음 JSON 정책의 형식과 일치하는지 확인하세요.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME", "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com" } } } ] }
신뢰 관계를 확인하려면 AWS Command Line Interface (AWS CLI)에서 get-role 명령을 실행합니다.
$ aws iam get-role --role-name EKS-IRSA
참고: EKS-IRSA를 IAM 역할 이름으로 바꿉니다.
출력 JSON에서 AssumeRolePolicyDocument 섹션을 찾아보세요.
출력 예시:{ "Role": { "Path": "/", "RoleName": "EKS-IRSA", "RoleId": "AROAQ55NEXAMPLELOEISVX", "Arn": "arn:aws:iam::ACCOUNT_ID:role/EKS-IRSA", "CreateDate": "2021-04-22T06:39:21+00:00", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com", "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME" } } } ] }, "MaxSessionDuration": 3600, "RoleLastUsed": { "LastUsedDate": "2021-04-22T07:01:15+00:00", "Region": "AWS_REGION" } } }
참고: 사용 사례에 따라 AWS 리전, Kubernetes 서비스 계정 이름, Kubernetes 네임스페이스를 업데이트하세요.
서비스 계정 생성 여부 확인
다음 명령을 실행합니다.
$ kubectl get sa -n YOUR_NAMESPACE
참고: YOUR_NAMESPACE를 Kubernetes 네임스페이스로 바꿉니다.
출력 예시:
NAME SECRETS AGEdefault 1 28d irsa 1 66m
서비스 계정이 없는 경우 Kubernetes 웹 사이트에서 포드의 서비스 계정 구성을 참조하세요.
서비스 계정에 올바른 IAM 역할 주석이 있는지 확인
서비스 계정에 올바른 IAM 역할 주석이 있는지 확인하려면 다음 명령을 실행합니다.
$ kubectl describe sa irsa -n YOUR_NAMESPACE
참고: irsa를 Kubernetes 서비스 계정 이름으로 바꾸고 YOUR_NAMESPACE를 Kubernetes 네임스페이스로 바꿉니다.
출력 예시:
Name: irsaNamespace: default Labels: none Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME Image pull secrets: none Mountable secrets: irsa-token-v5rtc Tokens: irsa-token-v5rtc Events: none
포드에서 serviceAccountName을 올바르게 지정했는지 확인합니다.
serviceAccountName을 확인하려면 다음 명령을 실행합니다.
$ kubectl get pod POD_NAME -o yaml -n YOUR_NAMESPACE| grep -i serviceAccountName:
참고: POD_NAME 및 YOUR_NAMESPACE를 Kubernetes 포드 및 네임스페이스로 바꿉니다.
출력 예시:
serviceAccountName: irsa
환경 변수 및 권한 확인
파드의 환경 변수에서 AWS_ROLE_ARN 및 AWS_WEB_IDENTITY_TOKEN_FILE을 찾아보세요.
$ kubectl -n YOUR_NAMESPACE exec -it POD_NAME -- env | grep AWS
출력 예시:
AWS_REGION=ap-southeast-2AWS_ROLE_ARN=arn:aws:iam::111122223333:role/EKS-IRSA AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token AWS_DEFAULT_REGION=ap-southeast-2
애플리케이션이 지원되는 AWS SDK를 사용하는지 확인
SDK 버전은 다음 값보다 크거나 같아야 합니다.
Java (Version 2) — 2.10.11Java — 1.11.704 Go — 1.23.13 Python (Boto3) — 1.9.220 Python (botocore) — 1.12.200 AWS CLI — 1.16.232 Node — 3.15.0 Ruby — 2.11.345 C++ — 1.7.174 .NET — 3.3.659.1 PHP — 3.110.7
지원되는 최신 SDK 버전을 확인하려면 지원되는 AWS SDK 사용을 참조하세요.
포드 재생성
IRSA를 적용하기 전에 포드를 생성한 경우 다음 명령을 실행하여 포드를 다시 생성합니다.
$ kubectl rollout restart deploy nginx
출력 예시:
deployment.apps/nginx restarted
daemonsets 또는 statefulsets 배포의 경우 다음 명령을 실행합니다.
$ kubectl rollout restart deploy DEPLOYMENT_NAME
포드를 하나만 생성한 경우 해당 포드를 삭제하고 다시 생성해야 합니다.
- 다음 명령을 실행하여 버킷 정책을 삭제합니다.
참고: POD_NAME을 사용자의 포드 이름으로 바꿉니다.$ kubectl delete pod POD_NAME
- 다음 명령을 실행하여 포드를 다시 생성합니다.
참고: SPEC_FILE을 Kubernetes 매니페스트 파일 경로 및 파일 이름으로 바꿉니다.$ kubectl apply -f SPEC_FILE
시청자가 올바른지 확인
잘못된 대상 그룹을 사용하여 OIDC 공급자를 생성한 경우 다음과 같은 오류 메시지가 나타납니다. "Error - An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience".
클러스터의 IAM ID 공급자를 확인하세요. ClientIDList은 sts.amazonaws.com입니다.
$ aws iam get-open-id-connect-provider --open-id-connect-provider-arn arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
출력 예시:
{ "Url": "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E", "ClientIDList": [ "sts.amazonaws.com" ], "ThumbprintList": [ "9e99a48a9960b14926bb7f3b02e22da2b0ab7280" ], "CreateDate": "2021-01-21T04:29:09.788000+00:00", "Tags": [] }
지문을 올바르게 구성했는지 확인하세요.
IAM OIDC에 구성된 지문이 올바르지 않으면 다음 오류 메시지가 나타납니다. “failed to retrieve credentials caused by: InvalidIdentityToken: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint"
올바른 지문을 자동으로 구성하려면 eksctl 또는 AWS Management Console을 사용하여 IAM 자격 증명 공급자를 생성하세요. 지문을 얻는 다른 방법은 OpenID Connect ID 공급자에 대한 지문 가져오기를 참조하세요.
AWS 중국 리전의 경우 AWS_DEFAULT_REGION 환경 변수를 확인하세요.
AWS 중국 리전의 클러스터에 배포된 IRSA 적용 포드 또는 대몬셋의 경우 포드 사양에서 AWS_DEFAULT_REGION 환경 변수를 설정합니다. 이 변수를 설정하지 않으면 포드 또는 대몬셋에서 다음 오류가 발생할 수 있습니다. "An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid".
AWS_DEFAULT_REGION 환경 변수를 포드 또는 대몬셋 사양에 추가하려면 다음 예와 비슷한 명령을 실행합니다.
apiVersion: apps/v1kind: Deployment metadata: name: my-app spec: template: metadata: labels: app: my-app spec: serviceAccountName: my-app containers: - name: my-app image: my-app:latest env: - name: AWS_DEFAULT_REGION value: "AWS_REGION" ...
관련 콘텐츠
- 질문됨 8달 전lg...
- 질문됨 6일 전lg...
- AWS 공식업데이트됨 9달 전
- AWS 공식업데이트됨 8달 전