용량 버퍼는 Kubernetes CapacityBuffer 커스텀 리소스 정의를 사용하여 예비 클러스터 용량을 사전 대응 방식으로 관리하여 중요한 워크로드의 응답성과 안정성을 개선합니다. 용량 버퍼를 사용하면 클러스터 내에서 사용되지 않는 노드 용량을 명시적으로 정의할 수 있습니다. 이 예약된 용량은 GKE가 미리 노드를 프로비저닝하는 데 도움이 됩니다.
우선순위가 높은 워크로드를 빠르게 확장해야 하는 경우 새 워크로드는 노드 프로비저닝을 기다리지 않고 즉시 빈 용량을 사용할 수 있습니다. 이렇게 하면 지연 시간이 최소화되고 수요가 갑자기 급증하는 동안 리소스 경합이 방지됩니다.
이 페이지에서는 고정 복제본 버퍼, 비율 기반 버퍼, 리소스 한도 버퍼의 세 가지 용량 버퍼 구성 방법을 설명합니다.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면
gcloud components update명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.
- 버전 1.35.2-gke.1842000 이상의 GKE 클러스터를 만들거나 액세스합니다.
- (선택사항이지만 권장) 클러스터에서 노드 자동 프로비저닝을 사용 설정합니다.
필수 Kubernetes 객체 만들기
CapacityBuffer를 구성하려면 필요한 모든 객체 (CapacityBuffer 자체 및 PodTemplate 또는 워크로드와 같은 추가 리소스)를 보유하는 네임스페이스가 필요합니다. PodTemplate과 CapacityBuffer는 동일한 네임스페이스에 있어야 합니다. 네임스페이스를 만들거나 default 네임스페이스를 비롯한 기존 네임스페이스를 사용할 수 있습니다.
구성하는 CapacityBuffer 유형에 따라 다음 중 하나도 필요합니다.
- PodTemplate: 단일 버퍼 용량 단위의 리소스 요구사항을 정의합니다. CapacityBuffer 객체에 지정된 구성은 포드 템플릿을 참조합니다.
워크로드: CapacityBuffer 객체에서 참조하는 기존 워크로드입니다. 이 가이드에서는 Deployment 객체를 워크로드의 예로 사용하지만 용량 버퍼는 다음 리소스 유형을 지원합니다.
- 배포
- ReplicaSet
- StatefulSet
- ReplicationController
- 작업
scale하위 리소스를 구현하는 CustomResourceDefinition (CRD)
이 섹션에서는 이러한 객체의 예를 제공합니다. 용량 버퍼로 구성하려는 워크로드가 이미 있는 경우 용량 버퍼 적용으로 진행합니다.
예시 Kubernetes 워크로드를 만들려면 다음 단계를 완료하세요.
다음 매니페스트를
namespace.yaml로 저장합니다.apiVersion: v1 kind: Namespace metadata: name: capacity-buffer-example labels: name: capacity-buffer-example이 매니페스트는
capacity-buffer-example이라는 네임스페이스를 만듭니다.다음 매니페스트를
buffer-pod-template.yaml로 저장합니다.apiVersion: v1 kind: PodTemplate metadata: name: buffer-unit-template namespace: capacity-buffer-example # the namespace must be the same namespace as the CapacityBuffer template: spec: terminationGracePeriodSeconds: 0 containers: - name: buffer-container image: registry.k8s.io/pause:3.9 resources: requests: cpu: "1" memory: "1Gi" limits: cpu: "1" memory: "1Gi"이 매니페스트는 버퍼 용량의 단일 단위 (
1CPU 및1Gi메모리)의 리소스 요구사항을 정의하는PodTemplate를 만듭니다. 이 구성은 GKE가 버퍼에 프로비저닝하는 용량 단위의 크기를 지정합니다. 예를 들어 이PodTemplate를 사용하면 클러스터가 확장될 때 GKE는 CPU가 1개 미만이고 사용 가능한 리소스가 1Gi 미만인 노드를 버퍼의 일부로 간주하지 않습니다.다음 매니페스트를
sample-workload-deployment.yaml로 저장합니다.apiVersion: apps/v1 kind: Deployment metadata: name: critical-workload-ref namespace: capacity-buffer-example # the namespace must be the same namespace as the CapacityBuffer spec: replicas: 10 selector: matchLabels: app: critical-workload template: metadata: labels: app: critical-workload spec: containers: - name: busybox image: busybox command: ["sleep", "3600"] resources: requests: cpu: 100m이 매니페스트는 다음 섹션의 백분율 기반 버퍼 예시의 참조 객체인 10개의 복제본이 있는 샘플 배포를 만듭니다.
매니페스트를 클러스터에 적용합니다.
kubectl apply -f namespace.yaml -f buffer-pod-template.yaml -f sample-workload-deployment.yamlGKE에서 객체를 만들었는지 확인합니다.
kubectl get podtemplate -n capacity-buffer-example kubectl get deployment critical-workload-ref -n capacity-buffer-example출력은 다음과 비슷합니다.
NAME AGE buffer-unit-template 1m NAME READY UP-TO-DATE AVAILABLE AGE critical-workload-ref 10/10 10 10 1m
용량 버퍼 적용
이 섹션에서는 워크로드에 적용할 수 있는 다양한 유형의 용량 버퍼의 예를 제공합니다.
고정 복제본 버퍼 구성
고정된 복제본으로 CapacityBuffer를 구성하면 PodTemplate에 따라 원하는 정확한 버퍼 단위 수가 지정됩니다.
고정 복제본으로 버퍼를 만들려면 다음 단계를 완료하세요.
다음 매니페스트를
cb-fixed-replicas.yaml로 저장합니다.apiVersion: autoscaling.x-k8s.io/v1beta1 kind: CapacityBuffer metadata: name: fixed-replica-buffer namespace: NAMESPACE spec: podTemplateRef: name: POD_TEMPLATE replicas: 3다음을 바꿉니다.
NAMESPACE: 네임스페이스의 이름(예:capacity-buffer-example)POD_TEMPLATE: 리소스 요구사항을 정의하는PodTemplate(예:buffer-unit-template)
이 매니페스트는
PodTemplate을 참조하여 특정 수의 버퍼 단위를 요청하는 CapacityBuffer 리소스를 만듭니다.매니페스트를 적용합니다.
kubectl apply -f cb-fixed-replicas.yamlGKE가 용량 버퍼를 적용했는지 확인합니다.
kubectl get capacitybuffer fixed-replica-buffer -n NAMESPACE상태의
replicas필드에는 매니페스트에 정의한 복제본 수를 반영하는3이 표시되어야 합니다.STATUS필드에ReadyForProvisioning이 표시되어야 합니다.
비율 기반 버퍼 구성
비율 기반 버퍼를 구성하면 기존 확장 가능한 워크로드의 비율에 따라 버퍼 크기가 동적으로 조정됩니다.
백분율 기반 버퍼를 만들려면 다음 단계를 완료하세요.
다음 매니페스트를
cb-percentage-based.yaml로 저장합니다.apiVersion: autoscaling.x-k8s.io/v1beta1 kind: CapacityBuffer metadata: name: percentage-buffer namespace: NAMESPACE spec: scalableRef: apiGroup: apps kind: Deployment name: SCALABLE_RESOURCE_NAME percentage: 20다음을 바꿉니다.
NAMESPACE: 네임스페이스의 이름입니다.SCALABLE_RESOURCE_NAME: 확장 가능한 리소스의 이름(예:critical-workload-ref)
이 매니페스트는 참조된 리소스의 복제본의 20% 에 해당하는 버퍼 크기를 요청하는 CapacityBuffer 리소스를 만듭니다. 이전 섹션의 배포 예시를 사용하는 경우 복제본 값은
10로 설정됩니다.매니페스트를 적용합니다.
kubectl apply -f cb-percentage-based.yamlGKE가 용량 버퍼를 적용했는지 확인합니다.
kubectl get capacitybuffer percentage-buffer -n NAMESPACECapacityBuffer 상태를 확인합니다.
replicas필드에는 백분율 계산 값이 표시되어야 합니다. 이전 섹션의 배포 예시를 사용하는 경우2버퍼 단위가 표시됩니다. 이는 배포에 정의된 10개 복제본의 20% 입니다.배포를 최대 20개의 복제본으로 수동으로 확장하여 동적 확장을 테스트합니다.
kubectl scale deployment critical-workload-ref -n NAMESPACE --replicas=20CapacityBuffer 컨트롤러가 반응하여 버퍼를 4개의 복제본으로 자동 확장합니다.
리소스 한도 버퍼 구성
limits 필드를 사용하여 버퍼가 소비해야 하는 최대 리소스 수를 정의할 수 있습니다. 이 수는 PodTemplate 크기를 기반으로 계산됩니다.
리소스 한도 버퍼를 만들려면 다음 단계를 완료하세요.
다음 매니페스트를
cb-resource-limits.yaml로 저장합니다.apiVersion: autoscaling.x-k8s.io/v1beta1 kind: CapacityBuffer metadata: name: resource-limit-buffer namespace: NAMESPACE spec: podTemplateRef: name: POD_TEMPLATE limits: cpu: "5" memory: "5Gi"다음을 바꿉니다.
NAMESPACE: 네임스페이스의 이름(예:capacity-buffer-example)POD_TEMPLATE: 리소스 요구사항을 정의하는PodTemplate(예:buffer-unit-template)
이 매니페스트는 총 한도가 CPU 5개와 메모리 5GiB인 CapacityBuffer 리소스를 만듭니다. 이전 단계의
PodTemplate예시를 사용하는 경우 각 단위를1CPU 및1Gi메모리로 정의하면 버퍼 단위가 5개가 됩니다.매니페스트를 적용합니다.
kubectl apply -f cb-resource-limits.yamlGKE가 용량 버퍼를 적용했는지 확인합니다.
kubectl get capacitybuffer resource-limit-buffer -n NAMESPACECapacityBuffer 상태를 확인합니다.
replicas필드에는 정의한 한도에서 파생된 값이 표시되어야 합니다. 이전 섹션의PodTemplate예시를 사용하는 경우 정의된 한도 내에 맞는 최대 단위 수인5버퍼 단위가 표시됩니다.
용량 버퍼 삭제
워크로드에 더 이상 용량 버퍼가 필요하지 않으면 CapacityBuffer 객체를 삭제합니다. 이렇게 하면 자리표시자 포드가 삭제되고 클러스터 자동 확장 처리가 노드를 축소할 수 있습니다.
kubectl delete capacitybuffer CAPACITY_BUFFER_NAME -n NAMESPACE
CAPACITY_BUFFER_NAME을 삭제할 CapacityBuffer의 이름으로 바꿉니다.
문제 해결
다음 섹션에는 용량 버퍼의 일반적인 문제를 해결하는 방법에 관한 정보가 포함되어 있습니다.
결제 모델로 인해 용량 버퍼가 준비되지 않음
포드 기반 청구 모델(포드당 지불)을 사용하는 워크로드의 CapacityBuffer를 만드는 경우 프로비저닝을 위한 용량 버퍼가 준비되지 않습니다.
이 문제를 확인하려면 CapacityBuffer 상태를 확인하세요.
kubectl describe capacitybuffer BUFFER_NAME -n NAMESPACE
False 상태의 ReadyForProvisioning 유형 조건을 찾습니다.
이 문제를 해결하려면 CapacityBuffer가 노드 기반 청구와 호환되는 워크로드 또는 PodTemplate를 참조하는지 확인하세요.
맞춤 확장 가능 리소스의 권한 오류
scalableRef 필드를 사용하여 맞춤 확장 가능한 객체와 함께 작동하도록 CapacityBuffer를 구성하는 경우 클러스터 자동 확장 처리기에 필요한 권한이 없으면 버퍼를 확장하지 못할 수 있습니다.
이 문제를 해결하려면 다음 예와 같이 ClusterRole 및 ClusterRoleBinding를 만들어 필요한 권한을 수동으로 부여하세요.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: custom-scale-getter
rules:
- apiGroups: ["api.example.com"]
resources: ["customreplicatedresources/scale"]
verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: ca-custom-scale-getter
subjects:
- kind: User
name: "system:cluster-autoscaler"
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: custom-scale-getter
RBAC 구성에 대한 자세한 내용은 Kubernetes RBAC 문서를 참고하세요.
다음 단계
- 용량 버퍼에 대해 자세히 알아보세요.
- CapacityBuffer CRD 문서를 참고하세요.