Kubernetes/Kubernetes Advanced

📌 [ReplicaSet 심화편 #6] ReplicaSet과 Cluster Autoscaler: 노드 자동 확장과 리소스 최적화

ygtoken 2025. 3. 12. 12:37
728x90

 

1️⃣ 개요

 

쿠버네티스에서 ReplicaSet은 Pod의 개수를 일정하게 유지하지만, 클러스터의 리소스가 부족하면 새로운 Pod를 실행할 수 없는 문제가 발생할 수 있습니다.

예를 들어, ReplicaSet이 5개의 Pod를 실행하려 해도 노드의 CPU나 메모리가 부족하면 일부 Pod가 Pending 상태로 멈추게 됩니다.

 

이 문제를 해결하기 위해 Cluster Autoscaler를 활용하면 자동으로 노드를 확장하여 Pod가 정상적으로 실행될 수 있도록 조정할 수 있습니다.

이번 글에서는 ReplicaSet과 Cluster Autoscaler를 활용하여 리소스를 최적화하는 방법을 설명하겠습니다.

 


2️⃣ Cluster Autoscaler란?

 

✅ Cluster Autoscaler의 역할

 

Cluster Autoscaler는 클러스터의 리소스 부족을 감지하여 자동으로 노드를 추가하거나 제거하는 역할을 합니다.

 

📌 Cluster Autoscaler의 주요 기능

기능 설명
자동 확장 (Scale Up) 실행할 수 없는 Pending 상태의 Pod가 있으면 노드를 추가
자동 축소 (Scale Down) 일정 시간 동안 사용되지 않은 노드를 제거하여 리소스 최적화
ReplicaSet과 연동 ReplicaSet이 요청한 Pod 개수를 충족할 수 있도록 노드를 조정

Cluster Autoscaler는 클라우드 환경(AWS, GCP, Azure 등)에서 동작하며, 온프레미스 환경에서는 수동 확장이 필요할 수도 있습니다.

 


3️⃣ Cluster Autoscaler 동작 원리

 

✅ 1. Scale Up (자동 확장)

 

1️⃣ ReplicaSet이 새로운 Pod를 생성하려고 하지만, 실행할 수 있는 노드가 부족함

2️⃣ kubectl get pod 실행 시 일부 Pod가 Pending 상태로 멈춤

3️⃣ Cluster Autoscaler가 감지하여 새로운 노드를 자동 추가

4️⃣ 새로운 노드가 추가되면 Pending 상태였던 Pod가 정상적으로 실행됨

 

📌 Pod이 Pending 상태인지 확인하는 명령어

kubectl get pods --field-selector=status.phase=Pending

 

 


✅ 2. Scale Down (자동 축소)

 

1️⃣ 특정 노드에서 실행 중인 Pod가 모두 삭제되었거나, 다른 노드로 이동됨

2️⃣ 해당 노드가 일정 시간 동안 사용되지 않으면 Cluster Autoscaler가 감지

3️⃣ 불필요한 노드를 자동으로 제거하여 리소스를 최적화

 

📌 사용되지 않는 노드 확인

kubectl get nodes

이 방식은 클라우드 비용을 절감하고, 리소스를 효율적으로 사용할 수 있도록 도와줍니다.

 


4️⃣ Cluster Autoscaler 설치 및 구성

 

✅ 1. Cluster Autoscaler 설치 (AWS EKS 예제)

 

AWS EKS에서 Cluster Autoscaler를 설치하려면, IAM 역할을 먼저 생성해야 합니다.

 

📌 IAM 역할 생성 (EKS 클러스터에 노드 확장 권한 부여)

aws iam create-policy --policy-name ClusterAutoscalerPolicy --policy-document file://cluster-autoscaler-policy.json

 

📌 Cluster Autoscaler 배포

kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/deploy/cluster-autoscaler-autodiscover.yaml

 

📌 Cluster Autoscaler 실행 상태 확인

kubectl get deployment -n kube-system | grep cluster-autoscaler

설치 후 kubectl logs 명령어를 활용하여 로그를 확인할 수 있습니다.

 


✅ 2. Cluster Autoscaler 설정 확인

 

설치된 Cluster Autoscaler가 올바르게 동작하는지 확인하려면, kubectl describe 명령어를 사용합니다.

 

📌 Cluster Autoscaler 설정 확인

kubectl describe deployment cluster-autoscaler -n kube-system

 

📌 노드 자동 확장 테스트 (ReplicaSet을 이용하여 Pod 증가 시도)

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: my-replicaset
spec:
  replicas: 10  # 실행 가능한 Pod보다 많은 수로 설정
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: nginx
          resources:
            requests:
              cpu: "500m"
            limits:
              cpu: "1000m"

 

📌 ReplicaSet 배포 후 Pod 상태 확인

kubectl get pods -w

Cluster Autoscaler가 Pending 상태의 Pod를 감지하면 자동으로 새로운 노드를 추가합니다.

 


5️⃣ Cluster Autoscaler 활용 시 주의할 점

 

✅ 1. minNodes와 maxNodes 값을 적절하게 설정해야 함

노드를 무제한으로 추가하지 않도록 최대 노드 개수(maxNodes)를 설정해야 함

불필요한 노드 축소를 방지하기 위해 최소 노드 개수(minNodes)도 지정해야 함

 

📌 최소/최대 노드 개수 설정 예제 (AWS EKS 기준)

eksctl create nodegroup --cluster my-cluster --name my-nodegroup \
  --nodes-min 2 --nodes-max 10

 

 


✅ 2. scale-down 시간이 너무 짧으면 Pod가 불안정해질 수 있음

Scale Down이 너무 빠르게 발생하면 Pod가 계속 이동하면서 서비스가 불안정해질 수 있음

일반적으로 최소 10~15분 이상 사용되지 않은 노드를 제거하도록 설정

 

📌 Scale Down 시간 조정 (15분 유지 후 노드 제거 설정)

kubectl edit deployment cluster-autoscaler -n kube-system
        - --scale-down-unneeded-time=15m

 

 


✅ 3. DaemonSet Pod는 자동 축소되지 않음

DaemonSet은 각 노드에서 실행되므로, DaemonSet이 있는 노드는 자동으로 축소되지 않음

DaemonSet Pod를 줄이거나, 노드 축소를 방지할 특정 노드를 지정해야 함

 

📌 DaemonSet을 특정 노드에서만 실행하도록 설정

tolerations:
  - key: "node-role.kubernetes.io/master"
    operator: "Exists"
    effect: "NoSchedule"

DaemonSet이 실행되는 노드는 자동 축소되지 않으므로, 관리가 필요합니다.

 


🔥 6️⃣ 결론

 

ReplicaSet은 Pod 개수를 유지하지만, 클러스터 리소스가 부족하면 Pending 상태가 발생할 수 있음

Cluster Autoscaler를 활용하면 Pending 상태의 Pod를 감지하여 자동으로 노드를 추가할 수 있음

리소스가 불필요하게 낭비되지 않도록 일정 시간 사용되지 않은 노드는 자동으로 제거 가능

최소/최대 노드 개수를 적절하게 설정하고, Scale Down 시간을 조정하여 안정적인 운영이 필요함

DaemonSet이 있는 노드는 자동 축소되지 않으므로, 관리가 필요함

728x90