Amazon EKS에서 클러스터를 생성한 후 다른 사용자 및 역할에 액세스 권한을 제공하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 9월 28일

kubectl 명령을 통해 Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터에 액세스하려고 하면 다음 권한 부여 오류가 발생합니다. "error: You must be logged in to the server (Unauthorized)." 이 오류를 해결하려면 어떻게 해야 합니까?

간략한 설명

AWS Identity and Access Management(IAM) 엔터티가 Amazon EKS 클러스터의 RBAC(역할 기반 액세스 제어) 구성에서 권한을 부여받지 않은 경우 권한 부여 오류가 발생합니다. Amazon EKS 클러스터가 aws-iam-authenticator에서 사용하는 것과 다른 IAM 사용자 또는 역할로 생성된 경우 이 상황이 발생합니다.

처음에는 Amazon EKS 클러스터 생성자에게만 클러스터를 구성할 system:masters 권한이 있습니다. system:masters 권한을 다른 사용자 및 역할로 확대하려면 aws-auth ConfigMap을 Amazon EKS 클러스터 구성에 추가해야 합니다. ConfigMap을 사용하면 다른 IAM 엔터티(예: 사용자 및 역할)에서 Amazon EKS 클러스터에 액세스할 수 있습니다.

참고: eksctl을 사용하는 경우 Weaveworks 웹 사이트에서 IAM 사용자 및 역할 관리의 해결 방법을 고려하십시오.

해결 방법

다음 단계를 완료하기 전에 Amazon EKS 클러스터를 구성할 마스터 액세스 권한이 있는 IAM 사용자 또는 IAM 역할(클러스터 생성자)을 식별하십시오. 또한 클러스터를 생성한 후 클러스터 생성자가 권한을 부여받을 IAM 사용자를 식별하십시오. 클러스터 생성자를 식별하려면 AWS CloudTrail에서 CreateCluster API 호출을 검색하고 API 호출의 userIdentity 섹션을 확인합니다.

참고: 다음 단계에서 클러스터 생성자는 cluster_creator이고 현재 클러스터에 액세스할 수 없지만 액세스 권한이 필요한 사용자는 designated_user입니다.

cluster_creator가 IAM 사용자인 경우 ConfigMap에 designated_user 추가

참고: AWS 명령줄 인터페이스(AWS CLI) 명령줄을 실행할 때 오류가 발생할 경우 AWS CLI의 가장 최신 버전을 사용하고 있는지 확인하세요.

1.    SSH를 사용하여 kubectl 인스턴스에 연결합니다.

2.    AWS CLI에서 다음 명령을 실행합니다.

aws sts get-caller-identity

출력에는 designated_user에 대한 IAM 사용자 세부 정보가 표시됩니다.

3.    기본 네임스페이스의 클러스터에서 실행 중인 포드를 나열하려면 kubectl 명령을 실행합니다.

kubectl get pods

출력에 다음이 표시됩니다. “error: You must be logged in to the server (Unauthorized).” 이 오류는 designated_user에게 Amazon EKS 클러스터에 액세스할 권한이 없음을 의미합니다.

4.    cluster_creator의 AWS 보안 액세스 키 및 AWS 액세스 키 ID를 구성하려면 다음 명령을 실행합니다.

aws configure

5.    cluster_creator에게 클러스터에 대한 액세스 권한이 있는지 확인하려면 다음 명령을 실행합니다.

kubectl get pods

unauthorized 오류 메시지는 나타나지 않아야 합니다. 출력에서는 기본 네임스페이스에서 실행 중인 모든 포드를 나열해야 합니다. 출력에서 리소스를 찾을 수 없다고 표시되면 실행 중인 포드가 없는 것입니다.

6.    클러스터에 대한 액세스 권한을 designated_user에게 제공하려면 mapUsers 섹션을 aws-auth.yaml 파일에 추가합니다. 클러스터의 사용자 또는 IAM 역할 관리에 나오는 aws-auth.yaml 예제 파일을 참조하십시오.

apiVersion: v1
kind: ConfigMap
metadata:
  name: aws-auth
  namespace: kube-system
data:
  mapRoles: |
    - rolearn: arn:aws:iam::11122223333:role/EKS-Worker-NodeInstanceRole-1I00GBC9U4U7B
      username: system:node:{{EC2PrivateDNSName}}
      groups:
        - system:bootstrappers
        - system:nodes

7.    6단계에 나온 aws-auth.yaml 파일의 mapUsers 섹션에 designated_user를 추가한 다음, 파일을 저장합니다. 예:

apiVersion: v1 
kind: ConfigMap 
metadata: 
  name: aws-auth 
  namespace: kube-system 
data: 
  mapRoles: | 
    - rolearn: arn:aws:iam::11122223333:role/EKS-Worker-NodeInstanceRole-1I00GBC9U4U7B 
      username: system:node:{{EC2PrivateDNSName}} 
      groups: 
        - system:bootstrappers 
        - system:nodes 
  mapUsers: | 
    - userarn: arn:aws:iam::11122223333:user/designated_user 
      username: designated_user 
      groups: 
        - system:masters

참고: 위 예제에서 username은 Kubernetes가 userarn에서 전달된 IAM 엔터티에 매핑하는 데 사용하는 이름입니다.

8.    새 ConfigMap을 클러스터의 RBAC 구성에 적용하려면 다음 명령을 실행합니다.

kubectl apply -f aws-auth.yaml

