[CloudNeta] EKS 워크샵 스터디 (1) - EKS 배포 - 코드 살펴보기

이번 배포는 운영진 분들께서 작성하신 코드 로 살펴볼 예정입니다. 먼저 코드를 살펴볼까요.

➜ tree .
.
├── 1w                < 이 디렉터리를 살펴볼 예정입니다 >
│   ├── eks.tf
│   ├── var.tf
│   └── vpc.tf
└── eks-private
    ├── ec2.tf
    ├── main.tf
    ├── outputs.tf
    └── versions.tf
테라폼 모듈에 대해

terraform-aws-modules 라는 테라폼 레지스트리를 주로 살펴봅니다.
모듈 사용은 가이드대로 하면 되지만, 가끔 입력값에 의문이 있을 때가 있습니다.
그럴 때는 코드를 보고 작동원리를 보아 해당 변수가 어떻게 삽입되고 쓰이는지 보아야 합니다. (경험상 그게 가장 빨랐습니다)

코드를 살펴봅시다

EKS를 배포하는 로직입니다.

var에는 변수들이 있을 것이고, vpc에는 VPC망 구성을 할 겁니다. eks에는 EKS 클러스터를 배포할 거고요. 필요한 요소를 배포할 것으로 보이네요. 그럼 하나씩 볼까요?

  1. var.tf 파일은 아래와 같습니다:

쿠버네티스 클러스터 설정값과 워커노드에 대한 내용이 주가 됩니다. 그리고 네트워크 설정도 들어가고요.

  1. vpc.tf 파일은 아래와 같습니다:

모듈을 이용해서 public/private 서브넷을 포함하는 VPC를 만듭니다.

VPC 모듈을 살펴보면 필요한 내용이 있으니, 이를 살펴보세요. 메이저 버전이 다를 때는 사용례가 크게 달라지는 경우가 있으니, 문서와 코드를 보시고 전후버전의 차이를 파악하시는 것이 좋습니다.

  1. eks.tf 파일은 아래와 같습니다:

구동해봅시다

먼저 환경변수 설정을 해봅시다. Key pair 정보를 가져와서 이를 사용하고

TF_VAR_ 접두사가 붙은 환경변수는 테라폼 구동 시 최우선순위로 로드합니다. 그래서 앞서 살펴본 코드의 KeyName이나 ssh_access_cidr 변수에 환경변수 값이 자동으로 들어가게 되는 거죠.

# 값을 확인해보고
aws ec2 describe-key-pairs --query "KeyPairs[].KeyName" --output text

# 환경변수에 내 IP와 EC2 Key pair 값을 등록합니다.
export TF_VAR_KeyName=$(aws ec2 describe-key-pairs --query "KeyPairs[].KeyName" --output text)
export TF_VAR_ssh_access_cidr=$(curl -s ipinfo.io/ip)/32

# 잘 나오나 확인해봅니다.
echo $TF_VAR_KeyName $TF_VAR_ssh_access_cidr

그럼 아래 커맨드로 배포합니다. 체감상 15분 전후 소모되었습니다.

terraform init
terraform plan
nohup sh -c "terraform apply -auto-approve" > create.log 2>&1 &
tail -f create.log

배포가 완료되었다면 1w/var.tfClusterBaseName 값인 myeks 를 사용해 EKS 클러스터 접속 정보를 로컬 kubeconfig 에 추가합니다. 즉 myeks 는 클러스터 이름입니다.

이 명령은 로컬 ~/.kube/config 에 해당 클러스터의 API 서버 주소, CA 인증서 정보, context, 그리고 aws eks get-token 을 이용한 IAM 기반 인증 설정을 기록합니다. 즉 어느 클러스터에 어떤 설정으로 접근할지가 내 로컬에 저장되는 셈입니다.

# kubeconfig 갱신
$ aws eks update-kubeconfig --region ap-northeast-2 --name myeks
Added new context arn:aws:eks:ap-northeast-2:240962124292:cluster/myeks to /home/l4in/.kube/config

컨텍스트 이름을 myeks 로 바꿔줍니다. k config use-context <ARN> 처럼 쓰던걸 k config use-context myeks 로 변경했습니다.

# kubeconfig 확인 및 ARN만 추출해서 context 이름 변경
cat ~/.kube/config
cat ~/.kube/config | grep current-context | awk '{print $2}'
kubectl config rename-context $(cat ~/.kube/config | grep current-context | awk '{print $2}') myeks
cat ~/.kube/config | grep current-context