Amazon EKS API 서버에 연결할 때 발생하는 “You must be logged in to the server(Unauthorized)” 오류를 해결하려면 어떻게 해야 하나요?
kubectl 명령을 사용하여 Amazon Elastic Kubernetes Service(Amazon EKS) API 서버에 연결합니다. "error: You must be logged in to the server (Unauthorized)"라는 오류 메시지를 받았습니다.
간략한 설명
이 오류는 kubectl에 구성된 AWS Identity and Access Management(IAM) 엔터티가 Amazon EKS에 의해 인증되지 않은 경우 발생합니다. 사용하는 IAM 엔터티(사용자 또는 역할)에 따라 인증되고 Amazon EKS 클러스터에 액세스할 수 있는 권한이 부여됩니다. 이 오류는 일반적으로 다음 구성 중 하나로 인해 발생합니다.
- IAM 사용자 또는 역할을 사용하도록 kubectl 도구를 구성했습니다.
- IAM 엔터티를 aws-auth ConfigMap에 매핑했습니다.
이 문제를 해결하려면 사용 사례에 따라 다음 섹션 중 하나의 단계를 완료해야 합니다.
- 사용자가 클러스터 생성자인 경우
- 사용자가 클러스터 생성자가 아닌 경우
- 액세스 항목 사용
해결 방법
참고: AWS Command Line Interface(AWS CLI) 명령 실행 시 오류가 발생하는 경우, AWS CLI 오류 문제 해결을 참고하세요. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하세요.
사용자가 클러스터 생성자인 경우
IAM 엔터티가 Amazon EKS 클러스터를 만드는 데 사용된 경우 클러스터 생성자가 됩니다. 클러스터 생성자로서 오류를 해결하려면 다음 단계를 완료하세요.
-
Amazon CloudWatch Log Insights에서 Amazon EKS 클러스터의 로그 그룹을 선택합니다. /aws/eks/my-cluster/cluster를 예로 들 수 있습니다. 그런 다음, 다음 쿼리를 실행합니다.
fields @logstream, @timestamp, @message| sort @timestamp desc | filter @logStream like /authenticator/ | filter @message like "username=kubernetes-admin" | limit 50
참고: Amazon EKS 인증자 로그를 활성화합니다.
이 쿼리는 클러스터 생성자로 매핑된 IAM 엔터티를 반환합니다.@messagetime="2022-05-26T18:55:30Z" level=info msg="access granted" arn="arn:aws:iam::123456789000:user/testuser" client="127.0.0.1:57586" groups="[system:masters]" method=POST path=/authenticate uid="aws-iam-authenticator:123456789000:AROAFFXXXXXXXXXX" username=kubernetes-admin
-
AWS CLI의 클러스터 생성자 IAM 엔터티를 검토합니다. 쉘 환경에서 IAM 엔터티가 AWS CLI에 대해 구성되었는지 확인하려면 다음 명령을 실행합니다.
$ aws sts get-caller-identity
특정 프로필을 사용하여 이 명령을 실행할 수도 있습니다.
$ aws sts get-caller-identity --profile MY-PROFILE
출력은 AWS CLI에 대해 구성된 IAM 엔터티의 Amazon 리소스 이름(ARN)을 반환합니다.
예시:{ "UserId": "XXXXXXXXXXXXXXXXXXXXX", "Account": "XXXXXXXXXXXX", "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testuser" }
반환된 IAM 엔터티가 클러스터 생성자 IAM 엔터티와 일치하는지 확인합니다. 반환된 IAM 엔터티가 클러스터 생성자가 아닌 경우, 클러스터 생성자 IAM 엔터티를 사용하도록 AWS CLI 구성을 업데이트합니다.
-
다음 명령을 실행하여 kubeconfig 파일을 업데이트하거나 생성합니다.
$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region
참고: eks-cluster-name을 클러스터 이름으로 바꿉니다. aws-region을 AWS 리전의 이름으로 바꿉니다.
kubeconfig 파일에 대한 AWS CLI 프로필을 지정하려면 다음 명령을 실행합니다.$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region --profile my-profile
참고: eks-cluster-name을 클러스터 이름으로 바꿉니다. aws-region을 리전 이름으로 바꿉니다. my-profile을 프로필 이름으로 바꿉니다.
-
kubeconfig 파일이 업데이트되었는지 확인하려면 다음 명령을 실행합니다.
$ kubectl config view --minify
-
IAM 엔터티가 인증되고 EKS 클러스터에 액세스할 수 있는지 확인하려면 다음 명령을 실행합니다.
$ kubectl get svc
출력 예시:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 77d
사용자가 클러스터 생성자가 아닌 경우
IAM 엔터티가 클러스터를 만드는 데 사용되지 않았다면 해당 사용자는 클러스터 생성자가 아닙니다. 이 경우 클러스터에 대한 액세스를 허용하도록 IAM 엔터티를 aws-auth ConfigMap에 매핑하려면 다음 단계를 완료합니다.
-
AWS CLI의 클러스터 생성자 IAM 엔터티를 검토합니다. 쉘 환경에서 AWS CLI에 대해 구성된 IAM 엔터티를 확인하려면 다음 명령을 실행합니다.
$ aws sts get-caller-identity
특정 프로필을 사용하여 이 명령을 실행할 수도 있습니다.
$ aws sts get-caller-identity --profile my-profile
출력은 AWS CLI에 대해 구성된 IAM 엔터티의 ARN을 반환합니다.
예시:{ "UserId": "XXXXXXXXXXXXXXXXXXXXX", "Account": "XXXXXXXXXXXX", "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testuser" }
반환된 IAM 엔터티가 클러스터 생성자 IAM 엔터티와 일치하는지 확인합니다. 반환된 IAM 엔터티가 클러스터 생성자가 아닌 경우, 클러스터 생성자 IAM 엔터티를 사용하도록 AWS CLI 구성을 업데이트합니다. 그런 다음 kubectl을 사용하여 클러스터에 다시 액세스합니다. 문제가 계속되면 다음 단계로 진행하세요.
-
반환된 IAM 엔터티가 클러스터 생성자가 아닌 경우 엔터티를 aws-auth ConfigMap에 추가하여 엔터티가 클러스터에 액세스할 수 있도록 허용합니다. 클러스터 관리자만 aws-auth ConfigMap을 수정할 수 있으므로 다음 작업 중 하나를 완료하세요.
클러스터 생성자 IAM 엔터티를 사용하여 클러스터에 액세스하려면 클러스터 생성자 섹션의 단계를 완료하세요.
또는 클러스터 관리자에게 이 작업을 수행하도록 요청합니다. -
다음 명령을 실행하여 IAM 엔터티가 aws-auth ConfigMap에 있는지 확인합니다.
eksctl get iamidentitymapping --cluster cluster-name
-또는-
kubectl describe configmap aws-auth -n kube-system
IAM 엔터티가 aws-auth ConfigMap에 있는 경우 다음 단계를 계속합니다. IAM 엔터티가 aws-auth ConfigMap에 없는 경우 다음 명령을 실행하여 IAM 엔터티를 자동으로 매핑합니다.
eksctl create iamidentitymapping \ --cluster $CLUSTER-NAME \ --region $REGION \ --arn arn:aws:iam::XXXXXXXXXXXX:user/testuser \ --group system:masters \ --no-duplicate-arns \ --username admin-user1
또는 aws-auth ConfigMap을 편집하여 IAM 엔터티를 수동으로 매핑할 수도 있습니다.
$ kubectl edit configmap aws-auth -namespace kube-system
aws-auth ConfigMap에 IAM 엔터티를 추가하려면 mapUsers에 IAM 사용자 또는 역할 ARN을 추가합니다.
IAM 사용자 예시:mapUsers: | - userarn: arn:aws:iam::XXXXXXXXXXXX:user/testuser username: testuser groups: - system:masters
IAM 역할 예시:
mapRoles: | - rolearn: arn:aws:iam::XXXXXXXXXXXX:role/testrole username: testrole groups: - system:masters
중요:
IAM 역할은 경로 없이 매핑해야 합니다. rolearn 경로 요구 사항에 대한 자세한 내용은 aws-auth ConfigMap이 클러스터에 대한 액세스 권한을 부여하지 않음 섹션을 참조하세요.
AWS IAM Identity Center IAM 역할에 대해 rolearn을 지정하려면 역할 ARN에서 "/aws-reserved/sso.amazonaws.com/REGION" 경로를 제거합니다. 그렇지 않으면 ConfigMap의 항목이 사용자를 유효한 사용자로 권한 부여할 수 없습니다.
system:masters 그룹은 슈퍼 사용자 액세스를 통해 어느 리소스에나 원하는 작업을 수행하도록 허용합니다. 자세한 내용은 Kubernetes 웹사이트의 기본 역할 및 역할 바인딩을 참조하세요. 이 사용자에 대한 액세스를 제한하려면 Amazon EKS 역할 및 역할 바인딩 리소스를 생성합니다. 자세한 내용은 필수 권한을 참조하세요. -
다음 명령을 사용하여 kubeconfig 파일을 업데이트하거나 생성합니다. AWS CLI가 IAM 엔터티로 구성되어 있는지 확인합니다.
$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region
참고: eks-cluster-name을 클러스터 이름으로 바꿉니다. aws-region을 리전 이름으로 바꿉니다.
특정 프로필을 사용하여 이 명령을 실행할 수도 있습니다.$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region --profile my-profile
참고: eks-cluster-name을 클러스터 이름으로 바꿉니다. aws-region을 리전 이름으로 바꿉니다. my-profile을 프로필 이름으로 바꿉니다.
-
kubeconfig 파일이 업데이트되었는지 확인하려면 다음 명령을 실행합니다.
$ kubectl config view --minify
-
IAM 사용자 또는 역할이 인증되었는지 확인하려면 클러스터에 다시 액세스하세요. 예를 들어, 다음 명령을 실행하여 오류가 해결되었는지 확인할 수 있습니다.
$ kubectl get svc
출력 예시:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 77d
액세스 항목을 사용하여 클러스터에 다시 액세스
CreateAccessEntry API를 사용하여 Amazon EKS 클러스터에 대한 액세스를 제공하거나 복원할 수 있습니다. 자세한 내용은 Amazon EKS 액세스 항목 API를 사용하여 EKS 클러스터에 대한 액세스를 복구하려면 어떻게 해야 하나요?를 참조하세요.
문제 해결
kubectl 명령을 실행하면 Amazon EKS 클러스터 API 서버로 요청이 전송됩니다. 그러면 Amazon EKS 인증자가 이 요청을 인증하려고 시도합니다. Amazon EKS 인증자가 요청을 인증할 수 없는 경우 CloudWatch에서 EKS 인증자 로그를 확인합니다. 다음 문제 해결 팁을 사용하여 문제를 확인하세요.
EKS 인증자 로그에 액세스
- Amazon EKS 클러스터에 대한 로깅을 활성화합니다.
- CloudWatch Log Insights를 엽니다.
- 클러스터에 대한 로그 그룹을 선택합니다. 예시: "/aws/eks/example-cluster/cluster".
- 다음 쿼리를 실행하세요.
오류가 발생했을 때와 동일한 시간 간격의 로그 행을 식별하려면 kubectl 명령을 실행합니다.fields @timestamp, @message| filter @logStream like /authenticator/ | sort @timestamp desc | limit 1000
EKS 인증자 로그 검토
오류의 원인에 따라 다음 작업을 완료하세요.
-
kubectl에 잘못된 IAM 엔터티를 사용하여 문제가 발생한 경우, kubectl kubeconfig 및 AWS CLI 구성을 검토합니다. 올바른 IAM 엔터티를 사용했는지 확인합니다. 다음 출력 예시에서는 kubectl이 사용한 IAM 엔터티를 검증할 수 없습니다. kubectl이 사용하는 IAM 엔터티를 검토하고 해당 엔터티가 IAM에 존재하며 엔터티의 프로그래밍 방식 액세스가 켜져 있는지 확인합니다.
출력 예시:time="2022-12-26T20:46:48Z" level=warning msg="access denied" client="127.0.0.1:43440" error="sts getCallerIdentity failed: error from AWS (expected 200, got 403). Body: {\"Error\":{\"Code\":\"InvalidClientTokenId\",\"Message\":\"The security token included in the request is invalid.\",\"Type\":\"Sender\"},\"RequestId\":\"a9068247-f1ab-47ef-b1b1-cda46a27be0e\"}" method=POST path=/authenticate
-
IAM 엔터티가 aws-auth ConfigMap에 매핑되지 않았거나 잘못 매핑되어 문제가 발생한 경우 aws-auth ConfigMap을 검토합니다. IAM 엔터티가 올바르게 매핑되었으며, 클러스터 생성자가 아닌 경우 섹션에 나와 있는 요구 사항을 충족하는지 확인합니다. 잘못 매핑되거나 누락된 IAM 엔터티의 경우 EKS 인증자 로그는 다음 출력 예시와 유사합니다.
time="2022-12-28T15:37:19Z" level=warning msg="access denied" arn="arn:aws:iam::XXXXXXXXXX:role/admin-test-role" client="127.0.0.1:33384" error="ARN is not mapped" method=POST path=/authenticate
-
aws-auth ConfigMap이 업데이트되어 클러스터에 대한 액세스 권한을 잃은 경우, 클러스터 생성자의 IAM 엔터티를 사용하여 클러스터에 액세스할 수 있습니다. 클러스터 생성자를 aws-auth ConfigMap에 매핑할 필요가 없으므로 이 IAM 엔터티를 사용하여 클러스터에 액세스하세요.
-
클러스터 생성자 IAM 엔터티가 삭제된 경우 동일한 명명 규칙으로 동일한 IAM 엔터티를 다시 생성합니다. 그러면 다시 생성된 이 클러스터 생성자 IAM 엔터티는 IAM 엔터티와 동일한 ARN을 가질 수 있습니다. 그런 다음 클러스터 생성자 섹션의 단계를 완료하고 IAM 엔터티를 사용하여 클러스터에 액세스합니다.
-
클러스터 생성자가 제거된 SSO 사용자에 대해 생성된 IAM 역할인 경우 이 IAM 역할을 다시 생성할 수 없습니다. 이 경우 AWS Support에 도움을 요청하세요.
관련 정보
Amazon EKS에서 클러스터를 생성한 후 다른 IAM 사용자 및 역할에 대한 액세스를 제공하려면 어떻게 해야 하나요?
Kubernetes 웹사이트의 RBAC 권한 부여 사용하기
EKS 액세스 항목을 사용하여 IAM 사용자에게 Kubernetes 액세스 권한 부여
eksctl 웹사이트의 EKS 액세스 항목
관련 콘텐츠
- 질문됨 3달 전lg...
- AWS 공식업데이트됨 8달 전
- AWS 공식업데이트됨 2년 전
- AWS 공식업데이트됨 2년 전