차이 전략

차이 전략 (Diff Strategies)

Argo CD는 원하는 상태와 라이브 상태 사이의 차이(diff)를 계산하여 Application이 out-of-sync인지 결정합니다. 이 문서는 Argo CD가 사용하는 3가지 diff 계산 전략(Legacy, Structured-Merge, Server-Side)을 설명합니다.

출처: 문서

본문

차이 전략

Argo CD는 원하는 상태와 라이브 상태 사이의 차이를 계산하여 Application이 out-of-sync인지 정의합니다. 이 동일한 로직은 Argo CD UI에서도 애플리케이션에 속한 모든 리소스의 라이브 상태와 원하는 상태 간의 차이를 표시하는 데 사용됩니다.

Argo CD는 현재 3가지 diff 계산 전략을 가지고 있습니다:

  • 레거시(Legacy): 기본적으로 사용되는 주요 diff 전략입니다. 라이브 상태, 원하는 상태, last-applied-configuration(어노테이션)을 기반으로 3-way diff를 적용합니다.
  • Structured-Merge Diff: Server-Side Apply 동기화 옵션을 활성화할 때 자동으로 적용되는 전략입니다.
  • Server-Side Diff: 드라이런(dryrun) 모드에서 Server-Side Apply를 호출해 예측된 라이브 상태를 생성하는 새 전략입니다.

Structured-Merge Diff

경고: 기능 중단 — 커뮤니티에서 여러 문제가 식별된 후 이 전략은 Server-Side Diff를 위해 중단되고 있습니다.

이 diff 전략은 Server-Side Apply 동기화 옵션이 활성화될 때 자동으로 사용됩니다. Kubernetes가 사용하는 structured-merge-diff 라이브러리를 사용해 필드 소유권을 기반으로 diff를 계산합니다. 기본값을 정의하는 CRD에 대해 이 전략으로 diff를 계산하는 데는 몇 가지 어려움이 있습니다.

Server-Side Diff

현재 상태: 안정(Stable) (v3.1.0부터)

이 diff 전략은 애플리케이션의 각 리소스에 대해 드라이런 모드로 Server-Side Apply를 실행합니다. 이 작업의 응답은 diff 결과를 제공하기 위해 라이브 상태와 비교됩니다. diff 결과는 캐시되며, 다음과 같은 경우에만 Kube API에 대한 새 Server-Side Apply 요청이 트리거됩니다:

  • Application 새로고침 또는 하드 새로고침이 요청될 때.
  • Argo CD Application이 대상으로 하는 저장소에 새 리비전이 있을 때.
  • Argo CD Application 스펙이 변경될 때.
  • 라이브 상태에서 리소스 자체의 리소스 버전(Resource Version)이 변경될 때.

Server-Side Diff의 한 가지 장점은 Kubernetes Admission Controllers가 diff 계산에 참여한다는 것입니다. 예를 들어 검증 웹훅이 리소스를 유효하지 않다고 식별하면, 이는 동기화 단계가 아닌 diff 단계에서 Argo CD에 알려집니다.

Server-Side Diff는 새 리소스 생성 중에는 수행되지 않는다는 점에 유의하세요. 이는 KubeAPI에 대한 추가 호출을 절약하고, 비교할 리소스가 존재하지 않을 때 훨씬 가볍고 빠른 diff 계산(Non-Server-Side Apply)을 제공하기 위한 것입니다. 리소스 생성 중에 Server-Side Diff를 수행해도 리소스가 아직 클러스터에 적용되지 않았으므로 diff 단계에서 검증 웹훅이 실행되지 않아 Kubernetes Admission Controller의 이점이 없습니다.

활성화 방법

Server-Side Diff는 Argo CD 컨트롤러 수준 또는 Application별로 활성화할 수 있습니다.

모든 Application에 대해 Server-Side Diff 활성화

argocd-cmd-params-cm configmap에 다음 항목을 추가하세요:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cmd-params-cm
data:
  controller.diff.server.side: "true"
...

참고: 이 구성을 적용한 후 argocd-application-controller를 재시작해야 합니다.

하나의 Application에 대해 Server-Side Diff 활성화

Argo CD Application 리소스에 다음 어노테이션을 추가하세요:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  annotations:
    argocd.argoproj.io/compare-options: ServerSideDiff=true
...

하나의 Application에 대해 Server-Side Diff 비활성화

Argo CD 인스턴스에서 Server-Side Diff가 전역으로 활성화되어 있다면 Application 수준에서 비활성화할 수 있습니다. 그러려면 Application 리소스에 다음 어노테이션을 추가하세요:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  annotations:
    argocd.argoproj.io/compare-options: ServerSideDiff=false
...

참고: Server-Side Diff 기능을 비활성화하게 만든 문제를 보고해 주세요.

뮤테이션 웹훅(Mutation Webhooks)

Server-Side Diff는 기본적으로 뮤테이션 웹훅이 만든 변경을 포함하지 않습니다. Argo CD diff에 뮤테이션 웹훅을 포함하려면 Argo CD Application 리소스에 다음 어노테이션을 추가하세요:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  annotations:
    argocd.argoproj.io/compare-options: IncludeMutationWebhook=true
...

참고: 이 어노테이션은 Server-Side Diff가 활성화되었을 때만 유효합니다. 주어진 애플리케이션에 두 옵션을 모두 활성화하려면 Argo CD Application 리소스에 다음 어노테이션을 추가하세요:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  annotations:
    argocd.argoproj.io/compare-options: ServerSideDiff=true,IncludeMutationWebhook=true
...

더 알아보기 (Learn more)