클러스터 에이전트 커스텀 및 외부 메트릭을 사용하여 오토스케일링

개요

Kubernetes 버전 1.2에 도입된 수평 파드 오토스케일링은 CPU와 같은 기본 메트릭의 오토스케일링을 허용하지만, 애플리케이션과 함께 실행되기 위해서는 metrics-server라는 리소스가 필요합니다. Kubernetes 버전 1.6에서는 커스텀 메트릭의 오토스케일링이 가능합니다.

커스텀 메트릭은 사용자가 정의하며 클러스터 내에서 수집됩니다. Kubernetes 버전 1.10부터는 외부 메트릭에 대한 지원이 도입되어 Datadog에서 수집한 메트릭과 같이 클러스터 외부에서 모든 메트릭을 오토스케일링할 수 있습니다.

먼저 클러스터 에이전트를 외부 메트릭 공급자로 등록해야 합니다. 그런 다음 클러스터 에이전트가 제공한 메트릭을 사용하도록 HPA를 조정합니다.

버전 1.0.0부터 현재 Datadog 클러스터 에이전트의 커스텀 메트릭 서버는 외부 메트릭을 위한 외부 메트릭 공급자 인터페이스를 구현합니다. 이 페이지에서는 이를 설정하는 방법과 Datadog 메트릭을 기반으로 Kubernetes 워크로드를 오토스케일링하는 방법을 소개합니다.

설정

요건

  1. Kubernetes 버전 1.10 이상: API 서버에 외부 메트릭 공급자 리소스를 등록해야 합니다.
  2. Kubernetes 집합 레이어를 활성화합니다.
  3. 유효한 Datadog API 키 ** 및** 애플리케이션 키입니다.

설치

외부 메트릭 서버를 클러스터 에이전트와 함께 Helm에서 활성화하려면 values.yaml 파일을 다음 설정으로 업데이트합니다. 올바른 Datadog API 키, 애플리케이션 키를 제공하고 clusterAgent.metricsProvider.enabledtrue로 설정합니다. 그런 다음 Datadog Helm 차트를 다시 배포합니다:

datadog:
  apiKey: <DATADOG_API_KEY>
  appKey: <DATADOG_APP_KEY>
  #(...)

clusterAgent:
  enabled: true
  # metricsProvider가 Datadog의 메트릭을 기반으로 확장할 수 있도록 설정합니다.
  metricsProvider:
    # clusterAgent.metricsProvider.enabled
    # 메트릭 공급자를 활성화하려면 이 값을 true로 설정합니다.
    enabled: true

필요한 RBAC 설정을 자동으로 업데이트하고 Kubernetes가 사용할 해당 ServiceAPIService를 설정합니다.

api-key 또는 app-key 데이터 키가 포함된 사전 생성된 Secrets 이름과 설정 datadog.apiKeyExistingSecretdatadog.appKeyExistingSecret를 참조하여 키를 설정할 수도 있습니다.

Datadog Operator에서 관리하는 클러스터 에이전트에서 외부 메트릭 서버를 사용하도록 설정하려면 먼저 Datadog Operator를 설정한 다음 유효한 Datadog API 키, 애플리케이션 키를 제공하고 DatadogAgent 커스텀 리소스에서 features.externalMetricsServer.enabledtrue로 설정합니다:

apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
  name: datadog
spec:
  global:
    credentials:
      apiKey: <DATADOG_API_KEY>
      appKey: <DATADOG_API_KEY>

  features:
    externalMetricsServer:
      enabled: true

Operator는 필요한 RBAC 설정을 자동으로 업데이트하고 Kubernetes가 사용할 해당 ServiceAPIService을 설정합니다.

미리 생성된 Secrets의 이름과 Datadog API 및 애플리케이션 키를 저장하는 데이터 키를 참조하여 키를 설정할 수도 있습니다.

apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
  name: datadog
