Kubectl로 애플리케이션 동기화

Kubectl로 애플리케이션 동기화 (Sync Applications with Kubectl)

CLI나 UI 대신 kubectl로 Argo CD 애플리케이션을 동기화할 수 있어요. "operation"을 정의한 문서를 애플리케이션에 apply·patch하면 됩니다.

출처: 문서

본문

CLI나 UI를 사용하는 것과 같은 방식으로 "kubectl"을 사용해 Argo CD에 애플리케이션 동기화를 요청할 수 있습니다. "force", "prune", "apply" 같은 많은 구성과 특정 리소스 목록 동기화까지 동일하게 지원됩니다. 이는 "operation"을 정의하는 문서로 Argo CD 애플리케이션을 apply하거나 patch하여 수행합니다.

이 "operation"은 동기화가 어떻게 수행되어야 하는지, 어떤 리소스에 대해 동기화가 수행되어야 하는지를 정의합니다.

"operation"에 추가할 수 있는 많은 구성 옵션이 있습니다. 그중 몇 가지를 설명합니다. 더 자세한 내용은 CRD applications.argoproj.io를 참조하세요. 일부는 필수이고 다른 일부는 선택적입니다.

주어진 애플리케이션의 모든 리소스를 동기화하려면 다음과 같이 할 수 있습니다:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: 
  namespace: 
spec:
  ...
operation:
  initiatedBy:
    username: 
  sync:
    syncStrategy:
      hook: {}
$ kubectl apply -f 

가장 중요한 부분은 "operation" 필드의 "sync" 정의입니다. "info"나 "initiatedBy" 같은 선택적 정보를 전달할 수 있습니다. "info"는 목록 형태로 작업에 대한 정보를 추가할 수 있게 해줍니다. "initiatedBy"는 작업 요청을 시작한 사람에 대한 정보를 포함합니다.

원한다면 patch할 수도 있습니다:

operation:
  initiatedBy:
    username: 
  sync:
    syncStrategy:
      hook: {}
$ kubectl patch -n  app  --patch-file  --type merge

패치, 특히 merge 전략을 사용하는 패치는 동기화 전략이나 옵션을 변경할 때 예상대로 동작하지 않을 수 있음을 유의하세요. 이 경우 "kubectl apply"가 더 나은 결과를 제공합니다.

"kubectl patch"나 "kubectl apply" 어느 쪽이든 동기화 상태는 애플리케이션 객체의 "operationState" 필드에 보고됩니다.

$ kubectl get -n  app  -o yaml
...
status:
  operationState:
    finishedAt: "2023-08-03T11:16:17Z"
    message: successfully synced (all tasks run)
    phase: Succeeded

Apply 및 Hook 동기화 전략

두 가지 유형의 동기화 전략이 있습니다: 기본값인 "hook"과 "apply"입니다.

"apply" 동기화 전략은 Argo CD에 "kubectl apply"를 지시하고, "hook" 동기화 전략은 operation에 참조된 모든 리소스를 제출하도록 Argo CD에 지시합니다. 이렇게 하면 해당 리소스의 동기화는 리소스에 어노테이션된 hook을 고려하게 됩니다.

operation:
  sync:
    syncStrategy:
      apply: {}
operation:
  sync:
    syncStrategy:
      hook: {}

두 전략 모두 "force"를 지원합니다. 그러나 force 작업은 patch가 5회 재시도 후에도 충돌이 발생하면 리소스를 삭제한다는 점을 알아야 합니다.

operation:
  sync:
    syncStrategy:
      apply:
        force: true
operation:
  sync:
    syncStrategy:
      hook:
        force: true

Prune

적용 전에 리소스를 prune하고 싶다면 Argo CD에 그렇게 하도록 지시할 수 있습니다:

operation:
  sync:
    prune: true

리소스 목록 (List of resources)

리소스 목록을 전달하는 것은 항상 가능합니다. 이 목록은 애플리케이션이 관리하는 모든 리소스일 수도 있고, 예를 들어 어떤 이유로 동기화가 안 된 상태로 남아 있는 리소스처럼 일부 하위 집합일 수도 있습니다.

리소스 참조 시 "kind"와 "name"만 필수 필드이지만, "groups"와 "namespace" 필드도 정의할 수 있습니다:

operation:
  sync:
    resources:
      - kind: Namespace
        name: namespace-name
      - kind: ServiceAccount
        name: service-account-name
        namespace: namespace-name
      - group: networking.k8s.io
        kind: NetworkPolicy
        name: network-policy-name
        namespace: namespace-name

동기화 옵션 (Sync Options)

operation에서 sync-options도 전달할 수 있습니다. 이 옵션 각각은 "name=value" 쌍으로 전달됩니다. 예를 들어:

operations:
  sync:
    syncOptions:
      - Validate=false
      - Prune=false

동기화 옵션에 대한 자세한 내용은 sync-options를 참조하세요.

더 알아보기 (Learn more)