DatadogPodAutoscaler(DPA)는 Datadog Kubernetes Autoscaling(DKA)을 사용하여 Kubernetes 워크로드의 오토스케일링을 가능하게 하는 Kubernetes 사용자 지정 리소스 정의(CRD)입니다. 이 가이드에서는 ArgoCD 및 GitOps 원칙을 사용하여 DatadogPodAutoscaler 리소스를 관리하고 오토스케일링 구성을 배포하는 방법을 설명합니다.
ArgoCD는 Kubernetes용 선언적 GitOps 지속적 배포 도구입니다. Kubernetes 매니페스트가 포함된 Git 리포지토리를 모니터링하고 Git에 정의된 원하는 상태와 클러스터를 동기화된 상태로 유지합니다. 이 접근 방식은 오토스케일링 인프라에 대한 버전 관리, 감사 추적 및 자동 배포를 제공합니다.
대규모 오토스케일링 활성화: 공유 정책을 사용하여 많은 워크로드 또는 네임스페이스에 오토스케일링을 배포하려면 워크로드마다 DatadogPodAutoscaler을 생성하는 대신 워크로드 또는 네임스페이스에 autoscaling.datadoghq.com/profile 레이블을 지정합니다. 자세한 내용은 Kubernetes Autoscaling 개요의 클러스터 프로필을 참조하세요.
전제 조건
시작하기 전에 다음 사항을 준비합니다.
Kubernetes 클러스터: kubectl을 사용하여 액세스할 수 있는 Kubernetes 클러스터(버전 1.20 이상)
ArgoCD 설치: 클러스터에 배포되어 있으며 CLI 또는 UI를 통해 액세스 가능한 ArgoCD
Datadog API 자격 증명: 유효한 Datadog API 키 및 애플리케이션 키
Git 리포지토리: 매니페스트를 저장할 Git 리포지토리
프로젝트 구조
이 가이드는 적절한 종속성 생성 및 배포 순서를 보장하기 위해 ArgoCD Sync Wave를 사용하는 App of Apps 패턴을 사용합니다.
.├──argocd/│├──root-app.yaml# App of Apps controller│└──apps/│├──datadog-operator.yaml# ArgoCD Application for Operator│├──datadog-agent.yaml# ArgoCD Application for Agent│└──nginx-dka-demo.yaml# ArgoCD Application for workload├──manifests/│└──stage2-agent/│└──datadog-agent.yaml# DatadogAgent custom resource└──charts/└──nginx-dka-demo/├──Chart.yaml├──values.yaml└──templates/├──deployment.yaml└──pod-autoscaler.yaml
배포 단계
Kubernetes 사용자 지정 리소스 정의(CRD) 및 ArgoCD를 사용하는 경우 다단계 배포 방식이 필수적입니다. 이 순차적 접근 방식은 프로세스의 각 단계에 필요한 종속성을 생성하고 설치하기 위해 필요합니다.
Kubernetes CRD는 이를 사용하는 사용자 지정 리소스를 생성하기 전에 클러스터에 설치되어야 합니다. DatadogPodAutoscaler CRD는 1단계에서 Datadog Operator를 설치할 때 생성됩니다. ArgoCD는 이에 의존하는 리소스를 성공적으로 동기화하기 전에 이러한 CRD가 존재해야 합니다.
ArgoCD는 주석을 통해 배포 순서를 제어하기 위해 Sync Wave를 사용합니다. Sync Wave는 오름차순(작은 숫자부터)으로 실행되며, ArgoCD는 다음 Wave로 진행하기 전에 현재 Wave의 모든 리소스가 정상 상태가 될 때까지 대기합니다.
1단계(Wave 0): Helm을 사용한 Datadog Operator(CRD 생성)
2단계(Wave 1): Datadog Kubernetes Autoscaling용으로 구성된 Datadog Agent
오토스케일링 요구 사항이 활성화된 Datadog Agent 사용자 지정 리소스
3단계(Wave 2): DatadogPodAutoscaler가 포함된 애플리케이션 워크로드
데모 네임스페이스의 NGINX 배포
NGINX 배포를 오토스케일링하기 위한 DatadogPodAutoscaler 리소스
구성 파일 설정
먼저 Git 리포지토리를 생성합니다. ArgoCD는 Git에서 매니페스트를 가져오므로 ArgoCD Application 매니페스트의 모든 repoURL 참조를 사용자의 리포지토리를 가리키도록 업데이트해야 합니다.
프로세스의 각 단계에 대해 다음 구성 파일을 설정합니다.
1단계: 루트 Application(App of Apps)
루트 Application은 모든 하위 Application을 관리하는 App of Apps 컨트롤러입니다.
ignoreDifferences 항목은 RespectIgnoreDifferences=true와 함께 사용되어 ArgoCD가 Datadog Cluster Agent가 오토스케일링된 워크로드에 적용한 변경 사항을 되돌리지 않도록 지시합니다. managedFieldsManagers 형식은 Kubernetes 서버 측 적용(server-side apply) 필드 소유권을 활용하므로 Cluster Agent가 소유한 모든 필드(복제본 수, autoscaling.datadoghq.com/ 아래의 주석, 컨테이너 리소스)가 자동으로 유지됩니다. 전체 근거 및 전역 구성 대안은 Datadog Cluster Agent가 오토스케일링된 워크로드를 업데이트하도록 허용을 참조하세요.
NGINX 애플리케이션용 Helm 차트를 생성합니다.
charts/nginx-dka-demo/Chart.yaml
apiVersion:v2name:nginx-dka-demodescription:NGINX demo application with DatadogPodAutoscalertype:applicationversion:0.1.0appVersion:"1.0"
applyPolicy.mode: Apply가 DatadogPodAutoscaler에 설정되면 Datadog Cluster Agent는 대상 워크로드를 직접 수정합니다. Cluster Agent는 spec.replicas, 컨테이너 리소스를 업데이트하고 권장 사항 및 적용 상태를 추적하기 위해 autoscaling.datadoghq.com/ 접두사 아래에 주석을 기록합니다. 추가 ArgoCD 구성이 없으면 ArgoCD는 이러한 변경을 드리프트(drift)로 해석하고, selfHeal: true이 활성화된 경우 동기화할 때마다 이를 되돌립니다. 이로 인해 ArgoCD와 오토스케일러 간 충돌이 발생합니다.
이 충돌을 방지하기 위한 두 가지 옵션이 있습니다.
애플리케이션별: 오토스케일링된 워크로드가 포함된 각 ArgoCD Application에 ignoreDifferences 및 RespectIgnoreDifferences=true을 추가합니다. 이는 위의 4단계 예제에 표시되어 있습니다.
전역:argocd-cm을 한 번 구성하여 ignoreDifferences 규칙이 인스턴스의 모든 Application에 적용되도록 합니다.
지원되는 대상 워크로드 종류
ignoreDifferences 구성은 spec.targetRef을 통해 DatadogPodAutoscaler가 대상으로 지정할 수 있는 모든 워크로드 종류를 포함해야 합니다.
워크로드 종류
API 그룹
참고
Deployment
apps
StatefulSet
apps
Rollout
argoproj.io
Argo Rollouts도 사용하는 경우에만 적용됩니다.
애플리케이션별 구성
클러스터에서 서버 측 적용이 활성화되어 있는지 여부에 따라 다음 변형 중 하나를 선택합니다.
변형 1: managedFieldsManagers(권장)
managedFieldsManagers 방식은 Cluster Agent가 소유한 모든 필드(spec.replicas, 컨테이너 리소스 및 모든 주석)를 개별적으로 나열하지 않고 처리합니다.
제한 사항: 이 변형은 autoscaling.datadoghq.com/ 주석만 처리합니다. 오토스케일러가 spec.replicas 또는 컨테이너 리소스 요청도 수정하는 경우 해당 필드에 대해 별도의 jqPathExpressions 항목을 추가해야 합니다. 변형 1(managedFieldsManagers)은 Cluster Agent가 소유한 모든 필드를 자동으로 포함하여 이러한 문제를 방지합니다.
전역 구성
ArgoCD 인스턴스의 모든 Application에 대해 ignoreDifferences을 한 번만 적용하려면 resource.customizations.ignoreDifferences.<group>_<kind> 키를 사용하여 argocd-cm ConfigMap을 구성합니다.
중요:RespectIgnoreDifferences 애플리케이션별 {#important-respectignoredifferences-is-still-required-per-application}은 여전히 필요합니다.
전역 ignoreDifferences 구성은 ArgoCD UI에서 diff 표시만 숨깁니다. 동기화 중에 ArgoCD가 해당 필드를 덮어쓰는 것을 방지하지는 않습니다. 오토스케일링된 워크로드가 포함된 각 Application은 또한 RespectIgnoreDifferences=true 를 syncOptions에 설정해야 합니다. 이 동기화 옵션에 대한 전역 설정은 존재하지 않습니다.
각 Application에 개별적으로 RespectIgnoreDifferences=true을 설정하지 않으려면 AppProject 수준에서 정의하여 프로젝트의 모든 Application이 이를 상속받도록 합니다.
또는 ApplicationSet 템플릿을 사용하여 생성된 모든 Application에 동기화 옵션을 자동으로 추가할 수 있습니다.
어떤 옵션을 사용할 것인가
오토스케일링된 워크로드가 적은 경우: 애플리케이션별 구성을 사용합니다. 구성이 워크로드와 함께 유지됩니다.
워크로드가 많거나 ArgoCD 전체 표준화가 필요한 경우: 프로젝트 수준 또는 ApplicationSet 수준의 RespectIgnoreDifferences=true과 함께 전역 구성을 사용합니다.
혼합 환경(모든 워크로드가 오토스케일링되는 것은 아님): 전역 구성은 인스턴스 전체에 안전하게 적용할 수 있습니다. managedFieldsManagers 규칙은 Datadog Cluster Agent 필드 소유권이 없는 워크로드에 대해서는 아무 작업도 수행하지 않습니다.
배포 지침
구성 파일을 설정하고 Git 리포지토리에 푸시한 후 다음 단계에 따라 ArgoCD를 사용하여 구성 요소를 배포합니다.
Datadog 시크릿 생성
datadog 네임스페이스에 Datadog API 키와 애플리케이션 키가 포함된 Kubernetes 시크릿을 생성합니다.
kubectl get events -n nginx-dka-demo --sort-by='.lastTimestamp'
오토스케일링된 워크로드가 계속 되돌아가는 경우
selfHeal: true이 활성화된 경우 ArgoCD는 약 3분마다 동기화를 수행합니다. 오토스케일링된 워크로드의 spec.replicas 또는 autoscaling.datadoghq.com/ 주석이 반복적으로 재설정된다면 다음 항목을 확인합니다.
Application의 syncOptions에 1. RespectIgnoreDifferences=true이 포함되어 있지 않습니다. 이 플래그가 없으면 ArgoCD는 UI에서 드리프트만 숨기고 적용 시 필드를 계속 덮어씁니다.
2. ignoreDifferences 항목이 워크로드와 일치하지 않습니다. 해당 항목의 group, kind, name, namespace가 대상 워크로드와 정확히 일치하는지 확인합니다.
3. ServerSideApply=truemanagedFieldsManagers를 사용하는 경우이 설정되어 있지 않습니다. 서버 측 적용이 없으면 Kubernetes가 필드 소유권 데이터베이스를 채우지 않으므로 관리자 이름을 일치시킬 수 없습니다.
서버 측 적용이 활성화되어 있는지, 특정 필드를 어떤 관리자가 소유하고 있는지 확인하려면 다음 명령을 실행합니다.
kubectl get deployment <name> -n <namespace> -o yaml --show-managed-fields
manager: datadog-cluster-agent 및 operation: Apply인 항목을 찾습니다. 해당 항목이 없다면 해당 리소스에 대해 서버 측 적용이 활성화되지 않은 것입니다.