- DevOps
- cloudnative
- aws ses
- containerorchestration
- aws
- Fargate
- SMTP
- Kubernetes
- dMarc
- JVM
- SAA-CO2
- go
- SPF
- kubernetesadmin
- CKA
- EKS
- kubernetes 클러스터 보안
- kubernetesstudyguide
- Certified Solutions Architect
- nodeaffinity
- Java
- Lambda
- DKIM
- kubernetes admission controller
- SAA-CO3
- kubernetesscheduling
- gochannel
- K8S
- 메일 인증 프로토콜
- Today
- Total
DevOps Tasks
Kubernetes HPA: Datadog CRD와 Custom Metrics를 이용한 오토스케일링 구성 본문
Datadog Cluster Agent를 활용하여 DatadogMetric CRD (`CustomResourceDefinitions`) 기반 오토스케일링을 구성하는 방법과 전체 동작 흐름을 설명합니다.
Cluster Agent는 Datadog 백엔드에서 데이터를 수집한 후, `DatadogMetric CRD`를 업데이트합니다.
이후 `HPA 컨트롤러`가 이 메트릭 데이터를 참조하여 오토스케일링 결정을 내리게 됩니다.
이를 통해 클러스터 내부에서 외부 메트릭을 활용한 유연한 자동 스케일링이 가능해집니다.
전체 동작 흐름
아래는 Cluster Agent와 `HPA`가 상호 작용하는 전체 동작 흐름입니다.
Datadog Agent 설정
datadog:
apiKeyExistingSecret: <DATADOG_API_KEY>
appKeyExistingSecret: <DATADOG_APP_KEY>
orchestratorExplorer:
enabled: true
customResources:
- argoproj.io/v1alpha1/rollouts
clusterAgent:
enabled: true
metricsProvider:
enabled: true
useDatadogMetrics: true
- `datadog.apiKeyExistingSecret` : 데이터 전송용 키
- `datadog.appKeyExistingSecret` : API 조회/설정용 키
- `datadog.orchestratorExplorer.customResources` : 기본은 `Deployment`, `StatefulSet`, `ReplicaSet`만 지원하며, Rollouts 사용 시 추가
- `clusterAgent.metricsProvider.useDatadogMetrics` : `DatadogMetric CRD`를 통한 오토스케일링 활성화
참고
`clusterAgent.metricsProvider.createReaderRbac` 옵션을 통해 `HPA`가 Cluster Agent에서 메트릭을 읽을 수 있도록 RBAC가 자동 생성되지만, 자동 생성이 되지 않는 경우 아래와 같이 수동으로 추가합니다.
RBAC 수동 설정
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: dd-datadogmetrics-get
rules:
- apiGroups: ["datadoghq.com"]
resources: ["datadogmetrics"]
verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dd-datadogmetrics-get-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: dd-datadogmetrics-get
subjects:
- kind: ServiceAccount
name: datadog-agent-cluster-agent
namespace: kube-system
DatadogMetric CRD 생성
`HPA`에서 참조할 커스텀 메트릭을 생성합니다.
아래 예시는 애플리케이션의 CPU 사용률(%)을 계산하는 쿼리를 정의합니다.
apiVersion: datadoghq.com/v1alpha1
kind: DatadogMetric
metadata:
name: cpu-metric
namespace: default
spec:
query: "(avg:kubernetes.cpu.usage.total{kube_app_name:<APP_NAME>}.rollup(avg, 60) / 1000000000) / avg:kubernetes.cpu.limits{kube_app_name:ssm-view}.rollup(avg, 60) * 100"
실행 후 상태는 다음과 같이 확인할 수 있습니다
➜ git:(main) ✗ k get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpa Rollout/<APP_NAME> 375m/70 1 3 1 45h
CustomResourceDefinitions 사용의 이점 : 맞춤형 메트릭으로 유연한 오토스케일링 구성
CRD를 설정하는 것은 필수는 아니지만, 설정하지 않을 경우 다음과 같은 유연성과 확장성을 활용하기 어렵습니다.
커스텀 쿼리 정의 (Formula)
- 기본 제공 메트릭만 사용하게 되어, 특정 애플리케이션 특성에 맞춘 정교한 계산이나 집계가 불가능합니다.
복합 메트릭 활용 (Composite Metric)
- 단일 메트릭만 활용되어 다양한 요소를 반영한 스케일링 기준을 만들기 어려워집니다.
재사용
- 각 HPA마다 기본 메트릭을 개별적으로 관리해야 하므로, 일관된 맞춤형 오토스케일링 정책을 적용하기 어렵습니다.
Warning FailedGetExternalMetric 23m (x2 over 23m)
horizontal-pod-autoscaler unable to get external metric <NAMESPACE>/datadogmetric@<NAMESPACE>:cpu-metric/nil: unable to fetch metrics from external metrics API: Internal error occurred: DatadogMetric is invalid, err: <nil>
Warning FailedComputeMetricsReplicas 23m (x2 over 23m)
horizontal-pod-autoscaler invalid metrics (1 invalid out of 1), first error is: failed to get datadogmetric@<NAMESPACE>:cpu-metric external metric value: failed to get external metric datadogmetric@<NAMESPACE>:cpu-metric: unable to get external metric <NAMESPACE>/datadogmetric@<NAMESPACE>:cpu-metric/nil: unable to fetch metrics from external metrics API: Internal error occurred: DatadogMetric is invalid, err: <nil>
주의사항
- 쿼리 문법
- 오류가 있으면 메트릭이 갱신되지 않아 오토스케일링이 중지됩니다.
- 단일 데이터 시리즈
- 쿼리 결과는 한 가지 값만 반환해야 하며, 여러 시리즈가 섞이면 기준을 정하기 어렵습니다.
- 여러 시점의 데이터
- 최소 두 개 이상의 (시간, 값) 쌍이 있어야 올바른 추세 분석이 가능합니다.
- 조회 기간 기본값
- 별도 지정하지 않으면 기본적으로 최근 5분간의 데이터를 조회합니다.
HPA 매니페스트에 DatadogMetric 적용
아래 예시는 DatadogMetric cpu-metric을 활용해 Rollout 리소스에 대해 HPA를 구성하는 방법입니다.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: hpa
namespace: default
spec:
scaleTargetRef:
apiVersion: argoproj.io/v1alpha1
kind: Rollout
name: <APP_NAME>
minReplicas: 1
maxReplicas: 3
metrics:
- type: External
external:
metric:
name: datadogmetric@<NAMESPACE>:cpu-metric
target:
type: Value
value: "70"
behavior:
scaleUp:
stabilizationWindowSeconds: 120
policies:
- type: Pods
value: 1
periodSeconds: 15
- type: Percent
value: 100
periodSeconds: 15
selectPolicy: Max
scaleDown:
stabilizationWindowSeconds: 120
policies:
- type: Pods
value: 1
periodSeconds: 30
- type: Percent
value: 50
periodSeconds: 30
selectPolicy: Min
- scaleUp: 15초마다 하나의 `Pod` 또는 현재 `Pod` 수의 최대 100%까지 증설하며, 120초 안정화 기간 적용
- scaleDown: 30초마다 하나의 `Pod` 또는 현재 `Pod` 수의 최대 50%까지 축소하며, 120초 안정화 기간 적용
HPA 상태는 다음 명령어로 확인할 수 있습니다
➜ git:(main) ✗ k get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpa Rollout/<APP_NAME> 375m/70 1 3 1 45h
'Kubernetes' 카테고리의 다른 글
[Kubernetes] EKS Fargate에서 Fluent Bit으로 CloudWatch 및 Firehose 로그 전송하기 (0) | 2025.02.09 |
---|---|
[Kubernetes] Admission Controller 란? (0) | 2025.02.09 |
Kubernetes Taints, Tolerations, Node Affinity를 활용한 최적의 Pod 스케줄링 (0) | 2024.12.28 |
AWS Fargate에서 Pod Disruption Budget(PDB)로 OS 패치 대응하기 (0) | 2024.12.03 |
[Kubernetes] AWS EKS에서 Kubernetes Pod별 보안 그룹 설정: 네트워크 보안 강화 (0) | 2024.12.03 |