내용으로 건너뛰기

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

6분 분량
0

내 포드가 Amazon Elastic Kubernetes Service(Amazon EKS) AWS 계정 토큰과 함께 AWS Identity and Access Management(IAM) 역할 권한을 사용할 수 없습니다.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

클러스터에 기존 IAM OIDC 공급자가 있는지 확인

OpenID Connect(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을 확인하려면 다음 describe-cluster AWS CLI 명령을 실행합니다.

    aws eks describe-cluster --name cluster_name --query "cluster.identity.oidc.issuer" --output text

    참고: cluster_name을 해당 클러스터 이름으로 대체하십시오.
    출력 예시:

    https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
  2. 계정의 IAM OIDC 공급자를 나열하려면 다음 list-open-id-connect-providers 명령을 실행합니다.

    aws iam list-open-id-connect-providers | grep EXAMPLED539D4633E53DE1B716D3041E

    참고: EXAMPLED539D4633E53DE1B716D3041E를 이전 명령에서 수신된 OIDC 공급자 URL로 대체하십시오.
    명령이 출력을 반환하면 클러스터에 이미 공급자가 있는 것입니다. 명령이 출력을 반환하지 않는 경우 IAM OIDC 공급자를 생성해야 합니다. 출력 예시:

    "Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"

IAM 역할에 필요한 권한과 연결된 IAM 정책이 있는지 확인하십시오.

다음 단계를 완료하십시오.

  1. IAM 콘솔을 엽니다.
  2. 탐색 창에서 역할을 선택합니다.
  3. Kubernetes 서비스 계정과 연결된 역할을 선택합니다.
  4. 권한 탭을 선택합니다. 그런 다음 역할에 연결된 정책을 확인하여 구성에 필요한 권한이 포함되어 있는지 확인합니다.
  5. 신뢰 관계 탭을 선택합니다. 그런 다음 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"
            }
          }
        }
      ]
    }
    또는 다음 get-role 명령을 실행하여 신뢰 관계를 확인합니다.
    aws iam get-role --role-name EKS-IRSA
    참고: EKS-IRSA를 서비스 계정의 IAM 역할(IRSA) 역할 이름으로 대체하십시오.
    출력 예시:
    {  "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"
        }
      }
    }
    출력 JSON에서 AssumeRolePolicyDocument 섹션을 확인하여 신뢰 관계 정책을 확인합니다.
  6. (선택 사항) 역할의 신뢰 관계를 올바른 AWS 리전, Kubernetes 서비스 계정 이름 또는 Kubernetes 네임스페이스로 업데이트합니다.

서비스 계정 생성 여부 확인

서비스 계정이 존재하는지 확인하려면 다음 명령을 실행합니다.

kubectl get sa -n YOUR_NAMESPACE

참고: YOUR_NAMESPACE를 해당 Kubernetes 네임스페이스로 대체하십시오.

출력 예시:

NAME      SECRETS   AGEdefault   1         28d
irsa      1         66m

출력에 서비스 계정이 나열되는지 확인합니다. 서비스 계정이 없는 경우 Kubernetes 웹 사이트에서 Configure service accounts for Pods를 참조하십시오.

서비스 계정에 올바른 IAM 역할 주석이 있는지 확인

서비스 계정에 올바른 IAM 역할 주석이 있는지 확인하려면 다음 명령을 실행합니다.

kubectl describe sa irsa -n YOUR_NAMESPACE

참고: irsa를 Kubernetes 서비스 계정 이름으로 바꾸고 YOUR_NAMESPACE를 Kubernetes 네임스페이스로 바꿉니다.

출력 예시:

Name:                irsa
Namespace:           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

주석을 확인하여 IAM 역할이 올바른지 확인합니다. 올바르지 않은 경우 다음 명령을 실행하여 서비스 계정을 편집합니다.

kubectl edit sa -n NAMESPACE

참고: NAMESPACE를 해당 네임스페이스로 대체하십시오.

그런 다음 올바른 IAM 역할로 주석 값을 업데이트합니다.

포드에서 serviceAccountName을 올바르게 지정했는지 확인

serviceAccountName을 확인하려면 다음 명령을 실행합니다.

kubectl get pod POD_NAME  -o yaml -n YOUR_NAMESPACE| grep -i serviceAccountName:

참고: POD_NAME을 Kubernetes 포드로, YOUR_NAMESPACE를 해당 네임스페이스로 대체하십시오.

출력 예시:

serviceAccountName: irsa

출력 값의 서비스 계정 이름이 잘못된 경우 배포 매니페스트를 올바른 이름으로 편집합니다. 그런 다음 배포 매니페스트를 재배포합니다.

환경 변수 및 권한 확인

포드의 환경 변수를 확인하려면 다음 명령을 실행합니다.

kubectl -n YOUR_NAMESPACE exec -it POD_NAME -- env | grep AWS

출력 예시:

AWS_REGION=ap-southeast-2
AWS_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

출력에 서비스 계정이 나열되는지 확인합니다. 서비스 계정이 없는 경우 Kubernetes 웹 사이트에서 Configure service accounts for pods를 참조하십시오.

애플리케이션이 지원되는 AWS SDK를 사용하는지 확인

AWS 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 자격 증명 공급자를 확인하려면 다음 get-open-id-connect-provider 명령을 실행합니다.

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

참고: ACCOUNT_ID를 계정 ID로, AWS_REGION을 해당 리전으로, EXAMPLED539D4633E53DE1B716D3041E를 OIDC 공급자 URL로 대체하십시오.

출력 예시:

{  "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": []
}

출력에서 ClientIDListsts.amazonaws.com인지 확인합니다. 그렇지 않은 경우 역할에 자격 증명 공급자를 추가하고 대상sts.amazonaws.com을 입력하십시오.

지문을 올바르게 구성했는지 확인하십시오.

IAM OIDC에서 구성한 지문이 올바르지 않으면 다음과 같은 오류가 표시됩니다.

"failed to retrieve credentials caused by: InvalidIdentityToken: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint"

올바른 지문을 자동으로 구성하려면 eksctl 또는 Amazon EKS 콘솔을 사용하여 IAM 자격 증명 공급자를 생성하십시오. 지문을 얻는 다른 방법은 OpenID Connect 자격 증명 공급자의 지문 가져오기를 참조하십시오.

(AWS 중국 리전만 해당) AWS_DEFAULT_REGION 환경 변수 확인

IRSA 적용 파드 또는 데몬셋을 AWS 중국 리전의 클러스터에 배포하려면 포드 사양에 AWS_DEFAULT_REGION을 설정해야 합니다. 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"
...

또는 다음 명령을 실행하여 환경 변수를 설정합니다.

kubectl set env deployment deployment_name AWS_DEFAULT_REGION=example_region -n NAMESPACE"

참고: deployment_name을 해당 배포 이름으로, example_region을 AWS 중국 리전으로, NAMESPACE를 해당 네임스페이스로 대체하십시오.

AWS 공식업데이트됨 일 년 전