02-19 04:15
반응형
250x250
Recent Posts
Recent Comments
Link
관리 메뉴

DevOps Tasks

Kubernetes HPA: Datadog CRD와 Custom Metrics를 이용한 오토스케일링 구성 본문

Kubernetes

Kubernetes HPA: Datadog CRD와 Custom Metrics를 이용한 오토스케일링 구성

데밥스 2025. 2. 18. 22:42
728x90
반응형

Datadog Cluster Agent를 활용하여 DatadogMetric CRD (`CustomResourceDefinitions`) 기반 오토스케일링을 구성하는 방법과 전체 동작 흐름을 설명합니다.

Cluster Agent는 Datadog 백엔드에서 데이터를 수집한 후, `DatadogMetric CRD`를 업데이트합니다.

이후 `HPA 컨트롤러`가 이 메트릭 데이터를 참조하여 오토스케일링 결정을 내리게 됩니다.

이를 통해 클러스터 내부에서 외부 메트릭을 활용한 유연한 자동 스케일링이 가능해집니다.


전체 동작 흐름

아래는 Cluster Agent와 `HPA`가 상호 작용하는 전체 동작 흐름입니다.

 

Datadog CRD 동작 흐름

 

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

 

 

728x90
반응형