원격 EKS 접속 환경 설정
원격 EKS 클러스터에 접속 가능하도록 로컬에 kubectl 환경을 세팅하는 방법을 공유한다.
TL;DR
. eks 접속 용 aws credential 정보 등록
. aws 계정에 따라 접속 가능한 eks가 다르다.
. kubectl config 파일(~/.kube/config) eks 정보 등록
. 필요한 경우 원격 eks의 configmap/aws-auth에 aws 계정 정보를 등록한다.
간략하게 그림으로 정리하면 아래와 같다.
AWS Credential 정보 등록
eks에 접속하기 위해서는 로컬에 aws 계정 정보가 필요하다. 로컬에 awscli를 설치하여 해당 정보를 등록한다.
최신 버전의 AWS CLI 설치 또는 업데이트 - AWS Command Line Interface
이전 버전에서 업데이트하는 경우 unzip 명령을 실행하면 기존 파일을 덮어쓸지 묻는 메시지가 표시됩니다. 스크립트 자동화와 같은 경우에 이러한 프롬프트를 건너뛰려면 unzip에 대한 -u 업데이
docs.aws.amazon.com
$ (⎈ |kr-stage:robusta) brew install awscli
또는
$ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
$ sudo installer -pkg AWSCLIV2.pkg -target /
$ aws --version
aws-cli/2.8.9 Python/3.9.11 Darwin/21.6.0 exe/x86_64 prompt/off
aws 계정 정보를 aws configure 명령어로 등록한다. 필자는 eks에 admin01, admin02 2가지 계정을 사용한다. 계정에 따라 접속 가능한 eks가 서로 다르다.
$ aws configure --profile admin01
AWS Access Key ID [None]: AKIAxxxx...
AWS Secret Access Key [None]: ...
Default region name [None]: ap-northeast-2
Default output format [None]: json
$ aws configure --profile admin02
AWS Access Key ID [None]: AKIAxxxx...
AWS Secret Access Key [None]: ...
Default region name [None]: ap-northeast-2
Default output format [None]: json
계정 정보 확인
$ aws configure list --profile admin01
Name Value Type Location
---- ----- ---- --------
profile switch-admin manual --profile
access_key ****************.... shared-credentials-file
secret_key ****************.... shared-credentials-file
region ap-northeast-2 config-file ~/.aws/config
$ aws configure list --profile admin02
Name Value Type Location
---- ----- ---- --------
profile saas-admin manual --profile
access_key ****************.... shared-credentials-file
secret_key ****************.... shared-credentials-file
region ap-northeast-2 config-file ~/.aws/config
계정 별 이동을 편하게 하기 위하여 아래 alias를 등록하면 편리하다. bash, zsh 환경에 따라 ~/.bashrc 혹은 ~/.zshrc 에 등록한다.
$ (⎈ |PROD-OREGON:zeroth-ee) cat ~/.zshrc
alias admin01="export AWS_DEFAULT_PROFILE=admin01"
alias admin02="export AWS_DEFAULT_PROFILE=admin02"
# Validation
$ admin01
$ aws s3 ls | grep saas
# saas로 시작하는 버킷 이름 결과가 나온다
$ admin02
$ aws s3 ls | grep switch
# switch로 시작하는 버킷 이름 결과가 나온다
Kubectl Config 정보 등록
원격 eks 접속에 필요한 인증 정보는 kubectl config 파일(~/.kube/config)의 context로 등록한다. context란 문맥이라는 의미로 쿠버네티스 접속 시 사용하는 사용자, 네임스페이스, 클러스터의 정보가 kubectl context에 포함된다.
kubectl 설치
맥 사용자는 brew 사용한다.
$ (⎈ |kr-stage:robusta) brew install kubectl
kubectl 설치 후 로컬의 ~/.kube/config 파일에 eks을 만들면 생성되는 API server endpoint, Certificate authority 정보가 필요하다. API server endpoint, Certificate authority 정보는 eks 생성하면 보여지는 GUI 콘솔에서 확인 가능하다.
VSCode 등을 이용하여 ~/.kube/config 내용을 편집한다. 아래 cluster의 certificate-authority-data, server 에 위 콘솔 화면에서 가져온 API server endpoint, Certificate authority 정보를 등록한다. (보안상 생략)
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: XXXX
server: XXXX
name: eks01 ## 임의 지정 가능
- cluster:
certificate-authority-data: XXXX
server: XXXX
name: eks02
contexts:
- context:
cluster: eks01
namespace: default
user: admin01 ## 임의 지정 가능
name: my-eks01 ## 임의 지정 가능
- context:
cluster: eks02
namespace: default
user: admin02
name: my-eks02
- name: jp-prod
current-context: kr-stage
kind: Config
preferences: {}
users:
- name: admin01 ## 임의 지정 가능
user:
exec:
apiVersion: client.authentication.k8s.io/v1beta1
args:
- --region
- ap-northeast-2
- eks
- get-token
- --cluster-name
- eks01
command: aws
env:
- name: AWS_PROFILE
value: sentroid
interactiveMode: IfAvailable
provideClusterInfo: false
- name: admin02
user:
exec:
apiVersion: client.authentication.k8s.io/v1beta1
args:
- --region
- ap-northeast-2
- eks
- get-token
- --cluster-name
- eks02
command: aws
env:
- name: AWS_PROFILE
value: switch
interactiveMode: IfAvailable
provideClusterInfo: false
. 2개의 eks(eks01, eks02)가 있으며 eks01은 admin01, eks02는 admin02 계정으로 접속 가능하다.
. cluster name, context name, user name은 임의로 지정할 수 있다.
configmap/aws-auth 수정
eks 클러스터를 생성한 계정이 eks에 접속하는 계정과 동일하면 aws-auth ConfigMap 수정없이 접속 가능하다. 하지만 만약 다르면 계정 정보를 eks의 aws-auth에 등록해야 한다. 아래 예시는 필자의 예시다.
# eks01 예시
$ (⎈ |kr-stage:monitoring) kubectl describe -n kube-system configmap/aws-auth
Name: aws-auth
Namespace: kube-system
Labels: <none>
Annotations: <none>
Data
====
mapRoles:
----
- groups:
- system:bootstrappers
- system:nodes
rolearn: arn:aws:iam::XXXX
username: system:node:{{EC2PrivateDNSName}}
- groups:
- system:bootstrappers
- system:nodes
rolearn: arn:aws:iam::XXXX
username: system:node:{{EC2PrivateDNSName}}
mapUsers:
----
- userarn: arn:aws:iam::XXXX
username: sys-admin
groups:
- system:masters
- userarn: arn:aws:iam::XXXX
username: net-admin
groups:
- system:masters
BinaryData
====
Events: <none>
. mapUsers: - userarn, groups 에 원격에서 접속하는 사용자 정보를 입력한다. 그러면 해당 계정에 매핑된 group 권한(예: masters)을 사용해서 원격 eks 접속이 가능하다.
설정이 완료되어 원격 EKS 클러스터를 로컬에서 접속 가능하다.
$ (⎈ |kr-stage:robusta) kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-xxxx.ap-northeast-2.compute.internal Ready <none> 8d v1.23.9-eks-ba74326
ip-xxxx.ap-northeast-2.compute.internal Ready <none> 6d16h v1.23.9-eks-ba74326
(...)