Argo CD를 사용하여 GitOps 구현하는 방법

소개

Argo CD는 Kubernetes 위에서 GitOps 지속적 전달을 수행하는 인기 있는 오픈 소스 구현체입니다. 애플리케이션, 정의, 구성 및 환경은 선언적이고 버전 관리되어야 합니다. 또한 애플리케이션 배포 및 라이프사이클 관리는 자동화되어야 하며 감사 및 이해하기 쉬워야 합니다. 이 모든 것은 Argo를 사용하여 수행할 수 있습니다.

Argo CD는 동일한 GitOps 패턴과 원칙을 준수하여 선언적 접근 방식을 사용하여 클러스터 상태를 유지합니다. 동기화는 Git 저장소를 통해 이루어지며 여기에 Kubernetes 매니페스트가 저장됩니다. Kubernetes 매니페스트는 다음과 같은 여러 방법으로 지정할 수 있습니다:

  • Kustomize 애플리케이션.
  • Helm 차트.
  • Ksonnet 애플리케이션.
  • Jsonnet 파일.
  • YAML/json 매니페스트의 평범한 디렉토리.
  • 구성 관리 플러그인으로 구성된 사용자 정의 구성 관리 도구.

모든 Kubernetes 클러스터에서 실행되는 애플리케이션과 마찬가지로 Argo CD는 YAML 매니페스트 내에 저장된 사용자 정의 리소스 정의 (CRD)를 통해 구성됩니다. 가장 중요한 것은 Application CRD입니다. Argo CD 애플리케이션에서는 Git 저장소를 정의하여 어떤 Kubernetes 클러스터를 동기화해야 하는지를 정의합니다. Argo CD가 배포된 Kubernetes 클러스터와 동일할 수도 있고 외부 클러스터일 수도 있습니다.

Argo CD는 계속해서 실행 중인 애플리케이션을 모니터링하고 현재 (또는 실시간) 상태를 Git 리포지토리에 지정된 대상 상태와 비교하는 Kubernetes 컨트롤러로 구현됩니다. 대상 상태와 일치하지 않는 실행 중인 애플리케이션은 OutOfSync로 간주됩니다. Argo CD는 차이점을 보고 시각화하며 실행 중인 상태를 자동으로 또는 수동으로 대상 상태로 동기화하는 기능을 제공합니다.

Argo CD는 다음과 같은 많은 기능을 제공합니다. 가장 주목할만한 것은:

  • 다양한 구성 관리/템플릿 도구 지원, 예: Kustomize, Helm, Ksonnet, Jsonnet, plain-YAML.
  • 여러 클러스터 관리 및 배포 능력.
  • SSO 통합 (OIDC, OAuth2, LDAP, SAML 2.0, GitHub, GitLab, Microsoft, LinkedIn).
  • 다중 테넌시 및 RBAC 정책을 위한 권한 부여.
  • 애플리케이션 리소스의 상태 분석을 통한 건강 상태 분석.
  • Git 저장소에 커밋된 모든 애플리케이션 구성으로 롤백/롤-어디서나합니다.
  • 자동 구성 드리프트 검출 및 시각화.
  • 애플리케이션 활동의 실시간 뷰를 제공하는 Web UI.
  • 자동화 및 CI 통합을 위한 CLI.
  • 웹훅 통합(GitHub, BitBucket, GitLab).
  • 복잡한 애플리케이션 롤아웃(예: 블루/그린 및 카나리 업그레이드)을 지원하기 위한 PreSync, Sync, PostSync 후크.
  • Prometheus 메트릭.

이 자습서에서 다음을 배울 것입니다:

  • Helm을 사용하여 DOKS 클러스터에 Argo CD를 프로비저닝하는 방법.
  • GitOps 원칙을 사용하여 Kubernetes 클러스터 애플리케이션 상태를 Git 저장소와 동기화하는 방법.
  • Argo CD를 통해 애플리케이션을 배포하고 관리하는 방법.

이 자습서의 모든 단계를 완료한 후에는 다음이 구성된 DOKS 클러스터가 있어야 합니다:

  • 애플리케이션 CRD를 통한 클러스터 조정 처리.애플리케이션 CRD를 사용하여 정의된
  • Helm 소스를 사용한 Helm 릴리스 처리.

Helm 릴리스에 대한 DOKS와 Argo CD 개요

아래 다이어그램은 Argo CD가 Git 저장소를 사용하여 호스팅되는 Helm 애플리케이션을 관리하는 방법을 보여줍니다:

목차

전제 조건

이 자습서를 완료하려면 다음이 필요합니다:

  1. A working DOKS cluster that you have access to. Please follow the Starter Kit DOKS Setup Guide to find out more.to find out more.
  2. A GitHub repository and branch, to store Argo CD and your applications manifests. Must be created beforehand.
  3. A Git client, for cloning the Starter Kit repository.
  4. Kubectl CLI, Kubernetes 상호 작용을 위한 것입니다. 클러스터에 kubectldoctl을 사용하여 연결하는 방법에 대한 지침을 따르세요.
  5. Argo CLI, 명령 줄 인터페이스를 사용하여 Argo CD와 상호 작용합니다.
  6. Kubeseal, 비밀 및 Sealed Secrets Controller 상호 작용을 위한 것입니다.
  7. Helm, Argo CD 릴리스 및 업그레이드를 관리하는 데 사용됩니다 (선택 사항이지만 일반적으로 제품 시스템에 권장됨).

애플리케이션 배포를 위한 Argo CD 개념 이해

Argo CD는 응용 프로그램 배포 및 라이프사이클을 관리하기 위해 Application 핵심 개념을 사용합니다. Argo CD 응용 프로그램 매니페스트 내에서는 응용 프로그램 정의를 호스팅하는 Git 저장소와 해당하는 Kubernetes 클러스터를 정의합니다. 다시 말해, Argo CD 응용 프로그램은 소스 저장소와 Kubernetes 클러스터 간의 관계를 정의합니다. 이는 매우 간결하고 확장 가능한 설계로, 여러 소스(Git 저장소)와 해당하는 Kubernetes 클러스터를 연결할 수 있습니다.

