티스토리 뷰
[특집 시리즈] Azure Kubernetes Service 워크샵 - 10. 수요에 맞게 애플리케이션 크기 조정 1편
zerobig-k8s 2021. 6. 7. 07:44본 실습의 클러스터 자동 크기 조정과 관련해서 여러 번 시도 해봤지만 테스트가 정상적으로 이루어 지지 않아 원인 분석 후 추가 정리하고자 한다. 따라서 먼저 HPA에 대한 부분을 먼저 정리하여 게시한다.
# 6월 13일 업데이트 사항 : 스케일링 테스트 방안 새로 정리하여 업데이트.
Fruit Smoothies는 전 세계에 대규모 팔로워 기반이 있는 매장을 보유하고 있으므로 많은 사용자가 평가 웹 사이트를 사용하여 좋아하는 스무디 맛을 평가할 것으로 예상된다. 애플리케이션의 인기가 높아짐에 따라, 애플리케이션의 규모를 적절하게 조정하여 수요 변화를 관리해야 한다. 평가 수가 증가함에 따라 애플리케이션이 응답성을 유지하도록 해야한다.
이번 실습에서는 다음을 수행한다.
- AKS Horizontal Pod Autoscaler 만들기
- 활성화된 Horizontal Pod Autoscaler로 부하 테스트 실행
- AKS 클러스터 자동 크기 조정
Horizontal Pod Autoscaler 만들기
트래픽 증가에 따라 ratings-api 컨테이너는 들어오는 요청 수를 처리할 수 없게 된다. 이러한 병목 상태를 해결하기 위해 해당 컨테이너에 더 많은 인스턴스를 배포할 수 있다.
AKS에서 컨테이너 인스턴스를 스케일 아웃해야 하는 경우 선택할 수 있는 옵션은 두 가지가 있다. 디플로이먼트의 복제본 수를 수동으로 증가시키거나 Horizontal Pod Autoscaler를 사용하면 된다.
HPA(Horizontal Pod Autoscaler)란?
HPA(Horizontal Pod Autoscaler) 컨트롤러는 Kubernetes 컨트롤러 관리자가 HorizontalPodAutoscaler 정의에 지정된 메트릭에 대해 리소스 사용을 쿼리할 수 있도록 하는 Kubernetes 제어 루프이다. HPA 컨트롤러는 정의 파일에 지정된 원하는 메트릭 값과 측정된 현재 메트릭 값 간의 비율을 계산한다. HPA는 계산된 값을 기준으로 Pod 수를 자동으로 조정한다.
HPA를 사용하면 CPU와 같은 메트릭에 따라 배포된 Pod에 더 많은 리소스가 필요한 경우 AKS에서 감지할 수 있다. 그런 다음 HPA는 클러스터에 더 많은 Pod를 예약하여 수요를 처리할 수 있다. kubectl autoscale 명령을 사용하여 HPA를 구성하거나 YAML 파일에서 HPA 개체를 정의할 수 있다.
1. 통합 편집기를 사용하여 ratings-api-hpa.yaml이라는 이름의 파일을 만든다.
code ratings-api-hpa.yaml
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: ratings-api
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: ratings-api
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 30
3. 파일을 검토하고 다음 사항을 확인한다.
- 크기 조정 대상 : 크기 조정 대상은 ratings-api 디플로이먼트이다.
- 최소 및 최대 복제본 수 : 배포될 복제본의 최소 및 최대 수이다.
- 메트릭 : 모니터링되는 자동 크기 조정 메트릭은 CPU 사용률이며 30%로 설정된다. 사용률이 해당 수준 이상으로 올라가면 HPA가 더 많은 복제본을 만든다.
4, 파일을 저장하려면 Ctrl+S를 선택한다. 편집기를 닫으려면 Ctrl+Q를 선택한다.
5. kubectl apply 명령을 사용하여 구성을 적용한다. ratingsapp 네임스페이스에서 HPA 개체를 배포한다.
kubectl apply \
--namespace ratingsapp \
-f ratings-api-hpa.yaml
kim@Azure:~$ kubectl apply \
> --namespace ratingsapp \
> -f ratings-api-hpa.yaml
horizontalpodautoscaler.autoscaling/ratings-api created
중요
Horizontal Pod Autoscaler가 작동하기 위해서는 ratings-api 디플로이먼트에서 명시적인 복제본 수를 제거해야한다. 변경 사항이 있으면 디플로이먼트를 다시 배포해야 한다.
활성화된 Horizontal Pod Autoscaler로 부하 테스트 실행
부하 테스트를 만들려면 Docker Hub에서 azch/artillery라는 이름으로 제공되는 미리 빌드된 이미지를 사용한다. 이미지에는 API로 트래픽을 보내는 데 사용되는 artillery라는 도구가 포함된다. Azure Container Instances는 컨테이너로 이미지를 실행하는 데 사용될 수 있다.
컨테이너 인스턴스 집합으로 실행할 경우 완료 후 재시작되지 않도록 해야 한다. --restart-policy 매개 변수를 사용하고 재시작을 방지하기 위해 값을 Never로 설정한다.
1. Azure Cloud Shell에서 프런트 엔드 API 부하 테스트 엔드포인트를 Bash 변수에 저장하고 <frontend hostname>을 공개된 수신 호스트 이름(예: https://frontend.20.194.0.122.nip.io)으로 대체한다.
LOADTEST_API_ENDPOINT=https://<frontend hostname>/api/loadtest
HPA로 배포의 크기를 조정하는 방식을 확인하기 위해 부하 테스트를 실행해 보겠다.
2. 다음 명령을 사용하여 부하 테스트를 실행한다. 이 명령은 테스트 기간을 120초로 설정하여 초당 최대 500개 요청을 시뮬레이트한다.
az container create \
-g $RESOURCE_GROUP \
-n loadtest \
--cpu 4 \
--memory 1 \
--image azch/artillery \
--restart-policy Never \
--command-line "artillery quick -r 500 -d 120 $LOADTEST_API_ENDPOINT"
kim@Azure:~$ az container create \
> -g $RESOURCE_GROUP \
> -n loadtest \
> --cpu 4 \
> --memory 1 \
> --image azch/artillery \
> --restart-policy Never \
> --command-line "artillery quick -r 500 -d 120 $LOADTEST_API_ENDPOINT"
{
"containers": [
{
"command": [
"artillery",
"quick",
"-r",
"500",
"-d",
"120",
"https://frontend.20-194-0-122.nip.io/api/loadtest"
],
"environmentVariables": [],
"image": "azch/artillery",
"instanceView": {
"currentState": {
"detailStatus": "",
"exitCode": null,
"finishTime": null,
"startTime": "2021-06-06T08:18:13.183000+00:00",
"state": "Running"
},
"events": [
{
"count": 1,
"firstTimestamp": "2021-06-06T08:17:48+00:00",
"lastTimestamp": "2021-06-06T08:17:48+00:00",
"message": "pulling image \"azch/artillery@sha256:d587512de795c2092b1e1e539d931034bb1d54d5a2e7d15d88654f88712b61e5\"",
"name": "Pulling",
"type": "Normal"
},
{
"count": 1,
"firstTimestamp": "2021-06-06T08:18:03+00:00",
"lastTimestamp": "2021-06-06T08:18:03+00:00",
"message": "Successfully pulled image \"azch/artillery@sha256:d587512de795c2092b1e1e539d931034bb1d54d5a2e7d15d88654f88712b61e5\"",
"name": "Pulled",
"type": "Normal"
},
{
"count": 1,
"firstTimestamp": "2021-06-06T08:18:13+00:00",
"lastTimestamp": "2021-06-06T08:18:13+00:00",
"message": "Started container",
"name": "Started",
"type": "Normal"
}
],
"previousState": null,
"restartCount": 0
},
"livenessProbe": null,
"name": "loadtest",
"ports": [],
"readinessProbe": null,
"resources": {
"limits": null,
"requests": {
"cpu": 4.0,
"gpu": null,
"memoryInGb": 1.0
}
},
"volumeMounts": null
}
],
"diagnostics": null,
"dnsConfig": null,
"id": "/subscriptions/1199b626-a317-4559-9289-caba7859ee88/resourceGroups/aksworkshop/providers/Microsoft.ContainerInstance/containerGroups/loadtest",
"identity": null,
"imageRegistryCredentials": null,
"instanceView": {
"events": [],
"state": "Running"
},
"ipAddress": null,
"location": "koreacentral",
"name": "loadtest",
"networkProfile": null,
"osType": "Linux",
"provisioningState": "Succeeded",
"resourceGroup": "aksworkshop",
"restartPolicy": "Never",
"tags": {},
"type": "Microsoft.ContainerInstance/containerGroups",
"volumes": null
}
이 명령을 몇 번 실행해야 할 수도 있다.
6월 13일 업데이트 사항
최대 500개 요청으로는 시나리오상의 10개 복제본 스케일링이 어렵다. 따라서 10만 단위 이상으로 여러번 반복해서 부하를 가해야 한다. 이 때 컨테이너 이름(loadtest)을 달리 해야 한다.
3. Horizontal Pod Autoscaler가 작동하는지 확인한다.
kubectl get hpa \
--namespace ratingsapp -w
몇 초 후에 더 많은 복제본을 배포하는 HPA 전환을 볼 수 있다. 부하를 수용하기 위해 1에서 10으로 확장된다. Ctrl-C를 사용하여 확인을 중지한다.
kim@Azure:~$ kubectl get hpa --namespace ratingsapp -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
ratings-api Deployment/ratings-api 0%/30% 1 10 1 72s
ratings-api Deployment/ratings-api 57%/30% 1 10 1 2m18s
ratings-api Deployment/ratings-api 57%/30% 1 10 2 2m34s
ratings-api Deployment/ratings-api 44%/30% 1 10 2 4m19s
ratings-api Deployment/ratings-api 44%/30% 1 10 3 4m35s
ratings-api Deployment/ratings-api 37%/30% 1 10 3 5m20s
ratings-api Deployment/ratings-api 37%/30% 1 10 4 5m36s
ratings-api Deployment/ratings-api 21%/30% 1 10 4 6m22s
ratings-api Deployment/ratings-api 31%/30% 1 10 4 7m23s
ratings-api Deployment/ratings-api 18%/30% 1 10 4 8m25s
(제시한 시나리오를 따라 했지만 Replicas가 10까지 늘지는 않는다. 원인 분석 후 다시 시도해 보도록 하겠다.)
6월 13일 업데이트 사항
다음은 "-r 500"의 값을 단계적으로 증가시켜 가면서 얻어낸 결과다. 앞서 언급한대로 최대 요청값을 10만 단위 이상으로 몇 번 반복하면 쉽게 REPLICAS를 10개로 스케일링 할 수 있을 것이다.
kim@Azure:~$ kubectl get hpa \ > --namespace ratingsapp -w NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE ratings-api Deployment/ratings-api 0%/30% 1 10 1 49s ratings-api Deployment/ratings-api 0%/30% 1 10 1 5m22s ratings-api Deployment/ratings-api 88%/30% 1 10 1 5m52s ratings-api Deployment/ratings-api 88%/30% 1 10 3 6m8s ratings-api Deployment/ratings-api 71%/30% 1 10 3 6m53s ratings-api Deployment/ratings-api 71%/30% 1 10 5 7m9s ratings-api Deployment/ratings-api 16%/30% 1 10 5 7m55s ratings-api Deployment/ratings-api 19%/30% 1 10 5 8m57s ratings-api Deployment/ratings-api 16%/30% 1 10 5 9m58s ratings-api Deployment/ratings-api 42%/30% 1 10 5 11m ratings-api Deployment/ratings-api 42%/30% 1 10 7 11m ratings-api Deployment/ratings-api 16%/30% 1 10 7 12m ratings-api Deployment/ratings-api 11%/30% 1 10 7 12m ratings-api Deployment/ratings-api 28%/30% 1 10 7 13m ratings-api Deployment/ratings-api 19%/30% 1 10 7 14m ratings-api Deployment/ratings-api 25%/30% 1 10 7 15m ratings-api Deployment/ratings-api 14%/30% 1 10 7 16m ratings-api Deployment/ratings-api 9%/30% 1 10 7 17m ratings-api Deployment/ratings-api 34%/30% 1 10 7 18m ratings-api Deployment/ratings-api 34%/30% 1 10 8 19m ratings-api Deployment/ratings-api 12%/30% 1 10 8 19m ratings-api Deployment/ratings-api 14%/30% 1 10 8 20m ratings-api Deployment/ratings-api 38%/30% 1 10 8 21m ratings-api Deployment/ratings-api 38%/30% 1 10 10 22m ratings-api Deployment/ratings-api 10%/30% 1 10 10 22m ratings-api Deployment/ratings-api 7%/30% 1 10 10 23m ratings-api Deployment/ratings-api 0%/30% 1 10 10 24m
수요에 맞게 애플리케이션 크기 조정 2편에서 계속