이전 불평글(?)로부터 이어지는 글입니다. 아래 포스팅을 읽고 오시면 더 즐겁게 읽으실 수 있습니다.
https://newdeal123.tistory.com/89
안녕하세요. 이번 글은 AWS EKS 환경을 구축하고, 이를 Terraform을 사용해 프로비저닝하고 운영했던 저의 방법을 알려드리려 합니다.
시작하기에 앞서 해당 글은 Kubernetes, AWS의 주요 서비스들의 대한 종합적인 이해와 Terraform에 대한 지식이 꼭 필요하니 참고해주세요.
🔧작업환경
aws-cli v2.7.14, Terraform v1.2.4, kubernetes v1.22.10
MacOS (Apple Silicon)
hands-on
├── eks.tf
├── iam.tf
├── main.tf
├── outputs.tf
├── providers.tf
├── terraform.tfstate
├── terraform.tfstate.backup
├── vars.tf
└── vpc.tf
EKS는 Elastic Kubernetes Service의 약자로, 자체 Kubernetes 제어 플레인을 설치 및 운영할 필요 없이 AWS에서 Kubernetes를 쉽게 사용할 수 있도록 해주는 관리형 서비스입니다. 쉽게 사용할 수 있도록 해주는 건 맞지만, 그렇다고 EKS가 PaaS나 SaaS도 아니기에 EKS의 전체적인 설정과 더불어 AWS의 다양한 서비스를 생성하고 연결해줘야 진정한 인프라 구조를 완성할 수 있습니다.
그래서 다음과 같은 인프라 구조를 설계하고, 이를 Terraform으로 프로비저닝하려고 합니다. 여기서 NLB는 Terraform으로 선언하지 않았습니다. EKS 인프라 구조를 모두 만든 뒤에 Deployment와 Service 등의 Yaml 파일을 kubectl로 구성하는 단계에서 NLB 타입의 Service를 Load Balancer 타입으로 넣어 줄 겁니다. 해당 내용은 다음 포스팅에서 진행할 예정이니 참고해주세요.
기본적인 variable 과 local 변수들은 아래와 같이 설정을 하고 시작하겠습니다.
VPC CIDR은 10.10.0.0/16 으로 선언해두었습니다. 후의 VPC 구성에서 10.10.0.0/24 ~ 10.10.3.0/24로 서브넷을 할당하기 위함입니다. 그리고 리전과 인스턴스 타입, 노드 그룹 등을 var 변수로 구성하고 local 변수를 세팅해 둡니다.
먼저 EKS를 구성하기 전에 VPC 구조를 설계해야 합니다. aws vpc 리소스들을 하나하나 생성해도 좋지만, 실습에서는 aws 공인 VPC 모듈을 사용했습니다. 또 EKS 클러스터를 생성하기 전 VPC 서브넷 요구 사항을 충족시키도록 해야 하는데, Terraform 코드로 확인해봅시다.
각 서브넷에는 최소 16개 이상의 IP가 존재해야 합니다. 지금의 VPC 설계에는 2^8-5개 만큼의 IP를 할당할 수 있으니 충분하죠.
또 EKS VPC 구성에는 서브넷을 퍼블릭, 프라이빗으로 분할하기를 권장하고 있기에 각 2개의 서브넷을 할당해주고, enable_nat_gateway 옵션을 활성화 해주었습니다. 또 enable_dns_hostnames 옵션도 꼭 활성화를 잊지 말아야 합니다.
그 밖의 옵션은 공식 모듈 docs를 확인해 주세요.
EKS 환경을 위한 VPC 구성에서 가장 중요한 점은 tag 할당입니다. 현재 테라폼 코드를 확인하면 VPC 자체에도 태그들을 할당하고 있지만, 퍼블릭 서브넷에도 태그들을 할당한 것을 확인할 수 있습니다.
먼저 EKS 클러스터의 보안 그룹 요구 사항 충족을 위해 "kubernetes.io/cluster/${local.prefix}-cluster" ="owned" 태그를, 외부 로드 밸런서에 태그가 지정된 서브넷만 사용하도록 허용하기 위해 "kubernetes.io/role/elb" = "1" 태그를 할당해 줍니다.
해당 요구 사항을 충족하기 위해서는 모든 퍼블릭 서브넷에 태그를 할당해야 함을 주의해주세요.
그다음은 EKS와 노드 그룹에 할당한 IAM 역할을 생성합니다.
EKS 클러스터 역할에 할당할 내용을 참고해 "eks_iam_role", "eks_node_role" 리소스를 생성했고 IAM 역할에 AWS 관리형 IAM 정책을 연결하기 위해 attachment를 선언했습니다. 어떻게 할당되는지는 아래의 eks.tf 파일을 볼까요?
이제 주인공인 EKS를 생성하는 부분입니다. aws 공인 eks terraform 모듈이 있지만 제가 사용할 때 여러 에러와 이슈가 발생해 사용하진 않았습니다. eks.tf 파일을 확인해볼까요?
eks_cluster 리소스를 생성하기 위해 앞서 선언한 iam role을 할당해주었습니다. AWS 관리형 IAM 정책은 depends_on으로 들어갑니다. 서브넷 배열을 전달하기 위해 concat(배열을 이어주는 놈입니다.)을 사용했고, 태그들을 할당해주는 것은 위와 동일합니다.
다음은 프라이빗 서브넷에 들어갈 노드 그룹을 선언해 줄 차례입니다. 인스턴스 타입과 ami type 등 세부 요소들을 확인해주세요. 노드 그룹은 오토 스케일링 그룹으로 작동되게 되는데, 이를 위해 min_size ~ max_size, desired_size를 선언해 오토 스케일링 그룹을 세팅해주세요.
주요 구성은 완료되었습니다. 다음은 output 변수를 통해 결과에 대한 값들을 받아왔습니다. 저는 terraform output -json 명령을 통해 output 변수들을 json 화 시켜 프로젝트에 활용했습니다.
이제 모든 구성이 끝났습니다! 이제 terraform을 적용시키면 성공적으로 EKS 환경이 세팅됩니다.
terraform init
terraform plan
terraform apply -auto-approve
지금까지 했던 과정들은 EKS를 생성하긴 했으나 빈껍데기에 불과합니다. 이제 디플로이먼트를 적용시키고 서비스들을 외부로 노출시키는 방법에 대해 알아볼 차례입니다. 다음 포스팅에서 계속됩니다!
'🏋️♀️ DevOps, SRE' 카테고리의 다른 글
신입 데브옵스 (DevOps) 엔지니어 되기 - (1) (25) | 2023.02.06 |
---|---|
[k8s] Kubernetes CronJob 뜯어보기 - 구현 원리, best practices (4) | 2022.11.15 |
주니어 DevOps 엔지니어가 바라 본 CPU 아키텍처 (docker pull이 안 된다!) (0) | 2022.10.21 |
[DevOps] 내부 개발자 플랫폼 (IDP) : 조직이 더 효율적으로 일하는 방법 (0) | 2022.07.22 |
[AWS][Terraform] 테라포밍: AWS 인프라를 테라폼으로 exporting (0) | 2021.10.13 |