원격 EKS 클러스터에 접속 가능하도록 로컬에 kubectl 환경을 세팅하는 방법을 공유한다.
TL;DR
. eks 접속 용 aws credential 정보 등록
. aws 계정에 따라 접속 가능한 eks가 다르다.
. kubectl config 파일(~/.kube/config) eks 정보 등록
. 필요한 경우 원격 eks의 configmap/aws-auth에 aws 계정 정보를 등록한다.
간략하게 그림으로 정리하면 아래와 같다.
AWS Credential 정보 등록
eks에 접속하기 위해서는 로컬에 aws 계정 정보가 필요하다. 로컬에 awscli를 설치하여 해당 정보를 등록한다.
$ (⎈ |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
(...)
'쿠버네티스 교육' 카테고리의 다른 글
Github Action Self-hosted 세팅 (4) | 2023.04.06 |
---|---|
파일시스템 기반 Loki 설치 (8) | 2023.04.01 |
EKS OJT 교육 실습 목차 (2) | 2022.11.08 |
[동영상] kubespray 설치 및 원격 cluster 등록 (0) | 2021.08.28 |
Kubernetes 실습 과제 리스트 (0) | 2021.08.25 |