Merge pull request #31176 from jihoon-seo/220103_Update_outdated_M71
[ko] Update outdated files in dev-1.23-ko.1 (M71-M82)
This commit is contained in:
@@ -4,42 +4,59 @@
|
||||
|
||||
|
||||
|
||||
title: Horizontal Pod Autoscaler 연습
|
||||
title: HorizontalPodAutoscaler 연습
|
||||
content_type: task
|
||||
weight: 100
|
||||
min-kubernetes-server-version: 1.23
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
|
||||
Horizontal Pod Autoscaler는
|
||||
CPU 사용량(또는 베타 지원의 다른 애플리케이션 지원 메트릭)을 관찰하여
|
||||
레플리케이션 컨트롤러, 디플로이먼트, 레플리카셋(ReplicaSet) 또는 스테이트풀셋(StatefulSet)의 파드 개수를 자동으로 스케일한다.
|
||||
[HorizontalPodAutoscaler](/ko/docs/tasks/run-application/horizontal-pod-autoscale/)(약어: HPA)는
|
||||
워크로드 리소스(예: {{< glossary_tooltip text="디플로이먼트" term_id="deployment" >}} 또는
|
||||
{{< glossary_tooltip text="스테이트풀셋" term_id="statefulset" >}})를
|
||||
자동으로 업데이트하며,
|
||||
워크로드의 크기를 수요에 맞게
|
||||
자동으로 스케일링하는 것을 목표로 한다.
|
||||
|
||||
이 문서는 php-apache 서버를 대상으로 Horizontal Pod Autoscaler를 동작해보는 예제이다.
|
||||
Horizontal Pod Autoscaler 동작과 관련된 더 많은 정보를 위해서는
|
||||
[Horizontal Pod Autoscaler 사용자 가이드](/ko/docs/tasks/run-application/horizontal-pod-autoscale/)를 참고하기 바란다.
|
||||
수평 스케일링은 부하 증가에 대해
|
||||
{{< glossary_tooltip text="파드" term_id="pod" >}}를 더 배치하는 것을 뜻한다.
|
||||
이는 _수직_ 스케일링(쿠버네티스에서는,
|
||||
해당 워크로드를 위해 이미 실행 중인 파드에
|
||||
더 많은 자원(예: 메모리 또는 CPU)를 할당하는 것)과는 다르다.
|
||||
|
||||
부하량이 줄어들고, 파드의 수가 최소 설정값 이상인 경우,
|
||||
HorizontalPodAutoscaler는 워크로드 리소스(디플로이먼트, 스테이트풀셋,
|
||||
또는 다른 비슷한 리소스)에게 스케일 다운을 지시한다.
|
||||
|
||||
이 문서는 예제 웹 앱의 크기를 자동으로 조절하도록
|
||||
HorizontalPodAutoscaler를 설정하는 예시를 다룬다.
|
||||
이 예시 워크로드는 PHP 코드를 실행하는 아파치 httpd이다.
|
||||
|
||||
## {{% heading "prerequisites" %}}
|
||||
|
||||
이 예제는 버전 1.2 또는 이상의 쿠버네티스 클러스터와 kubectl을 필요로 한다.
|
||||
[메트릭 서버](https://github.com/kubernetes-sigs/metrics-server) 모니터링을 클러스터에 배포하여
|
||||
[메트릭 API](https://github.com/kubernetes/metrics)를 통해 메트릭을 제공해야 한다.
|
||||
Horizontal Pod Autoscaler가 메트릭을 수집할때 해당 API를 사용한다. 메트릭-서버를 배포하는 방법에 대해 배우려면,
|
||||
[메트릭-서버 문서](https://github.com/kubernetes-sigs/metrics-server#deployment)를 참고한다.
|
||||
{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} 이전 버전의
|
||||
쿠버네티스를 사용하고 있다면, 해당 버전의 문서를
|
||||
참고한다([사용 가능한 문서의 버전](/ko/docs/home/supported-doc-versions/) 참고).
|
||||
|
||||
Horizontal Pod Autoscaler에 다양한 자원 메트릭을 적용하고자 하는 경우,
|
||||
버전 1.6 또는 이상의 쿠버네티스 클러스터와 kubectl를 사용해야 한다. 사용자 정의 메트릭을 사용하기 위해서는, 클러스터가
|
||||
사용자 정의 메트릭 API를 제공하는 API 서버와 통신할 수 있어야 한다.
|
||||
마지막으로 쿠버네티스 오브젝트와 관련이 없는 메트릭을 사용하는 경우,
|
||||
버전 1.10 또는 이상의 쿠버네티스 클러스터와 kubectl을 사용해야 하며, 외부
|
||||
메트릭 API와 통신이 가능해야 한다.
|
||||
자세한 사항은 [Horizontal Pod Autoscaler 사용자 가이드](/ko/docs/tasks/run-application/horizontal-pod-autoscale/#사용자-정의-메트릭을-위한-지원)를 참고하길 바란다.
|
||||
이 예제를 실행하기 위해, 클러스터에 [Metrics Server](https://github.com/kubernetes-sigs/metrics-server#readme)가
|
||||
배포 및 구성되어 있어야 한다. 쿠버네티스 Metrics Server는 클러스터의
|
||||
{{<glossary_tooltip term_id="kubelet" text="kubelet">}}으로부터
|
||||
리소스 메트릭을 수집하고, 수집한 메트릭을
|
||||
[쿠버네티스 API](/ko/docs/concepts/overview/kubernetes-api/)를 통해 노출시키며,
|
||||
메트릭 수치를 나타내는 새로운 종류의 리소스를 추가하기 위해
|
||||
[APIService](/ko/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/)를 사용할 수 있다.
|
||||
|
||||
Metrics Server를 실행하는 방법을 보려면
|
||||
[metrics-server 문서](https://github.com/kubernetes-sigs/metrics-server#deployment)를 참고한다.
|
||||
|
||||
<!-- steps -->
|
||||
|
||||
## php-apache 서버 구동 및 노출
|
||||
|
||||
Horizontal Pod Autoscaler 시연을 위해 php-apache 이미지를 맞춤 제작한 Docker 이미지를 사용한다. Dockerfile은 다음과 같다.
|
||||
HorizontalPodAutoscaler 예시에서,
|
||||
먼저 도커 허브의 `php-apache` 이미지를 베이스로 하는 커스텀 컨테이너 이미지를 만들어 시작점으로 삼을 것이다.
|
||||
`Dockerfile`은 미리 준비되어 있으며, 내용은 다음과 같다.
|
||||
|
||||
```dockerfile
|
||||
FROM php:5-apache
|
||||
@@ -47,7 +64,8 @@ COPY index.php /var/www/html/index.php
|
||||
RUN chmod a+rx index.php
|
||||
```
|
||||
|
||||
index.php는 CPU 과부하 연산을 수행한다.
|
||||
아래의 코드는 CPU 과부하 연산을 수행하는 간단한 `index.php` 페이지를 정의하며,
|
||||
이를 이용해 클러스터에 부하를 시뮬레이트한다.
|
||||
|
||||
```php
|
||||
<?php
|
||||
@@ -59,12 +77,13 @@ index.php는 CPU 과부하 연산을 수행한다.
|
||||
?>
|
||||
```
|
||||
|
||||
첫 번째 단계로, 다음 구성을 사용해서 실행 중인 이미지의 디플로이먼트를
|
||||
시작하고 서비스로 노출시킨다.
|
||||
컨테이너 이미지를 만들었다면,
|
||||
방금 만든 이미지로부터 컨테이너를 실행하는 디플로이먼트를 시작하고, 다음의 매니페스트를 사용하여 디플로이먼트를
|
||||
{{< glossary_tooltip term_id="service" text="서비스">}}로 노출한다.
|
||||
|
||||
{{< codenew file="application/php-apache.yaml" >}}
|
||||
|
||||
다음의 명령어를 실행한다.
|
||||
이를 위해, 다음의 명령어를 실행한다.
|
||||
|
||||
```shell
|
||||
kubectl apply -f https://k8s.io/examples/application/php-apache.yaml
|
||||
@@ -75,16 +94,27 @@ deployment.apps/php-apache created
|
||||
service/php-apache created
|
||||
```
|
||||
|
||||
## Horizontal Pod Autoscaler 생성
|
||||
## HorizontalPodAutoscaler 생성 {#create-horizontal-pod-autoscaler}
|
||||
|
||||
이제 서비스가 동작중이므로,
|
||||
[kubectl autoscale](/docs/reference/generated/kubectl/kubectl-commands#autoscale)를 사용하여 오토스케일러를 생성한다.
|
||||
다음 명령어는 첫 번째 단계에서 만든 php-apache 디플로이먼트 파드의 개수를
|
||||
1부터 10 사이로 유지하는 Horizontal Pod Autoscaler를 생성한다.
|
||||
간단히 얘기하면, HPA는 (디플로이먼트를 통한) 평균 CPU 사용량을 50%로 유지하기 위하여 레플리카의 개수를 늘리고 줄인다.
|
||||
kubectl run으로 각 파드는 200 밀리코어를 요청하므로,
|
||||
여기서 말하는 평균 CPU 사용은 100 밀리코어를 말한다.
|
||||
이에 대한 자세한 알고리즘은 [여기](/ko/docs/tasks/run-application/horizontal-pod-autoscale/#알고리즘-세부-정보)를 참고하기 바란다.
|
||||
이제 서비스가 동작중이므로,
|
||||
`kubectl`을 사용하여 오토스케일러를 생성한다. 이를 위해
|
||||
[kubectl autoscale](/docs/reference/generated/kubectl/kubectl-commands#autoscale) 서브커맨드를 사용할 수 있다.
|
||||
|
||||
아래에서는 첫 번째 단계에서 만든 php-apache
|
||||
디플로이먼트 파드의 개수를 1부터 10 사이로 유지하는
|
||||
Horizontal Pod Autoscaler를 생성하는 명령어를 실행할 것이다.
|
||||
|
||||
간단히 이야기하면, HPA {{<glossary_tooltip text="컨트롤러" term_id="controller">}}는
|
||||
평균 CPU 사용량을 50%로 유지하기 위해 (디플로이먼트를 업데이트하여) 레플리카의 개수를 늘리고 줄인다.
|
||||
그러면 디플로이먼트는 레플리카셋을 업데이트하며(이는 모든 쿠버네티스 디플로이먼트의 동작 방식 중 일부이다),
|
||||
레플리카셋은 자신의 `.spec` 필드의 변경 사항에 따라 파드를 추가하거나 제거한다.
|
||||
|
||||
`kubectl run`으로 각 파드는 200 밀리코어를 요청하므로, 평균 CPU 사용은 100 밀리코어이다.
|
||||
알고리즘에 대한 세부 사항은
|
||||
[알고리즘 세부 정보](/ko/docs/tasks/run-application/horizontal-pod-autoscale/#알고리즘-세부-정보)를 참고한다.
|
||||
|
||||
|
||||
HorizontalPodAutoscaler를 생성한다.
|
||||
|
||||
```shell
|
||||
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
|
||||
@@ -94,47 +124,64 @@ kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
|
||||
horizontalpodautoscaler.autoscaling/php-apache autoscaled
|
||||
```
|
||||
|
||||
실행 중인 오토스케일러의 현재 상태를 확인해본다.
|
||||
다음을 실행하여, 새로 만들어진 HorizontalPodAutoscaler의 현재 상태를 확인할 수 있다.
|
||||
|
||||
```shell
|
||||
# "hpa" 또는 "horizontalpodautoscaler" 둘 다 사용 가능하다.
|
||||
kubectl get hpa
|
||||
```
|
||||
|
||||
출력은 다음과 같다.
|
||||
```
|
||||
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
|
||||
php-apache Deployment/php-apache/scale 0% / 50% 1 10 1 18s
|
||||
```
|
||||
|
||||
아직 서버로 어떠한 요청도 하지 않았기 때문에, 현재 CPU 소비는 0%임을 확인할 수 있다.
|
||||
(``TARGET``은 디플로이먼트에 의해 제어되는 파드들의 평균을 나타낸다)
|
||||
(HorizontalPodAutoscalers 이름이 다르다면, 이미 기존에 존재하고 있었다는 뜻이며,
|
||||
보통은 문제가 되지 않는다.)
|
||||
|
||||
## 부하 증가
|
||||
아직 서버로 요청을 보내는 클라이언트가 없기 때문에, 현재 CPU 사용량이 0%임을 확인할 수 있다.
|
||||
(``TARGET`` 열은 디플로이먼트에 의해 제어되는 파드들의 평균을 나타낸다)
|
||||
|
||||
이번에는 부하가 증가함에 따라 오토스케일러가 어떻게 반응하는지를 살펴볼 것이다. 먼저 컨테이너를 하나 실행하고, php-apache 서비스에 무한루프의 쿼리를 전송한다(다른 터미널을 열어 수행하기 바란다).
|
||||
## 부하 증가시키기 {#increase-load}
|
||||
|
||||
다음으로, 부하가 증가함에 따라 오토스케일러가 어떻게 반응하는지를 살펴볼 것이다.
|
||||
이를 위해, 클라이언트 역할을 하는 다른 파드를 실행할 것이다.
|
||||
클라이언트 파드 안의 컨테이너가 php-apache 서비스에 쿼리를 보내는 무한 루프를 실행한다.
|
||||
|
||||
```shell
|
||||
# 부하 생성을 유지하면서 나머지 스텝을 수행할 수 있도록,
|
||||
# 다음의 명령을 별도의 터미널에서 실행한다.
|
||||
kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
|
||||
```
|
||||
|
||||
실행 후, 약 1분 정도 후에 CPU 부하가 올라가는 것을 볼 수 있다.
|
||||
|
||||
이제 아래 명령을 실행한다.
|
||||
```shell
|
||||
# 준비가 되면, 관찰을 마치기 위해 Ctrl+C를 누른다.
|
||||
kubectl get hpa
|
||||
```
|
||||
|
||||
1분 쯤 지나면, 다음과 같이 CPU 부하가 올라간 것을 볼 수 있다.
|
||||
|
||||
```
|
||||
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
|
||||
php-apache Deployment/php-apache/scale 305% / 50% 1 10 1 3m
|
||||
```
|
||||
|
||||
CPU 소비가 305%까지 증가하였다.
|
||||
결과적으로, 디플로이먼트의 레플리카 개수는 7개까지 증가하였다.
|
||||
그리고 다음과 같이 레플리카의 수가 증가한 것도 볼 수 있다.
|
||||
```
|
||||
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
|
||||
php-apache Deployment/php-apache/scale 305% / 50% 1 10 7 3m
|
||||
```
|
||||
|
||||
CPU 사용률이 305%까지 증가하였다.
|
||||
결과적으로, 디플로이먼트의 레플리카 개수가 7개까지 증가하였다.
|
||||
|
||||
```shell
|
||||
kubectl get deployment php-apache
|
||||
```
|
||||
|
||||
HorizontalPodAutoscaler를 조회했을 때와 동일한 레플리카 수를 확인할 수 있다.
|
||||
```
|
||||
NAME READY UP-TO-DATE AVAILABLE AGE
|
||||
php-apache 7/7 7 7 19m
|
||||
@@ -146,24 +193,27 @@ php-apache 7/7 7 7 19m
|
||||
최종 레플리카의 개수는 본 예제와 다를 수 있다.
|
||||
{{< /note >}}
|
||||
|
||||
## 부하 중지
|
||||
## 부하 발생 중지하기 {#stop-load}
|
||||
|
||||
본 예제를 마무리하기 위해 부하를 중단시킨다.
|
||||
|
||||
`busybox` 컨테이너를 띄운 터미널에서,
|
||||
`busybox` 파드를 띄운 터미널에서,
|
||||
`<Ctrl> + C`로 부하 발생을 중단시킨다.
|
||||
|
||||
그런 다음 (몇 분 후에) 결과를 확인한다.
|
||||
|
||||
```shell
|
||||
kubectl get hpa
|
||||
# 준비가 되면, 관찰을 마치기 위해 Ctrl+C를 누른다.
|
||||
kubectl get hpa php-apache --watch
|
||||
```
|
||||
|
||||
출력은 다음과 같다.
|
||||
```
|
||||
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
|
||||
php-apache Deployment/php-apache/scale 0% / 50% 1 10 1 11m
|
||||
```
|
||||
|
||||
디플로이먼트도 스케일 다운 했음을 볼 수 있다.
|
||||
```shell
|
||||
kubectl get deployment php-apache
|
||||
```
|
||||
@@ -173,7 +223,7 @@ NAME READY UP-TO-DATE AVAILABLE AGE
|
||||
php-apache 1/1 1 1 27m
|
||||
```
|
||||
|
||||
CPU 사용량은 0으로 떨어졌고, HPA는 레플리카의 개수를 1로 낮췄다.
|
||||
CPU 사용량이 0으로 떨어져서, HPA가 자동으로 레플리카의 개수를 1로 줄였다.
|
||||
|
||||
{{< note >}}
|
||||
레플리카 오토스케일링은 몇 분 정도 소요된다.
|
||||
@@ -184,9 +234,9 @@ CPU 사용량은 0으로 떨어졌고, HPA는 레플리카의 개수를 1로 낮
|
||||
## 다양한 메트릭 및 사용자 정의 메트릭을 기초로한 오토스케일링
|
||||
|
||||
`php-apache` 디플로이먼트를 오토스케일링할 때,
|
||||
`autoscaling/v2beta2` API 버전을 사용하여 추가적인 메트릭을 제공할 수 있다.
|
||||
`autoscaling/v2` API 버전을 사용하여 추가적인 메트릭을 제공할 수 있다.
|
||||
|
||||
첫 번째로, `autoscaling/v2beta2` 형식으로 HorizontalPodAutoscaler YAML 파일을 생성한다.
|
||||
첫 번째로, `autoscaling/v2` 형식으로 HorizontalPodAutoscaler YAML 파일을 생성한다.
|
||||
|
||||
```shell
|
||||
kubectl get hpa php-apache -o yaml > /tmp/hpa-v2.yaml
|
||||
@@ -195,7 +245,7 @@ kubectl get hpa php-apache -o yaml > /tmp/hpa-v2.yaml
|
||||
에디터로 `/tmp/hpa-v2.yaml` 파일을 열면, 다음과 같은 YAML을 확인할 수 있다.
|
||||
|
||||
```yaml
|
||||
apiVersion: autoscaling/v2beta2
|
||||
apiVersion: autoscaling/v2
|
||||
kind: HorizontalPodAutoscaler
|
||||
metadata:
|
||||
name: php-apache
|
||||
@@ -287,7 +337,7 @@ HorizontalPodAutoscaler는 각 메트릭에 대해 제안된 레플리카 개수
|
||||
`kubectl edit` 명령어를 이용하여 다음과 같이 정의를 업데이트 할 수 있다.
|
||||
|
||||
```yaml
|
||||
apiVersion: autoscaling/v2beta2
|
||||
apiVersion: autoscaling/v2
|
||||
kind: HorizontalPodAutoscaler
|
||||
metadata:
|
||||
name: php-apache
|
||||
@@ -411,7 +461,7 @@ object:
|
||||
|
||||
## 부록: Horizontal Pod Autoscaler 상태 조건
|
||||
|
||||
HorizontalPodAutoscaler의 `autoscaling/v2beta2` 형식을 사용하면,
|
||||
HorizontalPodAutoscaler의 `autoscaling/v2` 형식을 사용하면,
|
||||
HorizontalPodAutoscaler에서 쿠버네티스가 설정한 *상태 조건* 을 확인할 수 있다.
|
||||
이 상태 조건들은 HorizontalPodAutoscaler가 스케일을 할 수 있는지,
|
||||
어떤 방식으로든 제한되어 있는지 여부를 나타낸다.
|
||||
@@ -449,12 +499,12 @@ Events:
|
||||
백 오프 관련 조건으로 스케일링이 방지되는지 여부를 나타낸다.
|
||||
두 번째 `ScalingActive`는 HPA가 활성화되어 있는지(즉 대상 레플리카 개수가 0이 아닌지),
|
||||
원하는 스케일을 계산할 수 있는지 여부를 나타낸다. 만약 `False` 인 경우,
|
||||
일반적으로 메트릭을 가져오는데 문제가 있다.
|
||||
일반적으로 메트릭을 가져오는 데 문제가 있다.
|
||||
마지막으로, 마지막 조건인 `ScalingLimited`는
|
||||
원하는 스케일 한도가 HorizontalPodAutoscaler의 최대/최소값으로 제한돼있음을 나타낸다.
|
||||
이는 HorizontalPodAutoscaler에서 레플리카의 개수 제한을 최대/최소값으로 올리거나 낮추려는 것이다.
|
||||
|
||||
## 부록: 수량
|
||||
## 수량
|
||||
|
||||
HorizontalPodAutoscaler와 메트릭 API에서 모든 메트릭은
|
||||
쿠버네티스에서 사용하는
|
||||
@@ -464,16 +514,16 @@ HorizontalPodAutoscaler와 메트릭 API에서 모든 메트릭은
|
||||
일반적으로 수량을 밀리단위로 반환한다.
|
||||
10진수로 표현했을때, `1`과 `1500m` 또는 `1`과 `1.5` 로 메트릭 값을 나타낼 수 있다.
|
||||
|
||||
## 부록: 다른 가능한 시나리오
|
||||
## 다른 가능한 시나리오
|
||||
|
||||
### 명시적으로 오토스케일러 만들기
|
||||
|
||||
HorizontalPodAutoscaler를 생성하기 위해 `kubectl autoscale` 명령어를 사용하지 않고,
|
||||
명시적으로 다음 파일을 사용하여 만들 수 있다.
|
||||
명시적으로 다음 매니페스트를 사용하여 만들 수 있다.
|
||||
|
||||
{{< codenew file="application/hpa/php-apache.yaml" >}}
|
||||
|
||||
다음 명령어를 실행하여 오토스케일러를 생성할 것이다.
|
||||
다음으로, 아래의 명령어를 실행하여 오토스케일러를 생성한다.
|
||||
|
||||
```shell
|
||||
kubectl create -f https://k8s.io/examples/application/hpa/php-apache.yaml
|
||||
|
||||
Reference in New Issue
Block a user