while true; do
aws autoscaling describe-auto-scaling-groups \
--query 'AutoScalingGroups[*].AutoScalingGroupName' --output json | jq
echo
kubectl get node -L eks.amazonaws.com/nodegroup
echo
kubectl get node -L eks.amazonaws.com/nodegroup-image | grep ami
echo; date; sleep 1
done
terraform apply -auto-approve # 약 2분 소요
생성된 custom 노드의 레이블을 확인하면 어떤 AMI로 떴는지 확인할 수 있습니다.
kubectl describe node <custom-node-name>
Labels:
eks.amazonaws.com/nodegroup=custom-20250325154855579500000007
eks.amazonaws.com/nodegroup-image=ami-06441265f3c3cef0a ← 직접 지정한 AMI
eks.amazonaws.com/sourceLaunchTemplateId=lt-0db2ddc3fdfb0afb1
eks.amazonaws.com/sourceLaunchTemplateVersion=1
이제 클러스터에는 세 개의 Managed Node Group이 있습니다.
노드그룹
용도
AMI 방식
k8s 버전
initial
범용 워크로드
EKS 관리형 기본 AMI
1.30
blue-mng
Orders 전용 (Stateful)
EKS 관리형, 버전 고정
1.30
custom
비교 실습용
커스텀 AMI 직접 지정
1.30
mng_cluster_version만 바꾸면 어떻게 되는가?
variables.tf에서 mng_cluster_version을 "1.31"로 변경하고 plan을 먼저 확인합니다.
# initial → 업그레이드 대상
~ resource "aws_eks_node_group" "this" {
~ version = "1.30" -> "1.31"
# custom → 변화 없음 (ami_id가 직접 지정되어 있어 version 변수와 무관)
# blue-mng → 변화 없음 (cluster_version = "1.30" 직접 고정)
initial만 plan에 잡힙니다. custom은 AMI ID가 코드에 박혀 있어서 버전 변수가 바뀌어도 아무 반응이 없습니다.
blue-mng은 cluster_version이 직접 고정되어 있어서 마찬가지입니다.
이게 실습에서 커스텀 노드그룹을 만든 이유입니다.
"나는 mng_cluster_version 변수를 바꿨는데 왜 custom 노드그룹은 안 올라가지?" 라는 상황을
plan으로 직접 확인하는 것입니다.
initial + custom 동시 업그레이드
custom까지 함께 올리려면 1.31 AMI ID를 조회해서 ami_id 변수도 같이 바꿔야 합니다.
variable "mng_cluster_version" {
default = "1.31"
}
variable "ami_id" {
default = "ami-00e0cfd6e5895fe3a" # 1.31 AMI ID로 교체
}
모니터링 창을 열어두고 apply합니다. 업그레이드 진행 중 노드 상태 변화를 실시간으로 볼 수 있습니다.
while true; do
kubectl get node -L eks.amazonaws.com/nodegroup-image | grep ami
echo; date; sleep 1
done
업그레이드가 진행되면 다음과 같은 상태 변화가 관찰됩니다.
# Scale Up 단계 : 새 노드 추가
ip-10-0-10-86... Ready v1.31.x ami-00e0cfd6e5895fe3a ← 신규
ip-10-0-13-217... Ready,SchedulingDisabled v1.30.x ami-06441265f3c3cef0a ← 기존 (cordon됨)
# Upgrade 단계 : 기존 노드 drain 후 종료
ip-10-0-2-59... NotReady,SchedulingDisabled v1.30.x ami-06441265f3c3cef0a ← drain 중
# Scale Down 단계 : 기존 노드 모두 종료, 원래 desired 수로 복귀
ip-10-0-10-86... Ready v1.31.x ami-00e0cfd6e5895fe3a
ip-10-0-17-199... Ready v1.31.x ami-00e0cfd6e5895fe3a
SchedulingDisabled는 해당 노드가 cordon된 상태입니다.
새 파드가 스케줄링되지 않도록 막아둔 채로 기존 파드를 drain하는 중입니다
Scale Up → 기존 노드 cordon → drain → 종료 → Scale Down 흐름이 실제 출력에서 그대로 보입니다.
약 20분 후 업그레이드가 완료됩니다.
kubectl get nodes -o wide
NAME STATUS VERSION
ip-10-0-8-17.us-west-2.compute.internal Ready v1.31.14-eks-bbe087e # initial
ip-10-0-22-172.us-west-2.compute.internal Ready v1.31.14-eks-bbe087e # custom
ip-10-0-7-77.us-west-2.compute.internal Ready v1.30.14-eks-bbe087e # blue-mng (의도적으로 유지)
initial과 custom이 1.31로 올라갔고,
blue-mng은 cluster_version = "1.30" 고정 때문에 의도대로 그대로입니다.
Cleanup : custom 노드그룹 삭제
비교 실험 목적이었던 custom 노드그룹을 삭제합니다. base.tf에서 custom 블록을 제거하고 apply합니다.
terraform apply -auto-approve
이후, 다음 섹션에서 Blue/Green으로 처리되는 것을 다음 섹션에서 다뤄보도록 하겠습니다.