일반적으로 위 로그는 쿠버네티스 환경에서 만날 수 있는 오류이며, 제 경우에는 EKS 클러스터를 생성한 후 kubectl 명령어로 API Endpoint에 요청을 보낼 때 발생했습니다.
(혹시 다른 케이스가 있다면 댓글 부탁드립니다!)
대부분 관련 권한이 없거나 ~/.kube/config 파일이 잘못 구성되었거나 등의 몇 가지 제한된 원인으로 발생하는 이슈로 보여집니다.
아래는 증상별 해결방법을 기재해두었습니다.
증상 1. Connection refused
kubectl 명령어 입력 시 아래 오류가 발생합니다.
The connection to the server localhost:8080 was refused - did you specify the right host or port?
위 증상의 해결방법은 AWS EKS 클러스터 접근을 위한 컨피그 파일을 생성해주어야 합니다.
aws eks --region [클러스터 리전] update-kubeconfig --name [클러스터 이름]
명령어를 입력하면 Updated context ~ 문구와 함께 ~/.kube 경로에 config 파일이 생성돼있는 것을 확인하실 수 있습니다.
EKS 클러스터를 생성하는 경우 클러스터를 생성하는 IAM 보안 주체(role, user 등)에게는 system:masters 권한이 자동으로 부여되기 때문에 컨피그 파일만 생성해주면 API Endpoint에 정상적으로 요청이 가능합니다.
클러스터 생성자 외 다른 사용자, 역할 등이 클러스터에 액세스하려면 추가 조치가 필요하며 아직 조치를 안했다면 아래 증상 2. 를 만나게 됩니다.
증상 2. Unauthorized error
kubectl 명령어 입력 시 아래 오류가 발생합니다.
error: You must be logged in to the server (Unauthorized)
에러 로그에서 볼 수 있듯이 현재 인증되지 않은 상태이기 때문에 클러스터에 접근할 수 없는 상황입니다.
먼저 제가 시도했던 방법을 설명하겠습니다.
1. IAM 역할 할당
우선 Cloud9 인스턴스를 생성한 후 EKS 클러스터에 접근 권한이 없으므로 IAM 역할을 할당해주었습니다.
테스트를 위해 현재 eks-test란 역할은 Admin 권한을 할당해준 상태입니다.
위 방법을 시도해도 동일하게 Unauthorized 오류가 발생합니다.
결국 Admin 권한을 가지고 있더라도 클러스터 생성자가 아니라면 내부 리소스를 확인할 수 없다는 것을 확인할 수 있습니다.
2. aws-auth.yaml 파일 수정
쿠버네티스 클러스터 내부에는 aws-auth라는 configmap이 있습니다.
이는 AWS IAM 사용자 혹은 역할을 kubernetes RBAC에 매핑하기 위한 설정을 정의하는 파일입니다.
클러스터를 생성한 IAM 사용자 혹은 역할에 대한 정보는 최초 aws-auth에 입력되어 액세스가 가능한 것이며 추가 사용자는 해당 configmap에서 정보를 추가해주어야 합니다.
아래 명령어를 통해 aws-auth configmap을 수정할 수 있습니다.
kubectl edit -n kube-system configmap/aws-auth
아래 코드는 aws 공식 docs에서 가져온 값이며 사용자라면 mapUsers를, 역할이라면 mapRoles 부분을 형식에 맞추어 추가해주면 됩니다.
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
mapRoles: |
- groups:
- system:bootstrappers
- system:nodes
rolearn: arn:aws:iam::111122223333:role/my-role
username: system:node:{{EC2PrivateDNSName}}
mapUsers: |
- groups:
- system:masters
userarn: arn:aws:iam::111122223333:user/admin
username: admin
대부분은 configmap까지 수정해주면 해결됩니다.
[부록] credentials 파일 수정
로컬(Windows)에선 컨피그 파일만 생성해주면 kubectl 명령어가 바로 동작했는데, Cloud9에선 해결이 안돼서 로컬과 Cloud9의 파일들을 비교해보았습니다.
그 중 credentials 파일을 수정하여 해결했습니다.
로컬에선 credentials 파일이 아래와 같이 설정돼있습니다.
$ cat credentials
[default]
aws_access_key_id = [액세스 키]
aws_secret_access_key = [시크릿 액세스 키]
Cloud9에서 aws configure 명령어를 실행한 후에 credentials 파일을 확인해보니 aws_session_token 값이 공란으로 입력돼있었습니다.
아래 'aws_session_token = ' 한 줄을 삭제해주니 kubectl 명령어가 정상적으로 동작했습니다.
mzmz01:~/.aws $ cat credentials
[default]
aws_access_key_id = [액세스 키]
aws_secret_access_key = [시크릿 액세스 키]
aws_session_token = # 제거
감사합니다.
'AWS' 카테고리의 다른 글
AWS H01_Lesson02 (0) | 2021.11.12 |
---|---|
AWS H01_Lesson01 (0) | 2021.11.10 |
AWS Fargate (0) | 2021.08.24 |
EC2와 RDS 서비스를 활용한 Wordpress 구축하기 (0) | 2021.08.14 |
RDS_hands-on (0) | 2021.08.14 |