요약: 이 문서에서는 트래픽이 최고조에 달하기 전에 KEDA와 크론 스케일러를 사용하여 워크로드를 선제적으로 확장하는 방법을 알아봅니다.
Kubernetes 클러스터를 설계할 때 다음과 같은 질문에 답해야 할 수 있습니다:
- 클러스터를 확장하는 데 얼마나 걸리나요?
- 새 파드가 생성되기까지 얼마나 기다려야 하나요?
확장에 영향을 미치는 네 가지 중요한 요소가 있습니다:
- 수평 포드 오토스케일러 반응 시간;
- 클러스터 오토스케일러 반응 시간;
- 노드 프로비저닝 시간
- 포드 생성 시간.
하나씩 살펴보겠습니다.
기본적으로, 파드의 CPU 사용량은 10초마다 kubelet에 의해 스크랩되고, 1분마다 메트릭 서버에 의해 kubelet에서 가져옵니다.
수평형 파드 오토스케일러는 30초마다 CPU 및 메모리 메트릭을 확인합니다.
메트릭이 임계값을 초과하면, 오토스케일러는 리플리카 수를 늘리고 3분 동안 뒤로 물러난 후 추가 조치를 취합니다. 최악의 경우, 파드가 추가되거나 삭제되기까지 최대 3분이 소요될 수 있지만, 평균적으로 수평형 파드 오토스케일러가 스케일링을 트리거할 때까지 1분 정도 기다려야 합니다.
클러스터 오토스케일러는 보류 중인 파드가 있는지 확인하고 클러스터의 크기를 늘립니다. 클러스터를 확장해야 한다는 것을 감지하는 데는 시간이 걸릴 수 있습니다:
- 노드 수가 100개 미만이고 포드가 3000개인 클러스터에서 최대 30초, 평균 지연 시간은 약 5초 또는
- 100개 이상의 노드가 있는 클러스터에서 최대 60초의 지연 시간, 평균 지연 시간은 약 15초입니다.
리노드에서 노드 프로비저닝은 일반적으로 클러스터 오토스케일러가 트리거되는 시점부터 API 를 트리거하는 시점부터 새로 생성된 노드에서 파드를 스케줄링할 수 있는 시점까지 보통 3분 정도 걸립니다.
요약하자면, 작은 클러스터를 사용하면 다음과 같은 이점이 있습니다:
```
HPA delay: 1m +
CA delay: 0m30s +
Cloud provider: 4m +
Container runtime: 0m30s +
=========================
Total 6m
```
노드가 100개가 넘는 클러스터의 경우 총 지연 시간이 6분 30초가 될 수 있습니다... 꽤 긴 시간인데, 어떻게 해결할 수 있을까요?
워크로드를 선제적으로 확장하거나 트래픽 패턴을 잘 알고 있다면 미리 확장할 수 있습니다.
KEDA를 통한 선제적 확장
예측 가능한 패턴으로 트래픽을 처리하는 경우, 피크가 오기 전에 워크로드(및 노드)를 확장하고 트래픽이 감소하면 규모를 축소하는 것이 합리적입니다.
쿠버네티스는 날짜나 시간에 따라 워크로드를 확장하는 메커니즘을 제공하지 않으므로, 이 부분에서는 쿠버네티스 이벤트 기반 오토스케일러인 KEDA를사용하겠습니다.
KEDA는 세 가지 구성 요소로 이루어진 오토스케일러입니다:
- 스케일러;
- 메트릭 어댑터; 그리고
- 컨트롤러입니다.
헬름으로 KEDA를 설치할 수 있습니다 :
```bash
$ helm repo add kedacore https://kedacore.github.io/charts
$ helm install keda kedacore/keda
```
이제 Prometheus KEDA가 설치되면 배포를 만들어 보겠습니다.
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: podinfo
spec:
replicas: 1
selector:
matchLabels:
app: podinfo
template:
metadata:
labels:
app: podinfo
spec:
containers:
- name: podinfo
image: stefanprodan/podinfo
다음을 사용하여 클러스터에 리소스를 제출할 수 있습니다.
```bash
$ kubectl apply -f deployment.yaml
```
KEDA는 기존의 수평형 파드 오토스케일러 위에 작동하며, ScaleObject라는 사용자 정의 리소스 정의로 감싸고 있다.
다음 ScaledObject는 크론 스케일러를 사용하여 복제본 수를 변경해야 하는 시간 창을 정의합니다:
```yaml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: cron-scaledobject
namespace: default
spec:
maxReplicaCount: 10
minReplicaCount: 1
scaleTargetRef:
name: podinfo
triggers:
- type: cron
metadata:
timezone: Europe/London
start: 23 * * * *
end: 28 * * * *
desiredReplicas: "5"
```
다음을 사용하여 객체를 제출할 수 있습니다.
```bash
$ kubectl apply -f scaled-object.yaml
```
다음에는 어떻게 되나요? 아무 일도 일어나지 않습니다. 자동 스케일링은 다음 사이에만 트리거됩니다. 23 * * * *
그리고 28 * * * *
. 의 도움으로 크론 구루로 번역할 수 있습니다:
- 23분부터 시작합니다(예: 2:23, 3:23 등).
- 28분(예: 2:28, 3:28 등)에 정지합니다.
시작 날짜까지 기다리면 복제본 수가 5개로 늘어나는 것을 확인할 수 있습니다.
28분이 지나면 숫자가 다시 1로 돌아가나요? 예, 자동 스케일러는 다음에서 지정한 복제본 수로 돌아갑니다. minReplicaCount
.
간격 중 하나 사이에서 복제본 수를 늘리면 어떻게 되나요? 23분에서 28분 사이에 배포를 10개의 복제본으로 확장하면 KEDA가 변경 사항을 덮어쓰고 개수를 설정합니다. 28분 후에 동일한 실험을 반복하면 복제본 수가 10개로 설정됩니다. 이제 이론을 이해했으니 몇 가지 실제 사용 사례를 살펴보겠습니다.
근무 시간 중 축소
근무 시간 동안 활성화되어야 하고 밤에는 꺼야 하는 개발 환경에 배포가 있습니다.
다음 ScaledObject를 사용할 수 있습니다:
```yaml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: cron-scaledobject
namespace: default
spec:
maxReplicaCount: 10
minReplicaCount: 0
scaleTargetRef:
name: podinfo
triggers:
- type: cron
metadata:
timezone: Europe/London
start: 0 9 * * *
end: 0 17 * * *
desiredReplicas: "10"
```
기본 복제본 수는 0이지만 근무 시간(오전 9시부터 오후 5시까지) 동안에는 복제본 수가 10으로 확장됩니다.
스케일링된 개체를 확장하여 주말을 제외할 수도 있습니다:
```yaml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: cron-scaledobject
namespace: default
spec:
maxReplicaCount: 10
minReplicaCount: 0
scaleTargetRef:
name: podinfo
triggers:
- type: cron
metadata:
timezone: Europe/London
start: 0 9 * * 1-5
end: 0 17 * * 1-5
desiredReplicas: "10"
```
이제 워크로드는 월요일부터 금요일까지 9시부터 5시까지만 활성화됩니다. 여러 트리거를 결합할 수 있으므로 예외를 포함할 수도 있습니다.
주말 동안 축소
예를 들어 수요일에 워크로드를 더 오래 활성 상태로 유지하려는 경우 다음과 같은 정의를 사용할 수 있습니다:
```yaml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: cron-scaledobject
namespace: default
spec:
maxReplicaCount: 10
minReplicaCount: 0
scaleTargetRef:
name: podinfo
triggers:
- type: cron
metadata:
timezone: Europe/London
start: 0 9 * * 1-5
end: 0 17 * * 1-5
desiredReplicas: "10"
- type: cron
metadata:
timezone: Europe/London
start: 0 17 * * 3
end: 0 21 * * 3
desiredReplicas: "10"
```
이 정의에서 워크로드는 오전 9시부터 오후 9시까지 운영되는 수요일을 제외하고 월요일부터 금요일까지 9시부터 5시 사이에 활성화됩니다.
요약
KEDA 크론 오토스케일러를 사용하면 워크로드를 확장/축소할 시간 범위를 정의할 수 있습니다.
이렇게 하면 트래픽이 급증하기 전에 클러스터 오토스케일러를 미리 트리거하여 파드를 확장할 수 있습니다.
이 글에서 배웠습니다:
- 클러스터 오토스케일러의 작동 방식.
- 수평으로 확장하고 클러스터에 노드를 추가하는 데 걸리는 시간입니다.
- KEDA를 사용하여 크론 표현식을 기반으로 앱을 확장하는 방법.
자세히 알아보고 싶으신가요? Akamai 클라우드 컴퓨팅 서비스와의 파트너십을 통해 진행되는 웨비나에 등록하여 실제 사례를 확인해 보세요.
내용