spec:
  global:
    credentials:
      apiSecret:
        secretName: <SECRET_NAME>
        keyName: <KEY_FOR_DATADOG_API_KEY>
      appSecret:
        secretName: <SECRET_NAME>
        keyName: <KEY_FOR_DATADOG_APP_KEY>

  features:
    externalMetricsServer:
      enabled: true

커스텀 메트릭 서버

커스텀 메트릭 서버를 사용하려면 먼저 지침서에 따라 클러스터 내에서 Datadog 클러스터 에이전트를 설정합니다. 기본 배포가 성공적인지 확인한 후 다음 단계에서 Datadog 클러스터 에이전트에 대한 Deployment 매니페스트를 편집합니다:

  1. DD_EXTERNAL_METRICS_PROVIDER_ENABLED 환경 변수를 true로 설정합니다.
  2. 환경 변수 DD_APP_KEYDD_API_KEY 모두가 설정되어 있는지 확인합니다.
  3. DD_SITE 환경 변수가 Datadog 사이트로 설정되어 있는지 확인하세요: . 기본값은 US 사이트datadoghq.com로 설정됩니다.

외부 메트릭 공급자 서비스를 등록합니다

Datadog 클러스터 에이전트가 실행 중이면 몇 가지 추가 RBAC 정책을 적용하고 Service를 설정하여 해당 요청을 라우팅합니다.

  1. 다음 custom-metric-server.yaml 매니페스트를 사용하여 포트 8443를 노출하는 datadog-custom-metrics-server라는 이름의 Service를 만듭니다:

    kind: Service
    apiVersion: v1
    metadata:
      name: datadog-custom-metrics-server
    spec:
      selector:
        app: datadog-cluster-agent
      ports:
      - protocol: TCP
        port: 8443
        targetPort: 8443
    

    **참고: **클러스터 에이전트는 기본적으로 포트 8443를 통해 이러한 요청을 예상합니다. 그러나 클러스터 에이전트 Deployment가 환경 변수 DD_EXTERNAL_METRICS_PROVIDER_PORT를 다른 포트 값으로 설정한 경우, ServicetargetPort를 이에 맞게 변경하세요.

    kubectl apply -f custom-metric-server.yaml를 실행하여 Service를 적용하세요

  2. rbac-hpa.yaml RBAC 규칙 파일을 다운로드합니다.

  3. 다음 파일을 적용하여 클러스터 에이전트를 외부 메트릭 공급자로 등록합니다:

    kubectl apply -f rbac-hpa.yaml
    

활성화되면 클러스터 에이전트가 HPA에 대한 메트릭을 가져올 준비가 된 것입니다. 두 가지 옵션이 있습니다:

Datadog에서는 DatadogMetric 옵션을 사용할 것을 권장합니다. 이 경우 DatadogMetric 커스텀 리소스 정의(CRD)를 배포하는 추가 단계가 필요하지만 쿼리에서 훨씬 더 많은 유연성을 제공합니다. DatadogMetric 쿼리를 사용하지 않는 경우 HPA는 클러스터 에이전트가 Datadog 메트릭 쿼리로 변환하는 기본 Kubernetes 외부 메트릭 형식을 사용합니다.

메트릭을 여러 Datadog 조직으로 이중 발송하는 경우 고가용성을 위해 클러스터 에이전트를 여러 엔드포인트에서 가져오도록 설정할 수 있습니다. 자세한 내용은 이중 발송 설명서를 참조하세요.

DatadogMetric 쿼리를 사용한 자동 확장

DatadogMetric 커스텀 리소스 정의(CRD) 및 Datadog 클러스터 에이전트 버전 1.7.0 또는 이상을 사용하여 Datadog 쿼리를 오토스케일링할 있습니다. 이 접근 방식은 보다 유연한 접근 방식이며, 앱 내에서 사용하는 정확한 Datadog 쿼리로 확장할 수 있습니다.

필수 요건

