1. ArgoCD
ArgoCD 는 Git 을 배포의 원천으로 사용하는 GitOps CD 도구입니다.
GitOps 특성상 애플리케이션 자체의 소스코드와 배포에 해당되는 소스코드를 별개로 관리하는 것이 일반적입니다.
Git 에 작성된 매니페스트 기반 으로 쿠버네티스의 리소스 상태를 일치 시키므로 선언적인 리소스 관리가 가능하고,
배포 시 리소스나 런타임 설정만 변경할 경우 애플리케이션의 빌드 없이 빠르게 배포 및 롤백이 가능하다는 장점이 있습니다.
Argo Rollouts 이나 ArgoCD Notifications 등을 추가로 적용해 다양한 배포 전략을 사용하거나 배포 관련 알림을 설정 하는 등 좋은 확장성을 가지고 있습니다.
1.1. ArgoCD 특징
배포 자동화 (Automated Deployment)
* 동작 방식
1) Git Commit 또는 CI 파이프라인이 동작
2) 수동 동기화를 트리거
3) ArgoCD 컨트롤러가 자동으로 클러스터를 깃 리포지터리에 의도한 상태로 Push
관찰 가능성 (Observability)
ArgoCD 는 애플리케이션 상태가 깃에서 의도한 상태와 동기화되어 있는 지 식별할 수 있는 UI 와 CLI 를 제공
ArgoCD Notifications 엔진을 제공하여 알림 처리 가능
멀티 테넌시 (Multi-Tenancy)
인증을 위한 RBAC 정책 사용하여, 사용자별 권한 관리가 가능
여러 클러스터를 등록하여 하나의 ArgoCD 에서 여러 클러스터 관리 및 배포가 가능
1.2. ArgoCD 핵심 개념
ArgoCD 의 핵심 개념으로는 조정(Reconcilitation) 과 CRD (Custom Resource Definition) 이 있습니다.
조정 (Reconciliation)
깃 리포지터리에 담긴 의도한 상태를 현재 상태의 클러스터와 일치하는 것
기본적으로 180초(3분) 마다 조정을 실시합니다.
조정 루프
1) ArgoCD 는 Git Repository 의 Helm Chart 를 쿠버네티스 YAML 로 렌더링
2) 현재 클러스터를 의도한 상태 (Desired State) 와 비교
동기화 상태 (Sync Status)
ArgoCD 가 운영 중인 쿠버네티스 리소스와 의도한 상태를 비교하여,
다르다고 판단하면 자동 혹은 수동으로 kubectl apply 를 사용해 템플릿화된 파일을 적용
ArgoCD CRD (Custom Resource Definition)
ArgoCD 애플리케이션, 프로젝트, 리포지터리, 클러스터 자격 증명 같은 설정 값을 쿠버네티스 매니페스트를 이용해 선언
쿠버네티스 클러스터에 배포하려는 애플리케이션 인스턴스를 의미
ArgoCD 내에서 애플리케이션을 논리적으로 그룹화할 수 있는 리소스
프라이빗 리포지터리일 경우, ArgoCD 가 해당 리포지터리에 접근하기 위해서는 접근 가능한 자격 증명이 필요
쿠버네티스 시크릿과 컨피그맵을 사용해 해결
* 아래와 같은 특정 쿠버네티스 레이블을 포함해 시크릿 생성
argocd.argoproj.io/secret-type: repository
ArgoCD 가 여러 클러스터를 관리하고 ArgoCD 가 이미 실행 중인 클러스터에 포함되지 않은 경우 다른 쿠버네티스 클러스터에 대한 액세스 권한 필요
리포지터리 자격 증명과 다른 시크릿 유형
* 아래와 같은 특정 쿠버네티스 레이블을 포함해 시크릿 생성
argocd.argoproj.io/secret-type: cluster
1.3. ArgoCD 용어
애플리케이션 (Application)
ArgoCD 에서 CRD 로 규정하는 리소스 그룹
애플리케이션 소스 타입 (Application Source Type)
Helm, Kustomize 과 같은 애플리케이션을 구축하는 데 사용하는 도구
타깃 상태 (Target State)
애플리케이션의 의도한 상태 (Git Repo 에 있는 상태)
현재 상태 (Live State)
애플리케이션의 현재 상태 (클러스터에 배포된 상태)
동기화 상태
현재 상태와 타깃 상태가 일치하는 지 확인
동기화 (Sync)
쿠버네티스 클러스터에 변화를 적용해 애플리케이션을 타깃 상태로 변경
동기화 동작 상태 (Sync Operation Status)
동기화 단계에서 작업의 성공 실패 여부
새로고침 (Refresh)
깃 리포지터리와 현재 상태의 차이점 비교
서비스 상태 (Health Status)
애플리케이션이 요청을 받을 수 있고 운영 중인 상태인 지 여부
2. ArgoCD 아키텍처
ArgoCD 핵심 구성 요소는 쿠버네티스 컨트롤러로 구성
컨트롤러는 ArgoCD 의 현재 상태를 의도한 상태와 비슷하게 유지하려고 주기적으로 체크
쿠버네티스 컨트롤러 작동 방식
1) 클러스터 상태 관찰
2) 필요한 경우 변경 사항을 적용하거나 요청
2.1. ArgoCD 핵심 구성 요소
API Server
웹 UI, CLI, Argo Events, CI/CD 시스템과 같이 다른 시스템과도 API 를 통해 상호 작용
* 역할
- 애플리케이션 관리 및 상태 보고
- 애플리케이션 트리거 작업
- 깃 리포지터리와 쿠버네티스 클러스터 관리
- 인증과 SSO 지원
- RBAC 정책 강화
Repository Server
애플리케이션 매니페스트를 보관하는 깃 리포지터리의 로컬 캐시 유지
다른 Argo 컴포넌트는 쿠버네티스 매니페스트를 가져오기 위해 Repository Server 에 요청
* 요청에 필요한 매개 변수
- 리포지터리 URL
- 깃 버전
- 애플리케이션 경로
- 템플릿 세부 설정 : Helm 의 values.yaml 등
Application Controller
지속적으로 애플리케이션의 현재 상태 확인 및 깃 리포지터리의 의도한 상태와 비교
리소스를 수정 했는 데 동기화 되지 않은 경우, 컨트롤러가 상태 동기화 시도
사용자가 생성한 훅(hook) 을 생명 주기 동안 실행