클러스터 노드 오버프로비저닝

클러스터 노드 오버프로비저닝

이 페이지에서는 쿠버네티스 클러스터에서 노드 오버프로비저닝을 구성하는 방법을 안내해요. 노드 오버프로비저닝은 클러스터 컴퓨트 리소스의 일부를 사전에 예약하는 전략이에요. 이 예약은 스케일링 이벤트 중 새 파드를 스케줄하는 데 필요한 시간을 줄여, 트래픽이나 워크로드 수요의 갑작스러운 급증에 대한 클러스터 대응력을 높여줍니다.

미사용 용량을 일부 유지하면 새 파드가 생성될 때 리소스가 즉시 사용 가능해져, 클러스터가 스케일업하는 동안 파드가 pending 상태로 빠지는 것을 막아줘요.

출처: 문서

본문

시작하기 전에

  • 쿠버네티스 클러스터가 필요하고, kubectl 명령줄 도구가 클러스터와 통신하도록 설정돼 있어야 해요.
  • Deployments, Pod 우선순위, 노드 오토스케일링에 대한 기본적인 이해가 있어야 해요.
  • 클러스터가 수요에 따라 노드를 관리하는 오토스케일러로 설정되어 있어야 해요.

PriorityClass 만들기

자리 표시자(placeholder) 파드를 위한 PriorityClass를 정의하는 것부터 시작해요. 먼저, 곧 자리 표시자 파드에 할당할 음수 우선순위 값을 가진 PriorityClass를 만들어요. 나중에 이 PriorityClass를 사용하는 Deployment를 설정할 거예요.

그런 다음 PriorityClass를 만들어요:

kubectl apply -f https://k8s.io/examples/priorityclass/low-priority-class.yaml

다음으로 음수 우선순위 PriorityClass를 사용하고 최소 컨테이너를 실행하는 Deployment를 정의할 거예요. 이것을 클러스터에 추가하면 쿠버네티스는 용량을 예약하기 위해 그 자리 표시자 파드를 실행해요. 용량이 부족할 때마다 컨트롤 플레인은 이 자리 표시자 파드 중 하나를 선점될 첫 후보로 선택합니다.

노드 용량을 요청하는 파드 실행하기

샘플 매니페스트를 검토해요:

자리 표시자 파드의 네임스페이스 고르기

자리 표시자 파드가 들어갈 네임스페이스를 선택하거나 만들어야 해요.

자리 표시자 deployment 만들기

그 매니페스트를 기반으로 Deployment를 만들어요:

# Change the namespace name "example"
kubectl --namespace example apply -f https://k8s.io/examples/deployments/deployment-with-capacity-reservation.yaml

자리 표시자 리소스 request 조정하기

자리 표시자 파드의 리소스 request와 limit을 구성해 유지하고 싶은 오버프로비저닝 리소스 양을 정의해요. 이 예약은 특정 양의 CPU와 메모리가 새 파드를 위해 유지되도록 보장합니다.

Deployment를 편집하려면 Deployment 매니페스트 파일의 resources 섹션을 수정해 적절한 request와 limit을 설정해요. 그 파일을 로컬로 다운로드해 선호하는 텍스트 편집기로 편집할 수 있습니다.

kubectl로도 Deployment를 편집할 수 있어요:

kubectl edit deployment capacity-reservation

예를 들어 5개의 자리 표시자 파드에 걸쳐 총 0.5 CPU와 1GiB 메모리를 예약하려면, 단일 자리 표시자 파드의 리소스 request와 limit을 다음과 같이 정의해요:

  resources:
    requests:
      cpu: "100m"
      memory: "200Mi"
    limits:
      cpu: "100m"

원하는 레플리카 수 설정하기

예약된 총 리소스 계산하기

예를 들어 각각 0.1 CPU와 200MiB 메모리를 예약한 5개 레플리카가 있다고 하면:
예약된 총 CPU: 5 × 0.1 = 0.5 (Pod 스펙에서는 수량 500m으로 씁니다)
예약된 총 메모리: 5 × 200MiB = 1GiB (Pod 스펙에서는 1 Gi로 씁니다)

클러스터 크기와 예상 워크로드에 따라 레플리카 수를 조정해 Deployment를 스케일링해요:

kubectl scale deployment capacity-reservation --replicas=5

스케일링을 확인해요:

kubectl get deployment capacity-reservation

출력은 업데이트된 레플리카 수를 반영해야 해요:

NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
capacity-reservation   5/5     5            5           2m

일부 오토스케일러, 특히 Karpenter는 노드 스케일링을 고려할 때 선호 친화도 규칙을 하드 규칙으로 취급해요. Karpenter나 같은 휴리스틱을 사용하는 다른 노드 오토스케일러를 사용한다면, 여기서 설정한 레플리카 수가 클러스터의 최소 노드 수도 설정합니다.

더 알아보기 (Learn more)

  • PriorityClasses와 파드 스케줄링에 미치는 영향에 대해 더 알아보기.
  • 워크로드 수요에 따라 클러스터 크기를 동적으로 조정하는 노드 오토스케일링 탐색하기.
  • 쿠버네티스가 리소스 경합을 처리하는 핵심 메커니즘인 Pod 선점(preemption) 이해하기. 같은 페이지가 다루는 _축출(eviction)_은 자리 표시자 파드 접근 방식과 덜 관련되지만, 리소스가 경합될 때 쿠버네티스가 반응하는 또 다른 메커니즘입니다.