클러스터 노드 오버프로비저닝
클러스터 노드 오버프로비저닝
이 페이지에서는 쿠버네티스 클러스터에서 노드 오버프로비저닝을 구성하는 방법을 안내해요. 노드 오버프로비저닝은 클러스터 컴퓨트 리소스의 일부를 사전에 예약하는 전략이에요. 이 예약은 스케일링 이벤트 중 새 파드를 스케줄하는 데 필요한 시간을 줄여, 트래픽이나 워크로드 수요의 갑작스러운 급증에 대한 클러스터 대응력을 높여줍니다.
미사용 용량을 일부 유지하면 새 파드가 생성될 때 리소스가 즉시 사용 가능해져, 클러스터가 스케일업하는 동안 파드가 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)_은 자리 표시자 파드 접근 방식과 덜 관련되지만, 리소스가 경합될 때 쿠버네티스가 반응하는 또 다른 메커니즘입니다.