오토스케일링이 올바르게 작동하려면 커스텀 쿼리는 다음 규칙을 따라야 합니다:

  • 쿼리는 구문적으로 반드시 정확해야 합니다. 그렇지 않으면 오토스케일링에 사용되는 모든 메트릭이 새로 고침되지 않습니다(사실상 오토스케일링을 중지함).
  • 쿼리 결과는 반드시 하나의 시리즈만 출력합니다(그렇지 않으면 결과가 유효하지 않은 것으로 간주됩니다).
  • 쿼리는 null이 아닌 최소 두 개의 타임스탬프 포인트를 반환해야 합니다(단일 포인트를 반환하는 쿼리를 사용할 수 있지만, 이 경우 오토스케일링은 불완전한 포인트를 사용할 수 있습니다).

참고: 쿼리는 임의적이지만 시작 및 종료 시간은 여전히 Now() - 5 minutesNow() 기본값으로 설정되어 있습니다.

DatadogMetric CRD 설정

Helm, Datadog Operator, Daemonset을 사용하여 DatadogMetric 개체에 대한 커스텀 리소스 정의 (CRD)를 다음과 같이 Kubernetes 클러스터에 추가할 수 있습니다.

DatadogMetric CRD 사용을 활성화하려면 clusterAgent.metricsProvider.useDatadogMetricstrue로 설정하여 values.yaml Helm 설정을 업데이트합니다. 그런 다음 Datadog Helm 차트를 다시 배포합니다:

clusterAgent:
  enabled: true
  metricsProvider:
    enabled: true
    # clusterAgent.metricsProvider.useDatadogMetrics
    # 임의의 Datadog 쿼리에서 오토스케일링을 위해 DatadogMetric CRD 사용 활성화
    useDatadogMetrics: true

참고: DatadogMetric CRD를 자동으로 설치하려고 합니다. 해당 CRD가 초기 Helm 설치 전에 이미 존재하는 경우 충돌할 수 있습니다.

그러면 필요한 RBAC 파일이 자동으로 업데이트되고 클러스터 에이전트가 이러한 DatadogMetric 리소스를 통해 HPA 쿼리를 관리하도록 지시합니다.

DatadogMetric CRD 사용을 활성화하려면 DatadogAgent 커스텀 리소스를 업데이트하고 features.externalMetricsServer.useDatadogMetricstrue로 설정합니다.

kind: DatadogAgent
apiVersion: datadoghq.com/v2alpha1
metadata:
  name: datadog
spec:
  global:
    credentials:
      apiKey: <DATADOG_API_KEY>
      appKey: <DATADOG_API_KEY>
  features:
    externalMetricsServer:
      enabled: true
      useDatadogMetrics: true

관리자는 필요한 RBAC 설정을 자동으로 업데이트하고 클러스터 에이전트가 DatadogMetric 리소스를 통해 이러한 HPA 쿼리를 관리하도록 지시합니다.

DatadogMetric CRD의 사용을 활성화하려면 다음 추가 단계를 수행합니다:

  1. 클러스터에 DatadogMetric CRD를 설치합니다.

    kubectl apply -f "https://raw.githubusercontent.com/DataDog/helm-charts/master/crds/datadoghq.com_datadogmetrics.yaml"
    
  2. Datadog 클러스터 에이전트 RBAC 매니페스트 업데이트하고 DatadogMetricCRD 사용을 허용하도록 업데이트되었습니다.

    kubectl apply -f "https://raw.githubusercontent.com/DataDog/datadog-agent/master/Dockerfiles/manifests/cluster-agent-datadogmetrics/cluster-agent-rbac.yaml"
    
  3. Datadog 클러스터 에이전트 배포에서 DD_EXTERNAL_METRICS_PROVIDER_USE_DATADOGMETRIC_CRDtrue로 설정합니다.

DatadogMetric 개체 만들기

클러스터에 DatadogMetric 커스텀 리소스를 추가했으면 HPA에서 참조할 DatadogMetric 개체를 생성할 수 있습니다. 모든 HPA가 모든 DatadogMetric을 참조할 수 있지만 Datadog은 HPA와 동일한 네임스페이스에서 개체를 생성할 것을 권장합니다.