A major benefit of using applications is that you don’t need to deploy Argo to each cluster individually. You can use a dedicated cluster for Argo, and deploy applications to all clusters at once from a single place. This way, you avoid Argo CD downtime or loss, in case other environments have issues or get decommissioned.

또한, 유사한 응용 프로그램을 Project로 그룹화할 수 있습니다. 프로젝트는 여러 팀과 함께 작업할 때 응용 프로그램 및 관련 역할/권한을 논리적으로 그룹화할 수 있습니다. 지정되지 않은 경우, 각 새 응용 프로그램은 default 프로젝트에 속합니다. default 프로젝트는 자동으로 생성되며 제한이 없습니다. 기본 프로젝트는 수정할 수 있지만 삭제할 수는 없습니다.

스타터 키트는 Argo CD를 사용하여 빠르게 시작하기 위해 기본 프로젝트를 사용합니다. 그런 다음 각 스타터 키트 구성 요소에 대해 애플리케이션을 생성하는 방법과 Helm 차트애플리케이션 소스로 사용하는 방법을 배우게 됩니다. Argo CD는 Helm 소스에만 제한되지 않으며 Kustomize, Ksonnet, Jsonnet 등의 기능도 활용할 수 있습니다. 자세한 내용은 애플리케이션 소스 페이지를 참조하십시오.

Argo CD의 그래픽 UI(웹 인터페이스)를 사용하여 애플리케이션을 생성할 수 있지만, 스타터 키트는 YAML 매니페스트를 통한 GitOps 선언적 방식을 사용합니다. 각 YAML 구성은 각 애플리케이션에 대한 레시피 역할을 하므로 Git 저장소에 저장할 수 있습니다. 이것은 환경을 다시 만들거나 다른 클러스터로 이동할 때 Argo CD 설정을 언제든지 다시 생성할 수 있다는 것을 의미합니다. 더 중요한 것은 Git 기록을 통해 각 변경 사항을 검토하고 추적할 수 있다는 것입니다. Argo CD 설정 파일을 응용 프로그램 개발에 사용된 저장소와 별도의 Git 저장소에 보관하는 것이 모범 사례입니다. 이에 대한 자세한 내용은 Argo CD 공식 문서 웹 사이트의 최상의 실천 방법 페이지를 참조하십시오.

중요 사항:
고려해야 할 중요한 측면은 Argo CD가 새로운 응용 프로그램을 자동으로 동기화하지 않는다는 것입니다. ArgoCD 애플리케이션이 처음 생성되면 상태가 OutOfSync됩니다. 이는 ArgoCD 애플리케이션에 의해 가리키는 Git 저장소 상태가 Kubernetes 클러스터 상태와 일치하지 않음을 의미합니다. 새로운 ArgoCD 애플리케이션을 만들면 대상 클러스터에 자동 배포가 트리거되지 않습니다.

자동 동기화 및 고아 리소스의 삭제 (가지치기)를 활성화하려면 syncPolicy를 생성해야 합니다. 또한 Argo CD를 구성하여 kubectl을 통해 수동으로 수행한 변경 사항을 자동으로 되돌릴 수도 있습니다. 공식 문서 웹 사이트에서 자동 동기화 정책에 대해 더 읽어 볼 수 있습니다.

Git 저장소 소스를 사용하는 일반적인 Application CRD는 아래와 같습니다:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-apps
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/myrepo/my-apps.git
    targetRevision: HEAD
    path: apps
  destination:
    server: https://kubernetes.default.svc
    namespace: my-apps
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

