쿠버네티스 교육

원격 EKS 접속 환경 설정

Jerry_이정훈 2022. 11. 8. 23:26
728x90

원격 EKS 클러스터에 접속 가능하도록 로컬에 kubectl 환경을 세팅하는 방법을 공유한다.

 

TL;DR

. eks 접속 용 aws credential 정보 등록

. aws 계정에 따라 접속 가능한 eks가 다르다.

. kubectl config 파일(~/.kube/config) eks 정보 등록

. 필요한 경우 원격 eks의 configmap/aws-auth에 aws 계정 정보를 등록한다. 

 

간략하게 그림으로 정리하면 아래와 같다.

 

원격 EKS 접속

 

AWS Credential 정보 등록

eks에 접속하기 위해서는 로컬에 aws 계정 정보가 필요하다. 로컬에 awscli를 설치하여 해당 정보를 등록한다.

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
(...)
반응형