참고: 여러 개의 HPA에서 동일한 DatadogMetric을 사용할 수 있습니다.

다음 매니페스트를 사용하여 DatadogMetric를 생성할 수 있습니다:

apiVersion: datadoghq.com/v1alpha1
kind: DatadogMetric
metadata:
  name: <DATADOG_METRIC_NAME>
spec:
  query: <CUSTOM_QUERY>

DatadogMetric 개체 예시

예를 들어, nginx.net.request_per_s Datadog 메트릭을 기반으로 NGINX 배포를 오토스케일링하는DatadogMetric 개체입니다 :

apiVersion: datadoghq.com/v1alpha1
kind: DatadogMetric
metadata:
  name: nginx-requests
spec:
  query: max:nginx.net.request_per_s{kube_container_name:nginx}.rollup(60)

HPA에서 DatadogMetric 사용

클러스터 에이전트가 설정되고 DatadogMetric이 생성되면 HPA를 업데이트하여 해당 네임스페이스 및 이름과 관련된 DatadogMetric을 참조하도록 합니다. 일반적인 형식은 HPA에 대한 메트릭을 type: External로 지정하고 메트릭 이름을 datadogmetric@<NAMESPACE>:<DATADOG_METRIC_NAME>와 같이 지정합니다.

DatadogMetric을 사용한 HPA 예제

nginx-requests라는 이름의 DatadogMetric를 사용하는 HPA로, 두 개체가 네임스페이스 nginx-demo에 있다고 가정합니다.

apiVersion: autoscaling/v2 사용:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginxext
spec:
  minReplicas: 1
  maxReplicas: 3
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  metrics:
  - type: External
    external:
      metric:
        name: datadogmetric@nginx-demo:nginx-requests
      target:
        type: Value
        value: 9

apiVersion: autoscaling/v2beta1 사용:

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: nginxext
spec:
  minReplicas: 1
  maxReplicas: 3
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  metrics:
  - type: External
    external:
      metricName: datadogmetric@nginx-demo:nginx-requests
      targetValue: 9

매니페스트에서:

  • HPA는 nginx로 불리는 배포를 오토스케일링하도록 설정되어 있습니다.
  • 작성된 복제본의 최대 수는 3, 최소 수는 1입니다.
  • HPA는 nginx-demo 네임스페이스에서 DatadogMetric``nginx-requests에 의존합니다.

DatadogMetric가 HPA에 연결되면 Datadog 클러스터 에이전트는 HPA를 활성 상태로 표시합니다. 그런 다음 클러스터 에이전트는 Datadog에 쿼리를 요청하고 결과를 DatadogMetric 개체에 저장한 후 HPA에 값을 제공합니다.

DatadogMetric 쿼리 없이 오토스케일링

DatadogMetric을 사용한 오토스케일링을 원하지 않더라도 기본 Kubernetes 형식으로 HPA를 생성할 수 있습니다. 클러스터 에이전트는 HPA 형식을 Datadog 메트릭 쿼리로 변환합니다.

Datadog 클러스터 에이전트가 실행되고 서비스가 등록되면 HPA 매니페스트를 생성하고 메트릭의 type: External를 지정합니다. 그러면 HPA가 Datadog 클러스터 에이전트의 서비스에서 메트릭을 가져오도록 알립니다:

spec:
  metrics:
    - type: External
      external:
        metricName: "<METRIC_NAME>"
        metricSelector:
          matchLabels:
            <TAG_KEY>: <TAG_VALUE>

DatadogMetric이 없는 HPA 예제

apiVersion: autoscaling/v2을 사용하여 nginx.net.request_per_s Datadog 메트릭을 기반으로 NGINX 배포를 오토스케일링하는 HPA 매니페스트:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginxext
spec:
  minReplicas: 1
  maxReplicas: 3
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  metrics:
  - type: External
    external:
      metric:
        name: nginx.net.request_per_s
      target:
        type: Value
        value: 9