위 구성에 대한 설명:

  • spec.project: 응용 프로그램에 대해 사용할 프로젝트를 Argo CD에 알려줍니다 (이 예에서는 default입니다).
  • spec.source.repoURL: 클러스터 상태를 동기화하는 데 사용되는 Git 저장소 URL입니다.
  • spec.source.targetRevision: 동기화에 사용되는 Git 저장소 리비전입니다 (브랜치 또는 태그 이름일 수도 있음).
  • spec.source.path: 소스 파일 (YAML 매니페스트)이 저장된 Git 저장소 경로입니다.
  • spec.destination.server: 대상 Kubernetes 클러스터 주소입니다. 보통 Argo CD가 배포된 클러스터와 동일한 클러스터를 가리킵니다(https://kubernetes.default.svc).
  • spec.destination.namespace: 애플리케이션에 대한 사용할 Kubernetes 네임스페이스입니다.
  • spec.syncPolicy.automated: 클러스터 내의 애플리케이션을 Git 저장소와 자동으로 동기화하는 기능을 활성화합니다.
  • spec.syncPolicy.automated.prune: Prune은 자동 동기화의 일부로 소스에서 더 이상 찾을 수 없는 리소스를 클러스터에서 삭제할지 여부를 지정합니다.
  • spec.syncPolicy.automated.selfHeal: 클러스터에서 수동으로 수정될 때(예: kubectl를 통해) 리소스를 원하는 상태로 되돌릴지 여부를 지정합니다.

또한 클러스터에 애플리케이션을 설치하기 위한 소스로 Helm 저장소를 사용할 수 있습니다. 일반적인 Helm 저장소를 사용한 Application CRD는 아래와 같습니다( Git 저장소 예와 유사하지만 Helm 차트 저장소를 대신 사용합니다):

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: sealed-secrets
  namespace: argocd
spec:
  project: default
  source:
    chart: sealed-secrets
    repoURL: https://bitnami-labs.github.io/sealed-secrets
    targetRevision: 2.4.0
    helm:
      releaseName: sealed-secrets
      values: |
        replicaCount: 2
  destination:
    server: "https://kubernetes.default.svc"
    namespace: kubeseal

위 설정에 대한 설명:

  • spec.source.chart: 애플리케이션의 소스로 사용할 Helm 차트입니다.
  • spec.source.repoURL: Helm 차트 저장소 URL입니다.
  • spec.source.targetRevision: 애플리케이션에 사용할 Helm 차트 버전입니다.
  • spec.source.helm.releaseName: Kubernetes 클러스터에 생성할 Helm 릴리스 이름입니다.
  • spec.source.helm.values: helm 템플릿에 전달할 Helm 값으로 일반적으로 블록으로 정의됩니다.
  • spec.destination.server: 대상 Kubernetes 클러스터 주소입니다. 일반적으로 Argo CD가 배포된 클러스터와 동일한 클러스터를 사용하는 경우 https://kubernetes.default.svc를 가리킵니다.
  • spec.destination.namespace: 애플리케이션에 사용할 Kubernetes 네임스페이스입니다.

공식 문서 웹사이트에서 Argo CD 핵심 개념에 대해 더 읽어보세요. 그다음 Kubernetes 클러스터에 Argo CD를 배포하는 사용 가능한 설치 옵션을 찾아볼 것입니다.

Argo CD 설치

Argo CD는 kubectl 또는 Helm을 사용하여 설치할 수 있습니다.

  1. kubectl 및 설치 매니페스트 파일을 사용합니다. 이 방법은 다양한 설치 매개변수에 대한 직접적인 제어를 제공하지 않습니다. Helm 기반 설치에 익숙하지 않은 경우 시작하기에 가장 간단한 옵션입니다.
  2. Helm 기반 설치입니다. Argo CD 애플리케이션 배포 및 라이프사이클에 대한 더 세밀한 제어를 제공합니다. HA (고가용성) 설정 및 Argo CD가 운영 환경에서 사용될 경우 추천됩니다.

다음으로 사용할 기능에 따라 두 가지 옵션이 있습니다:

  • 다중 테넌트 모드. 이 유형의 설치는 조직 내에서 여러 애플리케이션 개발팀에 서비스를 제공하기 위해 사용되며 플랫폼 팀이 유지합니다. 최종 사용자는 Web UI 또는 argocd CLI를 사용하여 API 서버를 통해 Argo CD에 액세스할 수 있습니다.
  • 코어 전용 모드입니다. 그래픽 사용자 인터페이스, API 서버, SSO 등이 없는 축소 설치로, 각 구성 요소의 경량 (비-HA) 버전을 설치합니다.

Starter Kit은 DOKS 클러스터에 Argo CD를 설치할 때 Multi-TenantHigh Availability 모드를 사용합니다. 이렇게 하면 신뢰할 수 있는 설정을 얻을 수 있으며 사용자 인터페이스를 포함한 모든 사용 가능한 기능을 탐색할 수 있습니다. 이 주제에 대한 자세한 정보는 설치 방법 문서 페이지를 방문해주세요.

Kubectl 기반 설치

이 방법은 kubectl을 필요로 하며 두 단계 프로세스입니다:

  1. 네임스페이스를 생성하여 Argo CD 자체를 배포합니다.
  2. kubectl을 통해 HA 설치 매니페스트를 실행합니다.

아래 명령을 순서대로 실행해주세요:

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/ha/install.yaml

이제 설치가 성공적으로 완료되었는지 확인해주세요. 먼저 모든 Argo CD 배포가 정상인지 확인해주세요:

kubectl get deployments -n argocd

출력은 다음과 유사해야 합니다 ( READY 열을 확인하십시오 – 모든 Pods가 실행 중이어야 합니다):

Output
NAME READY UP-TO-DATE AVAILABLE AGE argocd-applicationset-controller 1/1 1 1 51s argocd-dex-server 1/1 1 1 50s argocd-notifications-controller 1/1 1 1 50s argocd-redis-ha-haproxy 3/3 3 3 50s argocd-repo-server 2/2 2 2 49s argocd-server 2/2 2 2 49s

Argo CD 서버는 HA 모드에서 replicaset 최소값으로 2를 가져야 합니다. 일부 배포가 정상적이지 않은 경우 Kubernetes 이벤트 및 해당 구성 요소 Pods의 로그를 확인해주세요.

Helm 기반 설치

이 방법을 사용하려면 로컬 머신에 Helm이 설치되어 있어야 합니다. 스타터 킷은 사용 준비가 된 Helm 값 파일을 제공하여 시작합니다. 그리고 Argo CD를 HA 모드(자동 확장 없음)로 설치합니다.

다음 단계를 따라 Helm 기반 설치를 완료하십시오:

  1. 먼저 스타터 킷 디렉터리를 복제하고(이미 복제되지 않았다면) 로컬 복사본 디렉터리로 이동하십시오:
git clone https://github.com/digitalocean/Kubernetes-Starter-Kit-Developers.git
cd Kubernetes-Starter-Kit-Developers
  1. 다음으로 Argo CD Helm 저장소를 추가하십시오:
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update argo 
  1. 이제 설치할 사용 가능한 차트를 검색하십시오. argo Helm 저장소에서:
helm search repo argo

출력은 다음과 유사합니다:

Output
NAME CHART VERSION APP VERSION DESCRIPTION argo/argo 1.0.0 v2.12.5 A Helm chart for Argo Workflows argo/argo-cd 4.9.4 v2.4.0 A Helm chart for Argo CD, a declarative, GitOps... ...
  1. 그런 다음 Starter Kit 저장소에서 제공하는 Argo CD Helm 값 파일을 선택한 편집기(가능하면 YAML 린트 지원)를 사용하여 열고 검사하십시오. 예를 들어 VS Code를 사용할 수 있습니다:
code 14-continuous-delivery-using-gitops/assets/manifests/argocd/argocd-values-v4.9.4.yaml
  1. 마지막으로 Argo CD를 DOKS 클러스터에 배포하십시오:
HELM_CHART_VERSION="4.9.4"
helm install argocd argo/argo-cd --version "${HELM_CHART_VERSION}" \
  --namespace argocd \
  --create-namespace \
  -f "14-continuous-delivery-using-gitops/assets/manifests/argocd/argocd-values-v${HELM_CHART_VERSION}.yaml"

–create-namespace \

참고:
Helm 차트의 특정 버전을 사용합니다. 이 경우 4.9.4가 선택되어 애플리케이션의 2.4.0 버전에 매핑됩니다. 일반적으로 특정 버전에 잠금을 거는 것이 좋습니다. 이렇게 하면 예측 가능한 결과를 얻을 수 있으며 Git을 통한 버전 관리가 가능합니다.

helm ls -n argocd

이제 Helm 릴리스가 성공적으로 되었는지 확인하십시오:

NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
argocd  argocd          1               2022-03-23 11:22:48.486199 +0200 EET    deployed        argo-cd-4.9.4   v2.4.0

출력은 다음과 유사합니다 (STATUS 열 값은 deployed로 설정되어야 함):

kubectl get deployments -n argocd

마지막으로, Argo CD 애플리케이션 배포 상태를 확인합니다:

Output
NAME READY UP-TO-DATE AVAILABLE AGE argocd-applicationset-controller 1/1 1 1 2m9s argocd-dex-server 1/1 1 1 2m9s argocd-notifications-controller 1/1 1 1 2m9s argocd-redis-ha-haproxy 3/3 3 3 2m9s argocd-repo-server 2/2 2 2 2m9s argocd-server 2/2 2 2 2m9s

출력은 다음과 유사합니다 (READY 열을 확인하십시오 – 모든 Pods가 실행 중이어야 함):

Argo CD 서버는 HA 모드에 대한 replicaset의 최소값으로 2를 가져야 합니다. 어떤 이유로든 일부 배포가 건강하지 않은 경우 영향을 받는 구성 요소 Pods에 대한 Kubernetes 이벤트와 로그를 확인하십시오.

Argo CD Helm 차트에 대한 자세한 정보는 커뮤니티 유지 관리 저장소에 액세스하여 찾을 수 있습니다.

다음으로, Argo CD가 제공하는 그래픽 사용자 인터페이스의 주요 기능에 액세스하고 탐색하는 방법을 배우게 됩니다.

Argo CD 웹 인터페이스에 액세스하고 탐색하기

Argo CD의 멋진 기능 중 하나는 웹 인터페이스입니다. 이를 사용하여 다양한 관리 작업을 수행하고 애플리케이션 배포 상태를 볼 수 있습니다. 그래픽 사용자 인터페이스를 사용하여 애플리케이션을 생성하고 Argo CD와 다양한 방법으로 상호 작용할 수 있습니다. 또한 각 애플리케이션 상태를 검사하고 Kubernetes 이벤트 및 애플리케이션 로그에 액세스할 수 있는 기능도 중요합니다. 게다가 Argo CD는 각 애플리케이션 배포가 사용하는 모든 Kubernetes 객체(replicasets, pods 등)의 시각적 표현을 제공합니다.

kubectl port-forward svc/argocd-server -n argocd 8080:443

웹 인터페이스는 argocd-server Kubernetes 서비스를 포트 포워딩하여 액세스할 수 있습니다. 셸 터미널에서 다음 명령을 실행하십시오:

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

이제 웹 브라우저를 열고 localhost:8080으로 이동하십시오(지금은 유효하지 않은 TLS 인증서를 무시하십시오). Argo CD 로그인 페이지가 표시됩니다. 기본 관리자 사용자 이름은 admin이며, 암호는 설치 시 무작위로 생성됩니다. 다음 명령을 실행하여 암호를 가져올 수 있습니다:

다음으로 애플리케이션 대시보드 페이지로 리디렉션됩니다. 여기서 UI를 통해 애플리케이션을 보거나 생성하거나 관리할 수 있습니다(YAML 편집기도 제공됩니다). 또한 동기화 또는 새로 고침 작업을 수행할 수 있습니다:

애플리케이션 타일을 클릭하면 관련된 모든 객체의 시각적 표현도 표시됩니다:

다음 섹션에서는 애플리케이션 프로젝트, 리포지토리 및 클러스터를 관리할 수 있습니다:

마지막으로 사용자 정보 섹션에서 사용 가능한 사용자를 표시하고 관리자 암호를 업데이트할 수 있습니다:

각 섹션 및 하위 섹션을 자세히 살펴보고 사용 가능한 모든 기능을 탐색할 수 있습니다. 다음으로, argocd라는 CLI 대응물을 사용하는 방법을 배우게 됩니다.

Argo CD CLI 알아보기

argocd
Usage:
  argocd [flags]
  argocd [command]

Available Commands:
  account     Manage account settings
  admin       Contains a set of commands useful for Argo CD administrators and requires direct Kubernetes access
  app         Manage applications
  cert        Manage repository certificates and SSH known hosts entries
  cluster     Manage cluster credentials
  completion  output shell completion code for the specified shell (bash or zsh)
  context     Switch between contexts
  gpg         Manage GPG keys used for signature verification
  help        Help about any command
...

Argo CD는 웹 인터페이스 또는 CLI를 통해 동일한 기능 세트를 사용할 수 있습니다. argocd CLI를 사용하려면 별도의 셸 창을 열고 아무 인수도 없이 argocd를 입력하면 됩니다. 기본적으로 사용 가능한 명령과 옵션을 표시합니다:

argocd app --help

어떤 명령이나 하위 명령에 대해서도 다음 패턴을 사용하여 해당 도움말 페이지를 호출할 수 있습니다: argocd <command/subcommand> --help. 예를 들어 app 명령에 대해 사용 가능한 옵션을 확인하려면:

Manage Applications
Usage:
  argocd app [flags]
  argocd app [command]

Examples:
  출력은 다음과 유사합니다:
  argocd app list
  
  # 모든 애플리케이션을 나열합니다.
  argocd app get my-app
...

# 애플리케이션의 세부 정보를 가져옵니다

기타 명령/하위 명령을 살펴보고 사용 가능한 옵션을 모두 확인해 주세요. 다음으로는 모든 시작 키트 구성 요소를 자동으로 배포하는 첫 번째 Argo CD 애플리케이션을 설정하는 방법을 배우게 됩니다.

Argo CD 응용 프로그램 부트스트래핑

새로 설치한 Argo CD는 응용 프로그램을 동기화할 위치를 모르거나 응용 프로그램 매니페스트를 가져올 수 있는 Git 저장소가 어디에 있는지 모릅니다. 따라서 첫 번째 단계는 부트스트래핑이라는 일회성 작업을 수행하는 것입니다. 이 섹션에서 제시된 모든 작업을 argocd CLI 또는 그래픽 사용자 인터페이스를 사용하여 수행할 수 있습니다.

클러스터를 부트스트래핑하는 여러 가지 방법이 있지만 대부분의 Argo CD 사용자는 app of apps 패턴을 사용합니다. 이는 먼저 부모 응용 프로그램을 만들고, 이 응용 프로그램이 Kubernetes 클러스터의 나머지 응용 프로그램을 참조하고 부트스트랩하는 방식입니다.

Git 저장소 레이아웃 준비

clusters
└── dev
    └── helm
        ├── cert-manager-v1.8.0.yaml
        ├── nginx-v4.1.3.yaml
        ├── prometheus-stack-v35.5.1.yaml
        ├── sealed-secrets-v2.4.0.yaml
        └── velero-v2.29.7.yaml

먼저 일관된 레이아웃을 사용하여 Git 저장소를 준비해야 합니다. 다음 예제에서는 다음과 유사한 Git 저장소 레이아웃 구조를 만듭니다:

  1. 터미널을 열고 아래 단계를 따라 Git 저장소의 레이아웃을 만드십시오:
git clone <YOUR_ARGOCD_GIT_REPOSITORY_ADDRESS>
  1. 먼저, 테스트를 위해 사용하는 Argo CD의 git 저장소를 복제하세요 (코드 내의 <> 플레이스홀더를 적절히 대체하세요):
cd <YOUR_GIT_REPO_LOCAL_COPY_DIRECTORY>
mkdir -p clusters/dev/helm
  1. 다음으로, 로컬 복사본으로 디렉토리를 변경하고 디렉토리 구조를 만드세요 (코드 내의 <> 플레이스홀더를 적절히 대체하세요):
CERT_MANAGER_CHART_VERSION="1.8.0"
NGINX_CHART_VERSION="4.1.3"
PROMETHEUS_CHART_VERSION="35.5.1"
SEALED_SECRETS_CHART_VERSION="2.4.0"
VELERO_CHART_VERSION="2.29.7"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/cert-manager-v${CERT_MANAGER_CHART_VERSION}.yaml" > "clusters/dev/helm/cert-manager-v${CERT_MANAGER_CHART_VERSION}.yaml"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/nginx-v${NGINX_CHART_VERSION}.yaml" > "clusters/dev/helm/nginx-v${NGINX_CHART_VERSION}.yaml"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/prometheus-stack-v${PROMETHEUS_CHART_VERSION}.yaml" > "clusters/dev/helm/prometheus-stack-v${PROMETHEUS_CHART_VERSION}.yaml"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/sealed-secrets-v${SEALED_SECRETS_CHART_VERSION}.yaml" > "clusters/dev/helm/sealed-secrets-v${SEALED_SECRETS_CHART_VERSION}.yaml"

curl "https://raw.githubusercontent.com/digitalocean/Kubernetes-Starter-Kit-Developers/main/14-continuous-delivery-using-gitops/assets/manifests/argocd/applications/helm/velero-v${VELERO_CHART_VERSION}.yaml" > "clusters/dev/helm/velero-v${VELERO_CHART_VERSION}.yaml"
  1. 스타터 킷 저장소에서 각 구성 요소에 대한 애플리케이션 매니페스트를 복사하세요 (각 매니페스트가 어떻게 구성되어 있는지 확인할 수도 있습니다):

마지막으로 변경 사항을 커밋하고 원본에 푸시하세요.

다음으로, 부모 애플리케이션 배포를 생성하고 Argo CD에 모든 스타터 킷 애플리케이션을 자동으로 DOKS 클러스터로 동기화하도록 설정할 것입니다.

Argo CD CLI를 통한 앱 오브 앱스 패턴 사용

이 섹션에서는 Argo CD CLI를 사용하여 DOKS 클러스터에 있는 모든 스타터 킷 구성 요소를 배포하기 위해 앱 오브 앱스 패턴을 만들고 활용하는 방법을 배우게 됩니다. 아래 그림은 주요 개념을 설명합니다:

kubectl port-forward svc/argocd-server -n argocd 8080:443

먼저, 로컬 머신에서 Argo CD 메인 서버를 포트 포워드해야 합니다. 별도의 터미널 창에서 실행하세요:

ADMIN_USER="admin"
ADMIN_PASSWD="$(kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d)"
argocd login localhost:8080 --username $ADMIN_USER --password $ADMIN_PASSWD --insecure

다음으로, argocd CLI가 작동하려면 Argo CD API 서버에 액세스해야 합니다. 다른 터미널 창을 사용하여 argocd 클라이언트를 Argo CD 서버 인스턴스와 인증해야 합니다:

Output
'admin:login' logged in successfully Context 'localhost:8080' updated

출력은 다음과 유사합니다:

argocd app create starter-kit-apps \
    --dest-namespace argocd \
    --dest-server https://kubernetes.default.svc \
    --repo https://github.com/<YOUR_GITHUB_USERNAME>/<YOUR_ARGOCD_GITHUB_REPO_NAME>.git \
    --path clusters/dev/helm

그런 다음 아래 명령을 실행하여 starter-kit-apps 부모 애플리케이션을 생성하십시오 (반드시 <> 자리 표시자를 적절히 대체하십시오):

  • –dest-namespace argocd \
  • –dest-server https://kubernetes.default.svc \
  • 위의 명령은 새로운 Argo CD 애플리케이션argocd 네임스페이스에 starter-kit-apps로 만들고, 다음을 구성합니다:

Argo CD가 배포된 동일한 Kubernetes 클러스터를 대상으로 합니다. 왜냐하면 --dest-serverhttps://kubernetes.default.svc로 설정되어 있기 때문입니다.

argocd app sync starter-kit-apps 

클러스터를 동기화할 GitHub 저장소를 사용합니다. (--repo 인수로 설정)

Output
TIMESTAMP GROUP KIND NAMESPACE NAME STATUS HEALTH ... 2022-03-23T17:39:38+02:00 argoproj.io Application argocd sealed-secrets-controller OutOfSync Missing ... 2022-03-23T17:39:38+02:00 argoproj.io Application argocd velero OutOfSync Missing ... 2022-03-23T17:39:38+02:00 argoproj.io Application argocd ingress-nginx OutOfSync Missing ... ... GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE argoproj.io Application argocd sealed-secrets-controller Synced application.argoproj.io/sealed-secrets-controller created argoproj.io Application argocd ingress-nginx Synced application.argoproj.io/ingress-nginx created argoproj.io Application argocd kube-prometheus-stack Synced application.argoproj.io/kube-prometheus-stack created argoproj.io Application argocd velero Synced application.argoproj.io/velero created argoproj.io Application argocd cert-manager Synced application.argoproj.io/cert-manager created

clusters/dev/helm 디렉토리에서 찾은 모든 애플리케이션 매니페스트를 스캔하고 적용합니다. (--path 인수로 설정)

다음으로, starter-kit-apps 애플리케이션을 동기화해야 합니다 (Argo CD는 지정하지 않은 경우 기본적으로 아무것도 동기화하지 않음을 기억하십시오):

argocd app list

출력은 다음과 유사합니다:

Output
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY ... ingress-nginx https://kubernetes.default.svc ingress-nginx default OutOfSync Missing Auto-Prune ... cert-manager https://kubernetes.default.svc cert-manager default OutOfSync Missing Auto-Prune ... kube-prometheus-stack https://kubernetes.default.svc monitoring default OutOfSync Missing Auto-Prune ... sealed-secrets-controller https://kubernetes.default.svc sealed-secrets default OutOfSync Missing Auto-Prune ... starter-kit-apps https://kubernetes.default.svc argocd default Synced Healthy <none> ... velero https://kubernetes.default.svc velero default OutOfSync Missing Auto-Prune ...

위의 명령이 완료되면 Argo CD 서버의 주요 대시보드에 새 응용 프로그램이 표시됩니다. 웹 브라우저를 열고 http://localhost:8080으로 이동하십시오. 그런 다음 Applications 탭을 선택하고 starter-kit-apps 타일을 클릭하십시오 (app of apps 패턴을 조합 그래프로 살펴보세요):

argocd app sync -l argocd.argoproj.io/instance=starter-kit-apps

또한 CLI를 통해 새 응용 프로그램을 검사할 수 있습니다:

출력은 다음과 유사합니다:

argocd app list

starter-kit-apps 부모 응용 프로그램은 동기화된 것으로 나타납니다. 하지만 하위 앱은 동기화되지 않습니다. 다음으로, 웹 인터페이스를 사용하거나 CLI를 통해 모두 동기화할 수 있습니다:

Output
NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS ... ingress-nginx https://kubernetes.default.svc ingress-nginx default Synced Healthy Auto-Prune <none> ... cert-manager https://kubernetes.default.svc cert-manager default Synced Healthy Auto-Prune <none> ... kube-prometheus-stack https://kubernetes.default.svc monitoring default Synced Healthy Auto-Prune <none> ... sealed-secrets-controller https://kubernetes.default.svc sealed-secrets default Synced Healthy Auto-Prune <none> ... starter-kit-apps https://kubernetes.default.svc argocd default Synced Healthy <none> <none> ... velero https://kubernetes.default.svc velero default OutOfSync Missing Auto-Prune SyncError ...

동기화 작업은 완료까지 시간이 걸릴 수 있습니다 (응용 프로그램이 배포되는 모든 Kubernetes 객체의 복잡성 및 수에 따라 5-10분 정도 소요될 수 있음에 유의하십시오).

잠시 후, 모든 응용 프로그램을 다시 나열하십시오:

argocd app create starter-kit-apps \
  --dest-namespace argocd \
  --dest-server https://kubernetes.default.svc \
  -repo https://github.com/<YOUR_GITHUB_USERNAME>/<YOUR_ARGOCD_GITHUB_REPO_NAME>.git \
  --path clusters/dev/helm \
   --sync-policy automated \
  --auto-prune \
  --self-heal
  • 출력은 다음과 유사합니다 (이제 모든 응용 프로그램이 동기화되었음을 유의하세요):
argocd app get velero

Velero 응용 프로그램 배포가 실패하고 의도적으로 SyncError 상태로 남겨질 것입니다. 이는 독자가 Argo CD에서 응용 프로그램 문제를 진단하고 해결하는 방법에 익숙해지고 학습하기 위한 연습입니다. 응용 프로그램 문제를 진단하는 방법은 아래의 힌트 섹션을 참조하십시오.
부모 응용 프로그램의 부트스트래핑은 일회성 작업입니다. 각 응용 프로그램에 대한 후속 Git 변경에 대해 Argo CD는 드리프트를 감지하고 필요한 변경 사항을 적용할 것입니다. Argo CD는 기본적으로 Git 리포지토리에서 변경 사항을 감지하기 위해 polling 메커니즘을 사용합니다. 기본 refresh 간격3 분으로 설정되어 있습니다. 폴링 메커니즘을 의존하는 대신 Git 웹훅의 기능을 활용할 수도 있습니다. Git 웹훅을 사용하도록 Argo CD를 생성하고 구성하는 방법을 알아보려면 공식 문서 웹사이트를 방문하십시오. webhooks.

Output
Name: velero Project: default Server: https://kubernetes.default.svc Namespace: velero URL: https://argocd.example.com/applications/velero Repo: https://vmware-tanzu.github.io/helm-charts Target: 2.27.3 Path: SyncWindow: Sync Allowed Sync Policy: Automated (Prune) Sync Status: OutOfSync from 2.27.3 Health Status: Missing CONDITION MESSAGE LAST TRANSITION SyncError Failed sync attempt to 2.27.3: one or more objects failed to apply (dry run) (retried 5 times). 2022-03-24 12:14:21 +0200 EET GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE velero.io VolumeSnapshotLocation velero default Failed SyncFailed PostSync error validating data: ValidationError(VolumeSnapshotLocation.spec): missing required field "provider" in io.velero.v1.VolumeSnapshotLocation.spec velero.io BackupStorageLocation velero default Failed SyncFailed PostSync error validating data: [ValidationError(BackupStorageLocation.spec.objectStorage): missing required field "bucket" in io.velero.v1.BackupStorageLocation.spec.objectStorage, ValidationError(BackupStorageLocation.spec): missing required field "provider" in io.velero.v1.BackupStorageLocation.spec] ...

힌트: 원하는 경우 부모 응용 프로그램을 자동으로 동기화하도록 구성할 수 있습니다(또한 자가 치유 및 자동 가지치기를 활성화할 수도 있습니다). 다음 명령을 사용할 수 있습니다(<> 자리 표시자를 적절히 대체하지 않도록 주의하십시오):

–dest-namespace argocd \

–dest-server https://kubernetes.default.svc \

–sync-policy automated \

–auto-prune \

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

모든 동기화 실패의 경우, 해당 애플리케이션의 Kubernetes 이벤트를 검사할 수 있습니다( argocd app get <application_name>을 통해):

출력은 다음과 유사합니다:

  • 다음으로, app of apps pattern을 사용하고 동일한 단계를 Argo CD 그래픽 사용자 인터페이스를 통해 수행하는 방법을 배우게 됩니다.
  • Argo CD 웹 인터페이스를 통한 App of Apps 패턴 사용
  • 이 섹션에서는 Argo CD 웹 인터페이스를 사용하여 DOKS 클러스터에서 모든 Starter Kit 구성 요소를 배포하기 위해 app of apps 패턴을 생성하고 활용하는 방법을 배우게 됩니다. 아래 그림은 주요 개념을 보여줍니다:
  • 위 다이어그램에서 볼 수 있듯이, 웹 인터페이스를 통한 새 애플리케이션 부트스트래핑은 CLI와 매우 유사합니다. 유일한 차이점은 서로 다른 패널/창 사이를 이동하고 클릭하여 작업을 수행하는 것입니다. 내부적으로 Argo CD는 필요한 애플리케이션 CRD를 생성하고 Kubernetes 클러스터에 변경 사항을 적용할 것입니다.
  • 먼저, 웹 브라우저를 열고 Argo CD 웹 콘솔에 로그인하십시오. 기본 사용자 이름은 admin이고, 기본 비밀번호는 다음을 통해 얻을 수 있습니다:
  • 로그인한 후, 애플리케이션 대시보드 페이지로 리디렉션됩니다(새로 설치한 경우 대시보드가 비어 있음). 다음으로 애플리케이션 생성 버튼을 클릭하십시오. 새로운 패널이 팝업되며 애플리케이션 세부 정보를 요청합니다:
  • 각 필드를 적절하게 작성하십시오:

애플리케이션 이름: 새로운 애플리케이션 이름(예: starter-kit-apps).

프로젝트: 이 애플리케이션이 속한 프로젝트 이름(처음으로 Argo CD를 사용하는 경우 default를 사용할 수 있습니다).

동기화 정책동기화 옵션: 동기화 정책 및 옵션을 구성합니다(예: 수동, 자동, 재시도 횟수, 재시도 간격 등).

소스 저장소 URL: GitHub 저장소 URL 주소 – 예: https://github.com/<YOUR_GITHUB_USERNAME>/<YOUR_ARGOCD_GITHUB_REPO_NAME>.git.

소스 경로: 애플리케이션 매니페스트가 저장된 GitHub 저장소 디렉토리 경로(예: clusters/dev/helm).

대상 클러스터 URL: GitHub 저장소와 동기화할 대상 Kubernetes 클러스터(예: Argo CD가 배포된 로컬 클러스터의 경우 https://kubernetes.default.svc).

대상 네임스페이스: Argo CD 애플리케이션에 사용할 대상 Kubernetes 클러스터 네임스페이스(argocd, 일반적으로).

모든 애플리케이션 세부 정보를 작성한 후에, 위쪽에 있는 생성 버튼을 클릭하십시오. 대시보드 페이지에 새로운 애플리케이션 타일이 나타납니다:

응용 프로그램 타일을 클릭하면 구성 그래프를 확인하여 앱의 앱 패턴을 볼 수 있습니다:

위 그림을 보면 모든 응용 프로그램이 OutOfSync로 표시되어 있는 것을 알 수 있습니다. 다음 단계는 상위 응용 프로그램에서 동기화 작업을 트리거하는 것입니다. 그럼 모든 하위 응용 프로그램이 동기화됩니다. 이제 상위 응용 프로그램 타일의 Sync 버튼을 눌러주세요. 오른쪽에 새로운 패널이 나타납니다 (아래에서 모든 하위 앱이 선택되어 있음을 주의하세요):

기본값을 유지한 채로 위쪽의 동기화 버튼을 누르고 Argo CD가 모든 응용 프로그램으로 동기화 작업을 연쇄적으로 전파하는 것을 관찰해보세요:

Velero 응용 프로그램 배포가 실패할 것이며, 읽는 이들이 Argo CD에서 응용 프로그램 문제를 진단하고 익히는 연습을 위해 명시적으로 SyncError 상태로 남겨질 것입니다. Argo CD 응용 프로그램 문제를 진단하는 방법에 대해 읽는 이들을 위한 힌트 섹션을 참조하세요.

모든 것이 잘 진행된다면, 모든 애플리케이션에는 녹색 테두리가 있어야 하며 상태는 HealthySynced여야 합니다. 부트스트래핑 프로세스는 일회성 작업입니다. 각 애플리케이션에 대한 이후 Git 변경에서는 Argo CD가 드리프트를 감지하고 필요한 변경 사항을 적용합니다. Argo CD는 Git 리포지토리의 변경 사항을 감지하기 위해 기본적으로 폴링 메커니즘을 사용합니다. 기본 새로 고침 간격3분으로 설정됩니다. 폴링 메커니즘에 의존하는 대신 Git 웹훅의 기능을 활용할 수도 있습니다. Argo CD를 Git 웹훅을 사용하도록 만들고 구성하는 방법은 공식 문서 웹사이트를 방문하여 알아보십시오.

힌트:
원하는 경우 부모 애플리케이션을 SYNC POLICY 필드 값을 Automatic으로 설정하여 자동으로 동기화할 수 있습니다. 자가 치유 및 자동 가지치기를 활성화하려면 PRUNE RESOURCESSELF HEAL 확인란을 선택하십시오:

동기화 실패의 경우 해당 애플리케이션의 쿠버네티스 이벤트를 언제든지 확인할 수 있습니다. 웹 인터페이스를 사용하여 해당 애플리케이션 타일로 이동할 수 있습니다:

그런 다음 응용 프로그램 페이지 헤더의 마지막 동기화 결과 섹션에서 빨간색으로 표시된 동기화 실패 메시지 링크를 클릭하십시오. 새로운 패널이 팝업되며, 동기화 작업이 실패한 이유에 대한 유용한 정보가 표시됩니다:

  • 다음 섹션에서는 단일 CRD를 사용하여 여러 응용 프로그램을 한꺼번에 관리하는 방법에 대해 알아보게 됩니다 – ApplicationSet.
  • Argo CD Application Sets 사용하기

Application Sets은 Argo CD에서 제공하는 또 다른 강력한 기능입니다. ApplicationSet Controller는 Argo CD의 하위 프로젝트로, 템플릿화된 정의를 통해 응용 프로그램 자동화를 추가합니다. 이 기능을 사용하면 응용 프로그램 매니페스트에서 반복을 피할 수 있습니다 (DRY 원칙을 활용합니다).

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: my-app
spec:
  generators:
    - list:
        elements:
          - cluster: dev
            url: https://kubernetes.dev.svc
          - cluster: qa
            url: https://kubernetes.qa.svc
          - cluster: prod
            url: https://kubernetes.prod.svc
  template:
    metadata:
      name: '{{cluster}}-app'
    spec:
      project: default
      source:
        repoURL: https://github.com/myrepo/my-applicationset.git
        targetRevision: HEAD
        path: clusters/{{cluster}}/my-apps
      destination:
        server: '{{url}}'
        namespace: argocd

ApplicationSet 컨트롤러는 Argo CD와 함께 (동일한 네임스페이스 내에서) 설치되며, 새로운 ApplicationSet Custom Resource (CR)의 내용을 기반으로 Argo CD 응용 프로그램을 자동으로 생성합니다.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: dev-app
spec:
  project: default
  source:
    repoURL: https://github.com/myrepo/my-applicationset.git
    targetRevision: HEAD
    path: clusters/dev/my-apps
  destination:
    server: https://kubernetes.dev.svc
    namespace: argocd

참고:
Argo CD 버전 2.3.x부터는 ApplicationSet Controller를 별도로 설치할 필요가 없습니다. 왜냐하면 Argo CD 주요 설치의 일부입니다. Starter Kit은 version >= 2.3.1을 사용하고 있으므로 아무것도 건드릴 필요가 없습니다.

ApplicationSet의 주요 아이디어는 값 목록이 generator로 작동하고 입력 목록 값에 의해 채워지는 template를 가지고 있는 것에 기반을 두고 있습니다. 목록에서 각 항목에 대해 새 응용 프로그램 템플릿이 순차적으로 생성됩니다. 기본적으로는 하나의 ApplicationSet CRD를 정의한 다음 입력 값에 기반하여 원하는만큼의 ArgoCD Application CRD를 생성하도록 합니다. 따라서 여러 개의 Application manifests을 생성하고 처리하는 대신 single manifestApplicationSet을 통해 모든 것을 관리할 수 있습니다.

이 개념은 매개변수화된 애플리케이션 템플릿을 사용하여 multi-clustermulti-environment 설정의 관리도 간소화합니다. Application set에는 List Generators 외에도 다른 생성기가 포함되어 있습니다:

Cluster 생성기: Argo CD에서 정의한 클러스터를 사용하여 애플리케이션을 템플릿화합니다.

argocd app delete starter-kit-apps

Git 생성기: Git 리포지토리의 파일/디렉토리를 사용하여 애플리케이션을 템플릿화합니다.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: cert-manager
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
...

일반적인 ApplicationSet CRD를 사용하는 방법은 아래와 같습니다:

위의 ApplicationSet을 Kubernetes 클러스터에 적용하면 세 개의 Argo CD 애플리케이션이 렌더링됩니다. 예를 들어, dev 환경 애플리케이션은 다음과 같이 렌더링됩니다:

템플릿 엔진은 매우 강력하며 다양한 가능성을 제공합니다. 이 기능에 대해 자세히 알아보려면 주요 ApplicationSet 문서 웹사이트를 방문하십시오.

Argo CD 애플리케이션 제거

Argo CD가 관리하는 애플리케이션을 제거하려면 해당 Git 저장소 소스에서 해당 매니페스트를 삭제하면 됩니다. 앱의 앱 패턴을 사용하여 생성된 애플리케이션의 경우 CLI 또는 웹 인터페이스를 통해 부모 앱만 삭제해야 합니다. 그러면 모든 하위 애플리케이션이 프로세스의 일부로 삭제됩니다.

  • argocd CLI를 사용하여 starter-kit-apps 부모 애플리케이션(하위 앱 포함)을 삭제하는 방법은 다음과 같습니다:
  • 부모 앱이 삭제될 때 하위 앱 및 모든 리소스가 삭제되도록 보장하려면 해당 Application definition에 적절한 finalizer를 추가해야 합니다:

Source:
https://www.digitalocean.com/community/developer-center/implementing-gitops-using-argo-cd