Amazon EKS에서 OIDC 공급자 및 IRSA 문제를 해결하려면 어떻게 해야 하나요?

5분 분량
0

내 포드는 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 공급자가 있는지 확인하려면 다음 단계를 완료하세요.

  1. 클러스터의 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
  2. 계정의 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 역할에 필요한 권한이 있는지 확인하려면 다음 단계를 완료하세요.

  1. IAM 콘솔을 엽니다.
  2. 탐색 창에서 역할을 선택합니다.
  3. 확인하려는 역할을 선택합니다.
  4. 권한 탭에서 필요한 정책이 역할에 연결되어 있는지 확인합니다.
  5. IAM 역할 신뢰 관계가 올바르게 설정되었는지 확인합니다.

IAM 역할에 연결된 정책이 있는지 확인하려면 다음 단계를 완료하세요.

  1. IAM 콘솔을 엽니다.

  2. 탐색 창에서 역할을 선택합니다.

  3. 확인하려는 역할을 선택합니다.

  4. 신뢰 관계 탭을 선택합니다. 정책 형식이 다음 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_NAMEYOUR_NAMESPACE를 Kubernetes 포드 및 네임스페이스로 바꿉니다.

출력 예시:

serviceAccountName: irsa

환경 변수 및 권한 확인

파드의 환경 변수에서 AWS_ROLE_ARNAWS_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

포드를 하나만 생성한 경우 해당 포드를 삭제하고 다시 생성해야 합니다.

  1. 다음 명령을 실행하여 버킷 정책을 삭제합니다.
    $ kubectl delete pod POD_NAME
    참고: POD_NAME을 사용자의 포드 이름으로 바꿉니다.
  2. 다음 명령을 실행하여 포드를 다시 생성합니다.
    $ kubectl apply -f SPEC_FILE
    참고: SPEC_FILE을 Kubernetes 매니페스트 파일 경로 및 파일 이름으로 바꿉니다.

시청자가 올바른지 확인

잘못된 대상 그룹을 사용하여 OIDC 공급자를 생성한 경우 다음과 같은 오류 메시지가 나타납니다. "Error - An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience".

클러스터의 IAM ID 공급자를 확인하세요. ClientIDListsts.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"
...
AWS 공식
AWS 공식업데이트됨 9달 전
댓글 없음