본문 바로가기
Orchestration/Kubernetes

AWS EKS 노드그룹 자동 시작, 중지하기

by wlsdn3004 2023. 10. 17.
728x90
반응형

 

사내 AWS EKS 테스트 환경을 구성한 후 사용 중인 리소스로 인해 발생하는 비용을 효율적으로 관리하기 위해서는 퇴근 시간 등 비활성 기간에 해당 환경을 사용 중지 처리하는 것이 중요하다. 그러나 이러한 작업을 매일 수동으로 조작하기에는 번거롭고 종종 잊어버리는 경우가 발생한다.

본 글에서는 이 문제를 해결하고 이러한 프로세스를 자동화하기 위해 자동 시작 및 중지 스케줄링을 설정하기 위한 방법을 기술한다.

 

 

 

방법 1 : AWS CLI + Linux Crontab 사용


  • 전제 조건
    • AWS CLI + Crontab 명령을 실행할 Bastion(Linux) 서버 필요

환경에 맞는 최신 AWS CLI를 Bastion 서버에 다운로드 한다.

$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
$ sudo ./aws/install --bin-dir /usr/local/bin --install-dir /usr/local/aws-cli --update

 

설치가 정상적으로 되었는지 확인한다.

$ aws --version
aws-cli/2.13.25 Python/3.11.5 Linux/5.10.130-118.517.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off

 

Crontab에 매일 09:30에 scale-out, 18:30에 scalie-in 명령이 실행되게 설정한다.

  • 본 글에서는 출근 후 용량은 min:1/max:3/desired:2 퇴근 후 용량은 min:0/max:3/desired:0 으로 설정하였다.
$ crontab -e
30 00 * * 1-5 aws eks update-nodegroup-config --cluster-name {eks-cluster-name} --nodegroup-name {eks-nodegroup-name} --scaling-config minSize=1,maxSize=3,desiredSize=2
30 09 * * 1-5 aws eks update-nodegroup-config --cluster-name {eks-cluster-name} --nodegroup-name {eks-nodegroup-name} --scaling-config minSize=0,maxSize=3,desiredSize=0
:wq

 

설정이 잘 되었는지 확인한다.

$ crontab -l
30 00 * * 1-5 /usr/local/bin/aws eks update-nodegroup-config --cluster-name {eks-cluster-name} --nodegroup-name {nodegroup-name} --scaling-config minSize=1,maxSize=3,desiredSize=2
30 09 * * 1-5 aws eks update-nodegroup-config --cluster-name {eks-cluster-name} --nodegroup-name {nodegroup-name} --scaling-config minSize=0,maxSize=3,desiredSize=0

 

해당 시간에 명령이 잘 실행되었는지 확인한다.

$ cat /var/log/cron
## start (scale-out)
Oct 17 00:30:02 ip-192-168-10-142 CROND[12770]: (root) CMD (/usr/local/bin/aws eks update-nodegroup-config --cluster-name {eks-cluster-name} --nodegroup-name {nodegroup-name} --scaling-config minSize=1,maxSize=3,desiredSize=2)

## stop (scale-in)
Oct 17 09:30:02 ip-192-168-10-142 CROND[12772]: (root) CMD (/usr/local/bin/aws eks update-nodegroup-config --cluster-name {eks-cluster-name} --nodegroup-name {nodegroup-name} --scaling-config minSize=0,maxSize=3,desiredSize=0)

 

실제로 잘 적용 되었는지 AWS console 화면에서 확인한다.

  • EC2 → Auto Scaling 그룹 → {Auto Scaling 그룹 name} → 세부 정보
  • EC2 → Auto Scaling 그룹 → {Auto Scaling 그룹 name} → 활동

 

 

방법 2 : Terraform + Linux Crontab 사용


  • 전제 조건
    • Terraform 으로 AWS EKS 구성
    • Terraform cli + Crontab 명령을 실행할 Bastion(Linux) 서버 필요

Terraform 코드에 aws_eks_node_group 리소스의 scalilng_config 값을 변수처리 한다.

## variable
variable "size" {
  description = "Node group size configuration"
  type = object({
    desired = number
    max = number
    min = number
  })
  default = {
    desired = 2
    max = 3
    min = 1
  }
}

## aws_eks_node_group
resource "aws_eks_node_group" "node" {
...
  scaling_config {
    desired_size = var.size.desired
    max_size     = var.size.max
    min_size     = var.size.min
  }
...

 

Crontab에 매일 09:30에 scale-out, 18:30에 scale-in 명령이 실행되게 설정한다.

$ crontab -e
30 00 * * 1-5 cd /root/iac-test/eks && /usr/local/sbin/terraform apply --auto-approve -var="size={desired=0,max=3,min=0}"
30 09 * * 1-5 /root/iac-test/eks && /usr/local/sbin/terraform apply --auto-approve

 

설정이 잘 되었는지 확인한다.

$ crontab -l
30 00 * * 1-5 cd /root/iac-test/eks && /usr/local/sbin/terraform apply --auto-approve -var="size={desired=0,max=3,min=0}"
30 09 * * 1-5 cd /root/iac-test/eks && /usr/local/sbin/terraform apply --auto-approve

 

해당 시간에 명령이 잘 실행되었는지 확인한다.

$ cat /var/log/cron
## start (scale-out)
Oct 17 00:30:01 ip-192-168-10-142 CROND[30070]: (root) CMD (cd {terraform 파일 워크스페이스 위치} && /usr/local/sbin/terraform apply --auto-approve)

## stop (scale-in)
Oct 17 09:30:01 ip-192-168-10-142 CROND[30072]: (root) CMD (cd {terraform 파일 워크스페이스 위치} && /usr/local/sbin/terraform apply --auto-approve -var="size={desired=0,max=3,min=0}")

$ cat /var/spool/mail/root
...
  # aws_eks_node_group.node will be updated in-place
  ~ resource "aws_eks_node_group" "node" {

      ~ scaling_config {
          ~ desired_size = 0 -> 2
          ~ max_size     = 3 -> 3
          ~ min_size     = 0 -> 1
        }

        # (2 unchanged blocks hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.

 

 

방법 3 : Auto Scaling 그룹 작업 예약


AWS Console 화면에서 아래 경로로 접근한다.

  • EC2 → Auto Scaling 그룹 → {Auto Scaling 그룹 name} → Auto Scaling → 예약된 작업 생성

 

자동 시작 중지 될 작업을 생성 후 아래와 같이 작성한다.

auto start
auto stop

  • 월~금 마다 실행하고 싶으면 반복에 Cron 선택하고, "30 18 * * 1-5 또는 30 18 * * MON-FRI" 로 설정하면 된다.

 

등록이 잘 되었는지 확인한다.

 

 

반응형

댓글