-
ArgoCD를 이용한 GitOps 구성Kubernetes 2025. 3. 23. 21:10
GitOps란?
GitOps는 애플리케이션 배포 및 인프라 관리를 Git을 중심으로 자동화하는 운영 방식입니다. GitOps는 Git 저장소를 Single Source of Truth으로 삼아 선언적 구성과 자동화를 기반으로 Kubernetes 클러스터나 기타 시스템을 관리합니다. 이는 CI/CD와 DevOps의 확장된 개념으로, 특히 Kubernetes 환경에서 효과적입니다.
GitOps의 핵심 개념
- Git을 Single Source of Truth
- 모든 인프라 구성 및 애플리케이션 정의(예: Kubernetes 매니페스트, Helm 차트, Terraform 스크립트 등)를 Git 저장소에 저장합니다.
- 변경 사항은 Git 커밋을 통해 기록되어 투명성과 추적성을 제공합니다.
- 선언적 구성(Declarative Configuration)
- 원하는 시스템 상태(예: Kubernetes 배포 상태)를 선언적으로 정의합니다.
- 시스템은 이 선언된 상태와 동기화되도록 작동합니다.
- 자동 동기화 및 상태 관리
- Git 저장소의 변경 사항이 감지되면, 이를 기반으로 Kubernetes 클러스터나 인프라가 자동으로 업데이트됩니다.
- ArgoCD, Flux 같은 도구를 사용해 Git과 실제 시스템의 상태를 지속적으로 동기화합니다.
- 자동화된 피드백 루프
- 시스템 상태와 Git 저장소 상태를 지속적으로 비교하고, 불일치가 발견되면 알림을 보내거나 자동으로 수정합니다.
- 이를 통해 시스템은 항상 Git에 정의된 상태와 일치하도록 유지됩니다.
테스트 구성 요소 및 목표
목표
- Kubernetes 클러스터에서 애플리케이션을 선언적으로 관리.
- Git을 Single Source of Truth로 사용하여 모든 배포 구성 및 상태 관리.
- Helm을 활용해 애플리케이션 배포 매니페스트를 템플릿화.
- ArgoCD를 사용해 GitOps 방식으로 Kubernetes 클러스터와 애플리케이션의 상태를 자동으로 동기화하고 CI/CD를 자동화.
구성 요소
- Git
- 애플리케이션 코드, Helm 차트 및 Kubernetes 매니페스트 저장소.
- Git의 변경 사항을 기준으로 클러스터 상태를 관리.
- Helm
- Kubernetes 리소스 매니페스트를 템플릿화하여 환경별 설정 관리.
- Helm 차트는 Git 저장소에 저장.
- ArgoCD
- GitOps 도구로, Git에 정의된 상태와 Kubernetes 클러스터를 지속적으로 동기화.
- Git 변경 사항을 감지하여 Kubernetes에 자동으로 배포.
- Kubernetes
- 애플리케이션이 실제로 실행되는 클러스터.
- ArgoCD가 Kubernetes에 필요한 리소스를 적용하고 관리.
연동 설정 및 GitOps 구성 테스트
GitHub personal Access Token 생성
ArgoCD는 GitOps 방식으로 Git 저장소를 통해 Kubernetes 클러스터를 동기화합니다.
GitHub 저장소에 접근하려면 인증이 필요하며, 이를 위해 Personal Access Token(GitHub 토큰)을 사용합니다.- Settings > Developer settings > Personal access tokens > 권한 설정 및 생성
- select repository는 application 소스가 아닌 helm chart 소스 저장소
- 저장소 권한 (Read-only)
- 필수
- Metadata : 저장소 검색, 메타데이터 접근
- Contents : 저장소 내용(파일, 커밋, 브랜치 등)에 대한 읽기
- 옵션
- Pull requests : PR 기반으로 배포를 관리하거나 자동 동기화를 설정한 경우
- Deployments : GitHub Actions 또는 기타 배포 상태를 확인하는 경우
- Webhooks : GitHub 웹훅을 통해 ArgoCD 동기화를 자동화하려는 경우 (Read and write)
- 필수
ArgoCD에 GitHub repository 등록
- Settings > Repositories > +CONNECT REPO
- connection method : HTTPS
- type : git
- passowrd : personal access token
+) SSH 등록 방법
- Known_hosts 등록
Settings > Repository certificates and known hosts
저장소 연결
- Settings > Repositories > +CONNECT REPO
- connection method : SSH
- Repository URL : ssh clone url
- SSH private key data
- 공개키(.pub)는 저장소에 액세스키로 등록
ArgoCD APP 생성
Applications > +NEW APP
- GENERAL
- Appication Name : ArgoCD에서 애플리케이션을 구분하는 고유 이름
- Project Name : 애플리케이션이 속할 ArgoCD 프로젝트의 이름
- Sync Policy : 애플리케이션과 Git 저장소 간의 동기화 방식을 정의 (수동/자동)
- SET DELETION FINALIZER : 애플리케이션 삭제 시, ArgoCD가 Kubernetes 리소스를 정리(삭제)할 수 있도록 삭제 Finalizer를 설정
- REPLACE : 기존 리소스를 업데이트하는 대신, 삭제 후 새로 생성
- RETRY : 동기화 실패 시 자동으로 재시도를 수행
- SYNC OPTIONS : 동기화 작업 시 추가적인 동작 방식을 설정할 수 있는 옵션
더보기- Skip Schema Validation: 리소스의 OpenAPI 스키마 검증을 건너뜀
- 스키마 오류가 있어도 리소스를 적용
- 권장: 맞춤형 CRD(Custom Resource Definition)를 사용할 때.
- Auto-Create Namespace: 애플리케이션의 네임스페이스가 존재하지 않으면 자동으로 생성
- 권장: 네임스페이스 생성과 리소스 배포를 한 번에 처리하고 싶을 때.
- Prune Last: 동기화 시 불필요한 리소스 제거(Prune) 작업을 마지막에 수행
- 권장: 리소스 종속성(Dependency)이 중요한 경우.
- Apply Out of Sync Only: 변경된 리소스만 적용
- 권장: 이미 동기화된 리소스는 건너뛰고 싶을 때.
- Respect Ignore Differences: IgnoreDifferences 설정을 준수하여 무시된 차이는 동기화에서 제외
- 권장: 특정 리소스의 상태 차이를 무시하려는 경우.
- Server-Side Apply: 클라이언트 측이 아닌 서버 측에서 리소스 적용을 처리
- Kubernetes 서버가 리소스 머지 및 패치를 담당.
- 권장: 멱등성(Idempotency)을 보장해야 하는 경우.
- Prune Propagation Policy: Prune 작업 시 리소스 제거 방식 설정.
- foreground: 삭제되는 리소스의 종속성도 제거 후 삭제.
- background: 리소스를 삭제 요청 후, 종속 리소스는 백그라운드에서 삭제.
- orphan: 종속 리소스는 그대로 두고 삭제.
- SOURCE
- Git 저장소 URL 및 브랜치, 디렉토리 경로
- DESTINATION
- 애플리케이션을 배포할 Kubernetes 클러스터의 API 서버 URL
- https://kubernetes.default.svc : ArgoCD가 설치된 Kubernetes 클러스터를 기본값으로 사용
- Namespace : 애플리케이션이 배포될 Kubernetes 네임스페이스를 지정
- HELM
- values file 선택
- 여러 환경용 values가 나눠져 있을 경우
- values : 파일의 내용 일부를 직접 입력하여 설정값을 오버라이드
- values file 선택
- 확인
APPP SYNC
- SYNC > SYNCHRONIZE
APP 확인
- tree 뷰
- SYNC STATUS
- DETAIL
- HISTORY AND ROLLBACK
테스트
- 차트 수정
- replica수 1 > 2
- 자동 sync 확인
+) Multiple sources 사용 방법
multiple sources를 사용할 경우(예: Helm Chart는 공식 차트를 이용하고 values는 별도 저장소에서 관리), ArgoCD UI에서는 애플리케이션 생성 시 multiple sources 옵션이 없기 때문에 manifests로 배포해야 합니다.
- targetRevision
- helm chart 저장소 : 차트 버전
- Bitbucket : 브랜치
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: jira annotations: argocd.argoproj.io/sync-options: Prune=confirm spec: destination: namespace: jira server: https://kubernetes.default.svc sources: - repoURL: https://atlassian.github.io/data-center-helm-charts targetRevision: '1.21.3' chart: jira helm: valueFiles: - $values/atlassian-products/jira/values.yaml - repoURL: ssh://git@192.168.0.101:7999/ar/helm-chart-values.git targetRevision: master ref: values project: default syncPolicy: automated: prune: true syncOptions: - CreateNamespace=true
Reference
'Kubernetes' 카테고리의 다른 글
EFK Stack 구성하기 (with Atlassian) (0) 2025.03.23 Prometheus & Grafana - 2) 설치하기 (0) 2025.03.23 Prometheus & Grafana - 1) 개요 (0) 2025.03.23 CloudNativePG (0) 2025.03.23 ArgoCD 설치 (Helm) (0) 2025.03.23 - Git을 Single Source of Truth