[DevOps] Frontend 개발자의 우당탕탕 반려 K8S(Kubernetes) cluster 구축기 - 1. Vultr VKE(Vultr Kubernetes Engine)로 클러스터 생성하기 (with Terraform)
서론
이 포스팅 시리즈는 Frontend 개발이 주력인 필자가 반려 k8s 클러스터를 구축해가는 과정을 담았다.
이번 포스팅에선 Terraform에 Vultr provider를 연동하고, Terraform을 통해 VKE(Vultr Kubernetes Engine) k8s 클러스터를 생성하는 과정을 소개하려 한다.
Terraform과 Vultr
Terraform은 IaC(Infrastructure as Code) 도구로, 코드로 개발관련 인프라들을 관리한다는 개념의 도구이다. Terraform은 HCL(Hachicorp Configuration Language)를 사용하여 클라우드 리소스를 코드로써 선언할 수 있고, 이를 이용해 여러 클라우드 프로바이더(AWS, GCP, Azure)에 선언된 인프라들을 배포/관리할 수 있다.
Vultr는 AWS, GCP 등과 같은 클라우드 프로바이더이다. 필자는 K8S 클러스터를 구성하기 위해 Vultr를 선택하게 되었는데, 가장 큰 이유는 저렴한 가격이었다.
다른 프로바이더들은 K8S 클러스터의 마스터노드를 유료로 이용해야하지만, Vultr의 VKE를 이용하면 관리형 K8S 마스터노드를 무료로 이용할 수 있었다. 또한 Vultr도 Terraform을 공식적으로 지원하기 때문에, 손쉽게 Terraform으로 인프라를 관리할 수 있었다.
준비사항
vultr에 k8s 클러스터를 만들기 위해선 여러 도구가 필요하다. 아래 도구들을 미리 설치하도록 하자. 링크를 참고하여 현재 개발 환경에 맞춰 설치를 진행한다.
- kubectl: https://kubernetes.io/docs/tasks/tools/#kubectl
- helm: https://helm.sh/ko/docs/intro/install/
- lens: https://k8slens.dev/
- terraform: https://developer.hashicorp.com/terraform/install
Vultr 가입하기 (+ 무료 크래딧 받는 방법)
Vultr는 프로모션 코드를 통해 신규가입할 경우 무료 크래딧을 제공한다.
https://www.vultr.com/coupons/
위 링크의 페이지를 접속해보면, 현재 신규가입 시 받을 수 있는 프로모션 코드들이 있다. 이 중에 가장 많은 크레딧을 받을 수 있는 프로모션 코드로 신규가입을 진행하면 된다.
View details를 클릭하면 프로모션 페이지와 함께 신규가입 폼이 나타난다. 거기에 가입 정보를 기입한 후 대시보드에서 결제 수단을 등록하면 무료 크래딧을 받을 수 있다. 받은 무료 크래딧은 Billing 페이지에서 확인할 수 있다.
Vultr API 키 발급
Terraform을 이용하여 Vultr 리소스를 관리하기 위해선 API 키 발급이 필요하다. Vultr 대시보드의 Account > OTHER > API 메뉴에서 API 키를 발급 받을 수 있다.
Vultr VKE 클러스터 생성하기 (with Terraform)
이제 발급 받은 Vultr API 키를 사용하여 Terraform을 통해 VKE 클러스터를 생성할 것이다. 이제부터 Terraform을 이용해 본격적으로HCL 파일들을 작성할 것이기 때문에, 이를 관리할 수 있는 Git 레포지토리를 생성하는걸 추천한다.
Vultr는 Terrafrom의 공식적인 프로바이더를 제공하는데, 해당 프로바이더가 제공하는 리소스와 데이터 소스의 스팩은 아래 문서를 참고 바란다.
https://registry.terraform.io/providers/vultr/vultr/latest/docs
Terraform 코드 작성하기
우선 필자가 클러스터를 생성하기 위해 작성했던 HCL 파일들을 공유한다. 아래 필자의 레포지토리를 참고하길 바란다.
https://github.com/skymins04/betaman-devops-infra/tree/main/terraform/vke
기본적으로 HCL 파일은 .tf 확장자로 작성된다. 파일을 여러개로 분리하는건 필수사항은 아니지만, 가급적 목적에 따라 분리하는걸 추천한다.
variables.tf는 Terraform 코드 내에서 사용할 변수를 정의한 파일이다. 주요 파라미터들을 변수로 만들어두면, 코드는 재활용하면서 필요한 값만 수정하여 사용할 수 있기 때문에 편리하다. 또한 민감한 정보(ex: api 키) 등은 변수로 분리하여 코드에 민감한 정보가 직접 노출되지 않도록 하는 것이 중요하다.
terraform.tfvars 파일에선 정의된 변수에 미리 값을 넣어둘 수 있다. 미리 작성해도 괜찮은 민감하지 않은 정보만 넣도록 하자. 민감한 변수 값은 shell 환경변수를 통해 주입해줄 수 있는데, "TF_VAR_{변수명}" 형식의 shell 변수를 통해 Terraform 변수에 값을 넣어줄 수 있다.
providers.tf는 Terraform에서 이용할 프로바이더들을 정의한 파일이다. VKE 클러스터를 만들기 위해선 vultr 프로바이더를 이용해야하고, 여기서 vultr 프로바이더에 대한 설정을 작성했다.
12번째 줄의 api_key 정의를 보면 var.vultr_api_key를 대입하는것을 볼 수 있다. "var.xxxx"는 정의된 변수를 이용하는 것 의미하는데, var.vultr_api_key라는 변수는 variables.tf라는 파일에서 정의하고 있다. 하지만 terraform.tfvars를 보면 vultr_api_key라는 항목이 없는데, 이는 민감한 정보이기 때문에 코드상에 값을 작성하지 않았기 때문이다. 그래서 이 Terraform 코드를 실행하기 위해선 TF_VAR_vultr_api_key라는 shell 환경변수를 미리 설정해주어야 한다. 해당 환경변수는 이전 챕터에서 발급 받은 Vultr API 키를 넣어주면 된다.
main.tf는 실제 vultr의 VKE 리소스를 정의하는 파일이다. 각 속성 별로 알맞은 변수를 선언하여 대입해주고 있고, 관련 변수들은 위에서 설명한 variables.tf에서 정의 중이다.
vultr에서 공식적으로 제공하는 vultr_kubernetes라는 terraform 리소스를 사용하여 VKE 클러스터를 정의한다. 각 속성별 역할은 아래를 참고하길 바란다.
vultr_kubernetes.region | VKE 클러스터가 배포될 지역 |
vultr_kubernetes.label | VKE 클러스터 라벨 |
vultr_kubernetes.version | VKE kubernetes 버전 |
vultr_kubernetes.node_pools.node_quantity | VKE 클러스터 내 노드 개수 |
vultr_kubernetes.node_pools.plan | VKE 클러스터 노드의 종류. Vultr가 제공하는 옵션 내에서 노드 당 타입, CPU, 메모리를 지정할 수 있다. |
vultr_kubernetes.node_pools.label | VKE 클러스터 노드 라벨 |
vultr_kubernetes.node_pools.auto_scaler | VKE 클러스터의 오토 스케일링 사용 여부 |
vultr_kubernetes.node_pools.min_nodes | VKE 클러스터 오토 스케일링 내 노드 최소 개수 |
vultr_kubernetes.node_pools.max_nodes | VKE 클러스터 오토 스케일링 내 노드 최대 개수 |
terraform을 통해 VKE 클러스터를 생성하고 이를 접근하기 위해 kube_config 파일을 획득해야 한다. 이를 위해 kubeconfig.tf는 kube_config 파일을 생성하도록 작성된 파일이다. vultr_kubernetes.{resource_name}.kube_config에 base64로 인코딩된 kube_config 파일 내용이 들어있는데, 이를 디코딩하여 ~/.kube/ 경로 아래에 저장하도록 작성했다.
Terraform 코드 실행하기 (plan, apply)
terraform 코드는 두가지 단계에 나눠 실행하게 된다. plan 명령어를 통해 현재 작성된 terraform 코드에 문제가 없는지 점검한 후, apply 명령어를 통해 실제 인프라를 생성하게 된다.
.tf 파일들이 있는 폴더 위치에서 아래 명령어를 실행해 plan을 수행할 수 있다.
$ terraform plan
마찬가지로 아래 명령어를 통해 apply를 수행할 수 있는데, 필자의 terraform 코드는 vultr_api_key 변수 값을 주입해주어야 한다. 그래서 inline으로 TF_VAR_vultr_api_key shell 환경변수에 값을 대입해주었다.
$ TF_VAR_vultr_api_kry=이것은API키문자열 terraform apply
apply를 통해 VKE 클러스터를 생성하면 kubeconfig.tf에 작성한 코드로 인해, ~/.kube 경로에 kube_config 파일이 생성되었을 것이다. 아직 별도의 kube_config 파일이 없다면, 이 파일의 이름을 kube_config로 변경하여 사용하는걸 추천한다.
Lens로 클러스터 연결하기
생성된 kube_config 파일을 lens에 등록하면, GUI로 클러스터의 현황을 확인하고 관리할 수 있다. Catalog 화면 우측 하단에 있는 "+" 버튼을 클릭하면 파일탐색기가 나타나고, 아까 생성된 kube_config 파일을 선택하면 자동으로 클러스터가 lens에 등록된다.
처음 클러스터를 연결하여 접속하면 노드의 리스트말곤 별도로 뜨는 정보가 없을 것이다. 이는 아직 클러스터의 여러 정보를 수집하는 서버가 설치되지 않아서인데, 이는 다음 포스팅에서 다루도록 하겠다.