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 애플리케이션, 프로젝트, 리포지터리, 클러스터 자격 증명 같은 설정 값을 쿠버네티스 매니페스트를 이용해 선언
쿠버네티스 클러스터에 배포하려는 애플리케이션 인스턴스를 의미
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: sample-app
namespace: argocd
spec:
project: default
source:
repoURL: <GIT_REPO>
targetRevision: HEAD
path: <GIT_PATH>
destination:
server: https://kubernetes.default.svc
namespace: default
ArgoCD 내에서 애플리케이션을 논리적으로 그룹화할 수 있는 리소스
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: applications
namespace: argocd
spec:
description: Example Project
# 매니페스트가 모든 깃 리포지터리에 배포되도록 허용
sourceRepos:
- '*'
# 애플리케이션이 동일한 클러스터의 default 네임스페이스에만 배포되도록 허용
destinations:
- namespace: default
server: https://kubernetes.default.svc
# 네임스페이스를 제외하고 모든 클러스터 범위에서 리소스 생성 거부
clusterResourceWhitelist:
- group: ''
kind: Namespace
프라이빗 리포지터리일 경우, ArgoCD 가 해당 리포지터리에 접근하기 위해서는 접근 가능한 자격 증명이 필요
쿠버네티스 시크릿과 컨피그맵을 사용해 해결
* 아래와 같은 특정 쿠버네티스 레이블을 포함해 시크릿 생성
argocd.argoproj.io/secret-type: repository
apiVersion: v1
kind: Secret
metadata:
name: private-repo
namespace: argocd
labels:
argocd.argoproj.io/secret-type: repository
stringData:
url: git@github.com:argoproj/my-private-repository
sshPrivateKey: |
-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----
ArgoCD 가 여러 클러스터를 관리하고 ArgoCD 가 이미 실행 중인 클러스터에 포함되지 않은 경우 다른 쿠버네티스 클러스터에 대한 액세스 권한 필요
리포지터리 자격 증명과 다른 시크릿 유형
* 아래와 같은 특정 쿠버네티스 레이블을 포함해 시크릿 생성
argocd.argoproj.io/secret-type: cluster
apiVersion: v1
kind: Secret
metadata:
name: mycluster-secret
labels:
argocd.argoproj.io/secret-type: cluster
type: Opaque
stringData:
name: mycluster.com
server: https://mycluster.com
config: |
{
"bearerToken": "<인증 토큰>",
"tlsClientConfig": {
"insecure": false,
"caData": "<base64 로 인코딩된 인증서>"
}
}
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) 을 생명 주기 동안 실행