9.    designated_user의 자격 증명을 사용하도록 AWS CLI 구성을 다시 변경하려면 다음 명령을 실행합니다.

aws configure

10.    designated_user에게 클러스터에 대한 액세스 권한이 있는지 확인하려면 다음 명령을 실행합니다.

kubectl get pods

unauthorized 오류 메시지는 나타나지 않아야 합니다. 출력에서는 기본 네임스페이스에서 실행 중인 모든 포드를 나열해야 합니다. 출력에서 리소스를 찾을 수 없다고 표시되면 실행 중인 포드가 없는 것입니다.

cluster_creator가 IAM 역할인 경우 ConfigMap에 designated_user 추가

이전 단계에서는 cluster_creator의 자격 증명을 사용하여 designated_user에게 액세스 권한을 제공했습니다. 하지만 IAM 사용자 대신 IAM 역할에 의해 클러스터가 생성된 경우에는 사용할 수 있는 자격 증명이 없습니다. 이러한 경우 클러스터를 생성한 IAM 역할을 맡아 designated_user에게 액세스 권한을 제공해야 합니다. 클러스터 생성자가 IAM 역할이 아닌 경우 다음 단계를 완료할 필요가 없습니다.

designated_user에게 액세스 권한을 제공할 수 있도록 IAM 역할을 맡아 aws-auth ConfigMap을 편집하려면 다음 단계를 완료하십시오.

1.    designated_user의 IAM 사용자 세부 정보를 표시하려면 다음 명령을 실행합니다.

aws sts get-caller-identity

2.    designated_user에게 클러스터에 대한 액세스 권한이 있는지 확인하려면 다음 명령을 실행합니다.

kubectl get pods

출력에 다음 오류가 표시됩니다. “error: You must be logged in to the server (Unauthorized).” 이 오류는 지정된 사용자에게 Amazon EKS 클러스터를 구성할 권한이 없음을 의미합니다.

3.    designated_user에서 cluster_creator 역할을 가정하도록 하려면 다음 명령을 실행합니다.

aws sts assume-role --role-arn arn:aws:iam:11122223333:role/cluster_creator --role-session-name test

출력에는 cluster_creator의 수임된 역할을 사용하는 designated_user에 대한 임시 IAM 자격 증명이 표시됩니다.

4.    임시 IAM 자격 증명을 사용하여 AWS_ACCESS_KEY_ID, AWS_SESSION_TOKENAWS_SECRET_ACCESS_KEY 환경 변수를 설정합니다. 예:

export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SESSION_TOKEN=EXAMPLETOKEN
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

이제 AWS CLI는 환경 변수에 설정된 자격 증명의 우선순위를 설정하고 이를 사용하여 AWS 서비스를 호출합니다.

5.    AWS CLI가 cluster_creator에 대해 수임된 역할을 사용하는지 확인하려면 다음 명령을 실행합니다.

aws sts get-caller-identity

6.    클러스터에 대한 액세스 권한을 designated_user에게 제공하려면 mapUsers 섹션을 aws-auth.yaml 파일에 추가합니다. 클러스터의 사용자 또는 IAM 역할 관리에 나오는 aws-auth.yaml 예제 파일을 참조하십시오.

apiVersion: v1
kind: ConfigMap
metadata:
  name: aws-auth
  namespace: kube-system
data:
  mapRoles: |
    - rolearn: arn:aws:iam::11122223333:role/EKS-Worker-NodeInstanceRole-1I00GBC9U4U7B
      username: system:node:{{EC2PrivateDNSName}}
      groups:
        - system:bootstrappers
        - system:nodes

7.    aws-auth.yaml 파일에 mapUsers를 추가합니다. 예:

apiVersion: v1 
kind: ConfigMap 
metadata: 
  name: aws-auth 
  namespace: kube-system 
data: 
  mapRoles: | 
    - rolearn: arn:aws:iam::11122223333:role/EKS-Worker-NodeInstanceRole-1I00GBC9U4U7B
      username: system:node:{{EC2PrivateDNSName}} 
      groups: 
        - system:bootstrappers 
        - system:nodes 
  mapUsers: | 
    - userarn: arn:aws:iam::11122223333:user/designated_user 
      username: designated_user 
      groups: 
        - system:masters

참고: 위 예제에서 username은 Kubernetes가 userarn에서 전달된 IAM 엔터티에 매핑하는 데 사용하는 이름입니다.

8.    designated_useraws-auth.yaml 파일에 추가하고 변경 사항을 저장합니다.

9.    새 구성을 Amazon EKS 클러스터의 RBAC 구성에 적용하려면 다음 명령을 실행합니다.

kubectl apply -f aws-auth-cm.yml

10.    다음 환경 변수의 설정을 해제하려면 다음 명령을 실행합니다.

unset AWS_ACCESS_KEY_ID
unset AWS_SESSION_TOKEN
unset AWS_SECRET_ACCESS_KEY

11.    designated_user의 IAM 사용자 세부 정보를 표시하려면 다음 명령을 실행합니다.

aws sts get-caller-identity

12.    designated_user에게 클러스터에 대한 액세스 권한이 있는지 확인하려면 다음 명령을 실행합니다.

kubectl get pods

인증되지 않음 오류 메시지는 나타나지 않아야 합니다. 출력에서는 기본 네임스페이스에서 실행 중인 모든 포드를 나열해야 합니다. 출력에서 리소스를 찾을 수 없다고 표시되면 실행 중인 포드가 없는 것입니다.


이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요합니까?