다음은 apiVersion: autoscaling/v2beta1를 사용한 위와 동일한 HPA 매니페스트입니다:

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: nginxext
spec:
  minReplicas: 1
  maxReplicas: 3
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  metrics:
  - type: External
    external:
      metricName: nginx.net.request_per_s
      metricSelector:
        matchLabels:
            kube_container_name: nginx
      targetValue: 9

매니페스트에서:

  • HPA는 nginx라는 배포를 오토스케일링하도록 설정되어 있습니다.
  • 작성된 복제본의 최대 수는 3, 최소 수는 1입니다.
  • 사용되는 메트릭은 nginx.net.request_per_s입니다. 범위는 kube_container_name: nginx입니다. 이 형식은 Datadog의 메트릭 형식에 해당합니다.

Kubernetes는 매 30초마다 Datadog 클러스터 에이전트에 이 메트릭의 값을 쿼리하고 필요한 경우 비례적으로 오토스케일링합니다. 고급 사용 사례의 경우 동일한 HPA에서 여러 개의 메트릭을 가질 수 있습니다. Kubernetes 수평 파드 오토스케일링에서 언급한 바와 같이 제안된 값 중 가장 큰 값이 선택된 값입니다.

마이그레이션

기존 HPA는 외부 메트릭을 사용하여 자동으로 마이그레이션됩니다.

DD_EXTERNAL_METRICS_PROVIDER_USE_DATADOGMETRIC_CRDtrue로 설정했지만 DatadogMetric를 참조하지 않는 HPA가 여전히 있는 경우 (datadogmetric@...를 통해 DatadogMetric를 참조하지 않는) 일반 구문은 계속 지원됩니다.

Datadog 클러스터 에이전트는 DatadogMetric을 수용하기 위해 자체 네임스페이스(이름은 dcaautogen-로 시작)에서 DatadogMetric 리소스를 자동으로 생성하므로 원활하게 전환할 수 있습니다.

DatadogMetric를 참조하기 위해 HPA를 나중에 마이그레이션하기로 선택하면 자동으로 생성된 리소스는 몇 시간 후에 Datadog 클러스터 에이전트에 의해 정리됩니다.

클러스터 에이전트 쿼리

클러스터 에이전트는 매 30초마다 DatadogMetric 개체에 대한 쿼리를 수행하며, 클러스터 에이전트는 수행된 메트릭 쿼리를 35개 그룹으로 배치합니다. 따라서 Datadog 메트릭 API에 대한 단일 요청에 35개의 DatadogMetric 쿼리가 포함됩니다.

클러스터 에이전트는 이러한 쿼리를 배치함으로써 쿼리를 보다 효율적으로 수행하고 속도 제한을 피할 수 있습니다.

이는 클러스터 에이전트가 35개의 DatadogMetric 개체당 시간당 약 120개의 API 요청을 수행한다는 것을 의미합니다. 추가 Kubernetes 클러스터에 DatadogMetric 개체를 추가하거나 오토스케일링 기능을 추가하면 동일한 조직 내에서 메트릭을 가져오기 위한 호출 수가 증가합니다.

또한 클러스터 에이전트는 이러한 각 메트릭 쿼리에 대해 기본적으로 지난 5분 동안의 데이터를 쿼리합니다. 이는 클러스터 에이전트가 최근 데이터를 축소하고 있는지 확인하기 위한 것입니다, 그러나 메트릭 쿼리가 클라우드 통합(AWS, Azure, GCP 등) 중 하나의 데이터에 의존하는 경우 이러한 데이터는 약간의 지연을 거쳐 가져오며 5분 간격 내에 포함되지 않습니다. 이러한 경우 클러스터 에이전트에 환경 변수를 제공하여 메트릭 쿼리에 허용되는 날짜 범위와 데이터 보관 기간을 늘리세요.

