04-12 06:11
반응형
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
반응형