이 페이지에서는 수평형 포드 자동 확장을 사용하여 다양한 유형의 측정항목으로 배포를 자동 확장하는 방법을 설명합니다. 동일한 가이드라인을 사용하여 확장 가능한 배포 객체에 HorizontalPodAutoscaler
를 구성할 수 있습니다.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우
gcloud components update
를 실행하여 최신 버전을 가져옵니다.
HorizontalPodAutoscaler
객체용 API 버전
Google Cloud 콘솔을 사용하면 HorizontalPodAutoscaler
객체가 autoscaling/v2
API를 사용하여 생성됩니다.
kubectl
을 사용하여 수평형 포드 자동 확장 처리에 대한 정보를 만들거나 볼 때 autoscaling/v1
API 또는 autoscaling/v2
API를 지정할 수 있습니다.
기본값은
apiVersion: autoscaling/v1
이며 CPU 사용률에만 기반한 자동 확장을 허용합니다. 다른 측정항목을 기반으로 자동 확장하려면apiVersion: autoscaling/v2
을 사용하는 것이 좋습니다. 예시 배포 만들기의 예시에서는apiVersion: autoscaling/v1
을 사용합니다.새
HorizontalPodAutoscaler
객체를 만들 때는apiVersion: autoscaling/v2
을 사용하는 것이 좋습니다. 커스텀 측정항목 또는 외부 측정항목을 비롯한 여러 측정항목을 기반으로 자동 확장할 수 있습니다. 이 페이지의 다른 모든 예시에서는apiVersion: autoscaling/v2
를 사용합니다.
지원되는 API 버전을 확인하려면 kubectl api-versions
명령어를 사용합니다.
apiVersion: autoscaling/v2
을 사용하는 수평형 포드 자동 확장 처리 세부정보를 확인할 때 사용할 API를 지정할 수 있습니다.
배포 예시 만들기
수평형 포드 자동 확장 처리를 만들려면 먼저 모니터링하는 워크로드를 만들어야 합니다. 이 페이지의 예시에서는 다음 nginx
배포에 다른 수평형 포드 자동 확장 처리 구성을 적용합니다. 다른 예시에서는 리소스 사용률, 커스텀 측정항목 또는 외부 측정항목, 여러 측정항목을 기반으로 하는 수평형 포드 자동 확장 처리를 보여 줍니다.
다음 항목을 nginx.yaml
파일에 저장합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
resources:
# You must specify requests for CPU to autoscale
# based on CPU utilization
requests:
cpu: "250m"
이 매니페스트는 CPU 요청 값을 지정합니다. 리소스 사용률에 따라 백분율로 자동 확장하려면 해당 리소스에 대한 요청을 지정해야 합니다. 요청을 지정하지 않으면 CPU 사용률의 milliCPU와 같은 리소스 사용률의 절댓값만 기반으로 하여 자동 확장할 수 있습니다.
배포를 만들려면 nginx.yaml
매니페스트를 적용합니다.
kubectl apply -f nginx.yaml
배포에는 3으로 설정된 spec.replicas
가 있으므로 3개의 포드가 배포됩니다.
kubectl get deployment nginx
명령어를 사용하여 확인할 수 있습니다.
이 페이지의 각 예시에서는 다른 수평형 포드 자동 확장 처리를 nginx 배포 예시에 적용합니다.
리소스 사용률 기반의 자동 확장
이 예시에서는 HorizontalPodAutoscaler
객체를 생성하여 CPU 사용률이 50%를 초과할 때 nginx
배포를 자동 확장하고 항상 최소 1개의 복제본과 최대 10개의 복제본이 있는지 확인합니다.
Google Cloud 콘솔, kubectl apply
명령어를 사용하거나 평균 CPU만 해당되는 경우 kubectl autoscale
명령어를 사용하여 CPU를 타겟팅하는 수평형 포드 자동 확장 처리를 만들 수 있습니다.
콘솔
Google Cloud 콘솔에서 워크로드 페이지로 이동합니다.
nginx
배포 이름을 클릭합니다.list 작업 > 자동 확장을 클릭합니다.
다음 값을 지정합니다.
- 최소 복제본 수: 1
- 최대 복제본 수: 10
- 자동 확장 측정항목: CPU
- 목표: 50
- 단위: %
완료를 클릭합니다.
자동 확장을 클릭합니다.
kubectl apply
다음 YAML 매니페스트를 nginx-hpa.yaml
이라는 파일로 저장합니다.
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: nginx
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 50
HPA를 만들려면 다음 명령어를 사용하여 매니페스트를 적용합니다.
kubectl apply -f nginx-hpa.yaml
kubectl autoscale
평균 CPU 사용률만 대상으로 하는 HorizontalPodAutoscaler
객체를 만들려면 kubectl autoscale
명령어를 사용하면 됩니다.
kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=10
클러스터에서 수평형 포드 자동 확장 처리 목록을 가져오려면 다음 명령어를 사용합니다.
kubectl get hpa
출력은 다음과 비슷합니다.
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx Deployment/nginx 0%/50% 1 10 3 61s
수평형 포드 자동 확장 처리의 세부정보를 확인하려면 Google Cloud 콘솔 또는 kubectl
명령어를 사용하면 됩니다.
콘솔
Google Cloud 콘솔에서 워크로드 페이지로 이동합니다.
nginx
배포 이름을 클릭합니다.자동 확장 처리 섹션에서 수평형 포드 자동 확장 처리 구성을 확인합니다.
자동 확장 이벤트에 대한 자세한 내용은 이벤트 탭을 참조하세요.
kubectl get
수평형 포드 자동 확장 처리에 대한 세부정보를 가져오려면 kubectl get hpa
를 -o yaml
플래그와 함께 사용합니다. status
필드에는 현재 복제본 수 및 최근 자동 확장 이벤트 정보가 포함됩니다.
kubectl get hpa nginx -o yaml
출력은 다음과 비슷합니다.
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
annotations:
autoscaling.alpha.kubernetes.io/conditions: '[{"type":"AbleToScale","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ScaleDownStabilized","message":"recent
recommendations were higher than current one, applying the highest recent recommendation"},{"type":"ScalingActive","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ValidMetricFound","message":"the
HPA was able to successfully calculate a replica count from cpu resource utilization
(percentage of request)"},{"type":"ScalingLimited","status":"False","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"DesiredWithinRange","message":"the
desired count is within the acceptable range"}]'
autoscaling.alpha.kubernetes.io/current-metrics: '[{"type":"Resource","resource":{"name":"cpu","currentAverageUtilization":0,"currentAverageValue":"0"}}]'
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"autoscaling/v1","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec":{"maxReplicas":10,"minReplicas":1,"scaleTargetRef":{"apiVersion":"apps/v1","kind":"Deployment","name":"nginx"},"targetCPUUtilizationPercentage":50}}
creationTimestamp: "2019-10-30T19:42:43Z"
name: nginx
namespace: default
resourceVersion: "220050"
selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/nginx
uid: 70d1067d-fb4d-11e9-8b2a-42010a8e013f
spec:
maxReplicas: 10
minReplicas: 1
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
targetCPUUtilizationPercentage: 50
status:
currentCPUUtilizationPercentage: 0
currentReplicas: 3
desiredReplicas: 3
이 페이지의 나머지 예시를 따르기 전에 HPA를 삭제합니다.
kubectl delete hpa nginx
수평형 포드 자동 확장 처리를 삭제해도 배포의 복제본 수는 동일하게 유지됩니다. 수평형 포드 자동 확장 처리가 적용되기 전에 배포가 자동으로 원래 상태로 되돌아가지 않습니다.
수평형 포드 자동 확장 처리 삭제에 대해 자세히 알아보세요.
부하 분산기 트래픽 기반 자동 확장
트래픽 기반 자동 확장은 포드 자동 확장을 위해 부하 분산기의 트래픽 사용률 신호를 통합하는 GKE 기능입니다.
트래픽이 CPU 및 메모리에 상호 보완적인 부하에 대한 선행 지표이므로 트래픽을 자동 확장 신호로 사용하는 것이 도움이 됩니다. GKE와의 기본 제공 통합은 설정을 쉽게 수행하고 자동 확장이 트래픽 급증에 빠르게 대응해서 요구를 충족시킬 수 있게 해줍니다.
트래픽 기반 자동 확장은 게이트웨이 컨트롤러 및 해당 전역 트래픽 관리 기능으로 사용 설정됩니다. 자세한 내용은 트래픽 기반 자동 확장을 참조하세요.
부하 분산기 트래픽 기반의 자동 확장은 게이트웨이 워크로드에서만 사용할 수 있습니다.
요구사항
트래픽 기반 자동 확장의 요구사항은 다음과 같습니다.
- GKE 버전 1.24 이상에서 지원됩니다.
- GKE 클러스터에서 게이트웨이 API가 사용 설정됩니다.
- Gateway API와
gke-l7-global-external-managed
,gke-l7-regional-external-managed
,gke-l7-rilb
,gke-l7-gxlb
GatewayClass 중 하나를 사용하여 배포된 부하 분산기를 통과하는 트래픽에 지원됩니다.
제한사항
트래픽 기반 자동 확장의 제한사항은 다음과 같습니다.
- 멀티 클러스터 GatewayClass(
gke-l7-global-external-managed-mc
,gke-l7-regional-external-managed-mc
,gke-l7-rilb-mc
,gke-l7-gxlb-mc
)에서는 지원되지 않습니다. ClusterIP
또는LoadBalancer
유형의 서비스를 사용하는 트래픽에는 지원되지 않습니다.- 트래픽 기반 자동 확장을 사용하도록 구성된 HPA, 배포(또는 기타 대상 리소스), 서비스는 1:1:1로 매핑되어야 합니다.
트래픽 기반 자동 확장 배포
다음 연습에서는 HorizontalPodAutoscaler
를 사용해서 수신되는 트래픽을 기반으로 store-autoscale
배포를 자동 확장합니다. 게이트웨이는 포드에 대해 인터넷에서 인그레스 트래픽을 수락합니다. 자동 확장 처리는 게이트웨이의 트래픽 신호를 store-autoscale
서비스 리소스에 구성된 포드별 트래픽 용량과 비교합니다. 게이트웨이에 트래픽을 생성하면 배포된 포드 수에 영향을 줍니다.
다음 다이어그램은 트래픽 기반 자동 확장의 작동 방법을 보여줍니다.
트래픽 기반 자동 확장을 배포하려면 다음 단계를 수행합니다.
Standard 클러스터의 경우 GatewayClass가 클러스터에 설치되어 있는지 확인합니다. Autopilot 클러스터의 경우 GatewayClass는 기본적으로 설치됩니다.
kubectl get gatewayclass
GKE GatewayClass 리소스를 클러스터에서 사용할 준비가 되었는지 출력으로 확인됩니다.
NAME CONTROLLER ACCEPTED AGE gke-l7-global-external-managed networking.gke.io/gateway True 16h gke-l7-regional-external-managed networking.gke.io/gateway True 16h gke-l7-gxlb networking.gke.io/gateway True 16h gke-l7-rilb networking.gke.io/gateway True 16h
이 출력이 표시되지 않으면 GKE 클러스터에서 Gateway API를 사용 설정합니다.
샘플 애플리케이션과 게이트웨이 부하 분산기를 클러스터에 배포합니다.
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/master/gateway/docs/store-autoscale.yaml
샘플 애플리케이션은 다음 항목을 만듭니다.
- 복제본이 2개인 배포
max-rate-per-endpoint
가10
으로 설정된 서비스 용량 이 기능은 미리보기에 있지만 서비스의 주석을 사용합니다. 이 기능이 정식 버전으로 제공되면 서비스 정책이 주석을 대체합니다. 게이트웨이 기능에 대한 자세한 내용은 GatewayClass 기능을 참조하세요.- 인터넷에서 애플리케이션에 액세스하기 위한 외부 게이트웨이. 게이트웨이 부하 분산기 사용 방법은 게이트웨이 배포를 참조하세요.
- 모든 트래픽을 찾아서
store-autoscale
서비스로 전송하는 HTTPRoute
서비스 용량은 자동 확장 이벤트를 트리거하는 포드별 트래픽 양을 결정하기 때문에 트래픽 기반 자동 확장을 사용할 때 중요한 요소입니다. 서비스 주석
networking.gke.io/max-rate-per-endpoint
를 사용해서 구성된 서비스 용량이며, 포드별로 초당 요청 수로 서비스에 수신되는 최대 트래픽을 정의합니다. 서비스 용량은 애플리케이션에 따라 달라집니다. 자세한 내용은 서비스 용량 확인을 참조하세요.다음 매니페스트를
hpa.yaml
로 저장합니다.apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: store-autoscale spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: store-autoscale minReplicas: 1 maxReplicas: 10 metrics: - type: Object object: describedObject: kind: Service name: store-autoscale metric: name: "autoscaling.googleapis.com|gclb-capacity-utilization" target: averageValue: 70 type: AverageValue
이 매니페스트는 다음 속성을 사용해서
HorizontalPodAutoscaler
를 기술합니다.minReplicas
및maxReplicas
: 이 배포의 최소 및 최대 복제본 수를 설정합니다. 이 구성에서 포드 수는 복제본 1에서 10까지 확장될 수 있습니다.describedObject.name: store-autoscale
: 트래픽 용량을 정의하는store-autoscale
서비스에 대한 참조입니다.scaleTargetRef.name: store-autoscale
: 수평형 포드 자동 확장 처리로 확장되는 리소스를 정의하는store-autoscale
배포에 대한 참조입니다.averageValue: 70
: 용량 사용률의 대상 평균 값입니다. 이렇게 하면 수평형 포드 자동 확장 처리에 성장 여유가 제공되어 새 포드를 생성하는 동안 실행 중인 포드가 여분의 트래픽을 처리할 수 있습니다.
수평형 포드 자동 확장 처리는 다음과 같은 트래픽 동작을 일으킵니다.
- 엔드포인트당 최대 비율 70%를 달성하기 위해 1~10개 복제본 사이로 포드 수가 조정됩니다. 따라서
max-rate-per-endpoint=10
인 경우 포드당 7 RPS로 조정됩니다. - 포드당 7 RPS가 넘으면 최댓값 10개 복제본에 도달할 때까지 또는 평균 트래픽이 포드당 7 RPS가 될 때까지 포드가 확장됩니다.
- 트래픽이 줄어들면 수평형 포드 자동 확장 처리 알고리즘을 사용해서 적절한 비율로 포드가 축소됩니다.
또한 트래픽 생성기를 배포해서 트래픽 기반 자동 확장 동작을 검증할 수 있습니다.
30 RPS에서는 배포가 5개 복제본으로 확장되므로, 각 복제본에서 이상적으로 6 RPS 트래픽이 수신되며, 이것은 포드당 60% 사용률에 해당합니다. 이것은 70% 대상 사용률 미만에 해당하므로, 포드가 적절히 확장된 것입니다. 트래픽 변동에 따라 자동 확장된 복제본 수도 변동될 수 있습니다. 복제본 수의 계산 방법에 대한 자세한 내용은 자동 확장 동작을 참조하세요.
커스텀 측정항목 또는 외부 측정항목에 기반한 자동 확장
커스텀 측정항목 및 외부 측정항목에 대한 수평형 포드 자동 확장 처리를 만들려면 측정항목에 기반한 포드 자동 확장 최적화를 참조하세요.
여러 측정항목에 기반한 자동 확장
이 예시에서는 CPU 사용률과 packets_per_second
라는 커스텀 측정항목에 기반하여 자동 확장되는 수평형 포드 자동 확장 처리를 만듭니다.
위 예시를 따랐지만 여전히 nginx
라는 수평형 포드 자동 확장 처리가 있는 경우 먼저 삭제하고 이 예시를 따릅니다.
이 예시에는 apiVersion: autoscaling/v2
이 필요합니다. 사용 가능한 API에 대한 자세한 내용은 HorizontalPodAutoscaler
객체용 API 버전을 참조하세요.
이 YAML 매니페스트를 nginx-multiple.yaml
이라는 파일로 저장합니다.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
- type: Resource
resource:
name: memory
target:
type: AverageValue
averageValue: 100Mi
# Uncomment these lines if you create the custom packets_per_second metric and
# configure your app to export the metric.
# - type: Pods
# pods:
# metric:
# name: packets_per_second
# target:
# type: AverageValue
# averageValue: 100
YAML 매니페스트를 적용합니다.
kubectl apply -f nginx-multiple.yaml
수평형 포드 자동 확장 처리는 생성된 후 평균 CPU 사용률, 평균 메모리 사용률, 커스텀 packets_per_second
측정항목(주석 처리를 삭제한 경우)의 nginx
배포를 모니터링합니다. 수평형 포드 자동 확장 처리는 더 큰 자동 확장 이벤트를 생성하는 값을 가진 측정항목을 기반으로 배포를 자동 확장합니다.
수평형 포드 자동 확장 처리에 대한 세부정보 보기
수평형 포드 자동 확장 처리의 구성 및 통계를 보려면 다음 명령어를 사용하세요.
kubectl describe hpa HPA_NAME
HPA_NAME
을 HorizontalPodAutoscaler
객체의 이름으로 바꿉니다.
수평형 포드 자동 확장 처리에서 apiVersion: autoscaling/v2
를 사용하고 여러 측정항목을 기반으로 하는 경우 kubectl describe hpa
명령어는 CPU 측정항목만 표시합니다. 모든 측정항목을 보려면 다음 명령어를 사용합니다.
kubectl describe hpa.v2.autoscaling HPA_NAME
HPA_NAME
을 HorizontalPodAutoscaler
객체의 이름으로 바꿉니다.
각 수평형 포드 자동 확장 처리의 현재 상태는 Conditions
필드에 표시되고 자동 확장 이벤트는 Events
필드에 나열됩니다.
출력은 다음과 비슷합니다.
Name: nginx
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"autoscaling/v2","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"s...
CreationTimestamp: Tue, 05 May 2020 20:07:11 +0000
Reference: Deployment/nginx
Metrics: ( current / target )
resource memory on pods: 2220032 / 100Mi
resource cpu on pods (as a percentage of request): 0% (0) / 50%
Min replicas: 1
Max replicas: 10
Deployment pods: 1 current / 1 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale recommended size matches current size
ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from memory resource
ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
Events: <none>
수평형 포드 자동 확장 처리 삭제
Google Cloud 콘솔 또는 kubectl delete
명령어를 사용하여 수평형 포드 자동 확장 처리를 삭제할 수 있습니다.
콘솔
nginx
수평형 포드 자동 확장 처리를 삭제하려면 다음 안내를 따르세요.
Google Cloud 콘솔에서 워크로드 페이지로 이동합니다.
nginx
배포 이름을 클릭합니다.list 작업 > 자동 확장을 클릭합니다.
삭제를 클릭합니다.
kubectl delete
nginx
수평형 포드 자동 확장 처리를 삭제하려면 다음 명령어를 사용합니다.
kubectl delete hpa nginx
수평형 포드 자동 확장 처리를 삭제하면 배포 또는 다른 배포 객체는 기존 규모로 유지되며 배포 원본 매니페스트의 복제본 수로 되돌아가지 않습니다. 배포를 다시 3개의 포드로 수동 확장하려면 kubectl scale
명령어를 사용합니다.
kubectl scale deployment nginx --replicas=3
삭제
수평형 포드 자동 확장 처리를 삭제하지 않은 경우 삭제합니다.
kubectl delete hpa nginx
nginx
배포를 삭제합니다.kubectl delete deployment nginx
선택적으로 클러스터를 삭제합니다.
문제 해결
이 섹션에서는 수평형 포드 자동 확장을 사용하는 문제의 문제 해결 단계를 보여줍니다.
수평형 포드 자동 확장 처리에 unable to fetch pod metrics for pod
오류가 표시됨
수평형 포드 자동 확장 처리를 설정하면 다음과 같은 경고 메시지가 표시될 수 있습니다.
unable to fetch pod metrics for pod
일반적으로 측정항목 서버가 시작될 때 이 메시지가 표시됩니다. 그러나 경고가 계속 표시되고 포드가 워크로드에 맞게 확장되지 않는 경우 워크로드의 각 컨테이너에 대한 리소스 요청을 지정했는지 확인하세요. 수평형 포드 자동 확장에서 리소스 사용률 백분율 타겟을 사용하려면 워크로드의 각 포드에서 실행되는 각 컨테이너에서 해당 리소스에 대한 요청을 구성해야 합니다. 그렇지 않으면 수평형 포드 자동 확장 처리는 필요한 계산을 수행할 수 없으며 해당 측정항목과 관련된 작업을 수행하지 않습니다.
수평형 포드 자동 확장 처리에 multiple services selecting the same target of...
이벤트가 표시됨
수평형 포드 자동 확장 처리의 대상(일반적으로 배포)과 연결된 여러 서비스에서 트래픽 기반 자동 확장을 사용하고 있는 것으로 인식되면 수평형 포드 자동 확장 처리에 multiple services selecting the same target of <hpa>: <services>
오류가 표시됩니다.
트래픽 기반 자동 확장은 자동 확장된 리소스와 정확히 하나의 서비스가 연결된 구성만 지원합니다. 부하 분산기 트래픽 기반 자동 확장을 참조하세요. 오류 메시지에는 발견된 서비스가 표시됩니다.
이 문제를 해결하려면 수평형 포드 자동 확장 처리에 하나의 서비스만 연결되어 있는지 확인합니다.
다음 단계
- 수평형 포드 자동 확장 자세히 알아보기
- 수직형 포드 자동 확장 자세히 알아보기
- 다차원 포드 자동 확장 자세히 알아보기
- 커스텀 측정항목으로 배포 자동 확장 자세히 알아보기
- 컨테이너 및 포드에 CPU 리소스 할당 방법 알아보기
- 컨테이너 및 포드에 메모리 리소스 할당 방법 알아보기