- name: DD_EXTERNAL_METRICS_PROVIDER_BUCKET_SIZE
  value: "900"
- name: DD_EXTERNAL_METRICS_PROVIDER_MAX_AGE
  value: "900"

트러블슈팅

DatadogMetric 상태

Datadog 클러스터 에이전트는 쿼리의 결과를 Datadog에 반영하기 위해 모든 DatadogMetric 리소스의 status 하위 리소스를 업데이트합니다. 이는 오류가 발생할 경우 발생하는 작업을 파악하기 위한 주요 정보 소스입니다. 다음을 실행하여 이 정보를 출력할 수 있습니다:

kubectl describe datadogmetric <RESOURCE NAME>

예시

DatadogMetricstatus부분:

status:
  conditions:
  - lastTransitionTime: "2020-06-22T14:38:21Z"
    lastUpdateTime: "2020-06-25T09:21:00Z"
    status: "True"
    type: Active
  - lastTransitionTime: "2020-06-25T09:00:00Z"
    lastUpdateTime: "2020-06-25T09:21:00Z"
    status: "True"
    type: Valid
  - lastTransitionTime: "2020-06-22T14:38:21Z"
    lastUpdateTime: "2020-06-25T09:21:00Z"
    status: "True"
    type: Updated
  - lastTransitionTime: "2020-06-25T09:00:00Z"
    lastUpdateTime: "2020-06-25T09:21:00Z"
    status: "False"
    type: Error
  currentValue: "1977.2"

네 가지 조건을 통해 DatadogMetric의 현재 상태를 파악할 수 있습니다:

  • Active: 하나 이상의 HPA가 참조하는 경우 Datadog은 DatadogMetric를 활성으로 간주합니다. 비활성화된DatadogMetrics은 API 사용을 최소화하기 위해 업데이트되지 않습니다.
  • Valid: Datadog은 연관된 쿼리에 대한 답이 유효할 때 DatadogMetric가 유효하다고 간주합니다. 잘못된 상태는 커스텀 쿼리가 의미론적으로 정확하지 않다는 것을 의미할 수 있습니다. 자세한 내용은 Error 필드를 참조하세요.
  • Updated: 이 조건은 Datadog 클러스터 에이전트가 DatadogMetric에 접근할 경우 항상 업데이트됩니다.
  • Error: DatadogMetric 처리가 오류를 발생시킬 경우 이 조건은 true이고 오류 세부 정보가 포함됩니다.

currentValue는 Datadog에서 수집되어 HPAs로 반환된 값입니다.

대상 메트릭에 대한 값 대 평균값

이 예제에서 HPA는 AverageValue 대신 Value의 타겟 유형을 사용합니다. 두 옵션 모두 지원됩니다. 이에 따라 Datadog 메트릭 쿼리를 조정하세요.

Value를 사용할 때 Datadog 메트릭 쿼리에 의해 반환된 메트릭 값은 HPA의 스케일링 결정을 위해 그대로 HPA에 제공됩니다. AverageValue를 사용할 때 반환된 메트릭 값은 현재 파드 수로 나뉩니다. 쿼리와 반환된 값을 기반으로 HPA를 확장하고자 하는 방식에 따라 <Metric Value>를 설정합니다.

apiVersion: autoscaling/v2를 사용한 Value에 대한 타겟 메트릭 설정은 다음과 같습니다:

  metrics:
  - type: External
    external:
      metric:
        name: datadogmetric@<NAMESPACE>:<DATADOG_METRIC_NAME>
      target:
        type: Value
        value: <METRIC_VALUE>

반면 AverageValue는 다음과 같습니다:

  metrics:
  - type: External
    external:
      metric:
        name: datadogmetric@<NAMESPACE>:<DATADOG_METRIC_NAME>
      target:
        type: AverageValue
        averageValue: <METRIC_VALUE>

apiVersion: autoscaling/v2beta1에 대한 각각의 옵션은 targetValuetargetAverageValue입니다.

참고 자료