Kargo 사용해 보기

NOHHYEONGJUN·2025년 3월 28일

쿠버네티스

목록 보기
20/23
post-thumbnail

0. Kargo?

Kargo is designed to offer a flexible and intuitive layer atop existing GitOps tools.
It enables you to define and manage the relationships between multiple application instances deployed across environments.

Kargo는 쿠버네티스 환경에서 GitOps 기반의 프로모션 및 릴리스를 제공하는 오픈소스 도구이다.

StageStage 로 애플리케이션을 점진적으로 승격시키는 과정을 자동화하고, 배포 파이프라인을 단순화 할 수 있다.

 

ArgoCD와 무엇이 다른가?

  1. 애플리케이션의 다양한 환경(개발, 테스트, 스테이징, 프로덕션)을 통과하는 전체 프로모션 과정을 관리

  2. 퀄리티 게이트, 성능 지표 등에 기반한 자동화된 승격 결정 메커니즘을 제공

  3. 프로모션 프로세스에 승인 워크플로우, 정책 검사, 규정 준수 게이트를 통합

  4. 복잡한 시스템(마이크로 서비스)에서 일관된 배포 보장

 

Kargo의 특징

  1. GitOps 원칙 준수

    • Git을 단일 진실 소스(single source of truth)로 활용하여 모든 변경사항을 추적하고 감사
  2. 프로모션 워크 플로우

    • 애플리케이션을 개발 환경에서 테스트, 스테이징, 프로덕션 환경으로 체계적으로 승격시키는 과정을 자동화
  3. 점진적 배포 지원

    • 카나리 배포, 블루/그린 배포 등 다양한 배포 전략을 지원
  4. ArgoCD와 통합

    • Argo CD와 함께 작동하여 선언적 배포 기능을 확장
  5. 복잡한 배포 오케스트레이션

    • 멀티 클러스터, 멀티 환경 설정에서 배포 과정을 조율
  6. 거버넌스 및 감사

    • 승인 프로세스와 변경 이력 추적

 


 

 


1. Kargo 설치

공식문서를 참고해 helm으로 설치한다.

1. 패스워드 및 서명 키 생성

pass=$(openssl rand -base64 48 | tr -d "=+/" | head -c 32)
echo "Password: $pass"
hashed_pass=$(htpasswd -bnBC 10 "" $pass | tr -d ':\n')
signing_key=$(openssl rand -base64 48 | tr -d "=+/" | head -c 32)

→ 생성된 pass 환경 변수는 Kargo 접속 시 비밀번호로 사용된다.

 

2. 생성한 패스워드 및 키를 이용해 Kargo 설치

helm install kargo \
  oci://ghcr.io/akuity/kargo-charts/kargo \
  --namespace kargo \
  --create-namespace \
  --set api.adminAccount.passwordHash=$hashed_pass \
  --set api.adminAccount.tokenSigningKey=$signing_key \
  --wait

 

3. Kargo UI 접속 설정

k get svc -n kargo
NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE
kargo-api               NodePort    10.233.47.76   <none>        443:32641/TCP   7h5m
kargo-webhooks-server   ClusterIP   10.233.30.20   <none>        443/TCP         7h5m

→ NodePort로 접속할 것이므로, kargo-api svc 수정. (kargo-api가 접속할 UI를 제공한다.)

 

4. 접속 성공


 

 


2. argoRollout 활성화

기본적으로 argoRollout이 비활성화 되어 있으므로, argoRollout을 배포해 활성화 해준다.

1. argoRollout 배포

kubectl get crd | grep rollouts

kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml

 

2. kargo upgrade

helm upgrade --install kargo oci://ghcr.io/akuity/kargo-charts/kargo \
  --namespace kargo \
  --create-namespace \
  --set argoRollouts.enabled=true \
  --set-string api.adminAccount.passwordHash="$hashed_pass" \
  --set-string api.adminAccount.tokenSigningKey="$signing_key"

→ argoRollouts.enabled=true 로 설정해준다.

 


 

 


3. Example

https://github.com/akuity/kargo-simple
기본적으로 위의 예제를 따라가며, 추가로 ArgoCD를 이용해 배포 단계도 진행한다.

1. 예제 배포 시

위와 같은 프로젝트가 생성 될 것이다.

 

2. 구성 요소

  1. Stage
    • 배포 환경 단계를 나타낸다.
      - ex) dev , staging , prod
  2. Warehouse
    • 버전 정보(artifact)를 저장한다.
    • Git repo, Helm repo, OCI registry 등에서 버전 정보를 추적한다.
    • ArgoCD가 sync할 대상 애플리케이션 버전을 결정하는 기준이 된다.
  3. Promotion
    • 특정 환경에서 검증된 artifcat를 다음 단계로 자동 승격(promote) 한다.
    • 조건 : Health Check 통과 , 수동 승인 , 테스트 결과 등

 

3. ArgoCD Application 추가

ArgoCD에 Stage별로 배포되도록 Application을 작성해 배포한다.

중요한 부분은 Annotation에
→ kargo.akuity.io/authorized-stage: project-name:stage-name 을 추가해주어야 한다.
→ Kargo 컨트롤러가 ArgoCD의 권한이 필요하기 때문이다.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook-dev
  namespace: argocd
  annotations:
    kargo.akuity.io/authorized-stage: "kargo-simple:dev"
    kargo.akuity.io/allow-mutations: "true"
spec:
  project: default
  source:
    repoURL: https://github.com/nohhyeongjun/kargo-simple.git
    path: env/dev
    targetRevision: main
  destination:
    server: https://kubernetes.default.svc
    namespace: guestbook-simple-dev
  syncPolicy:
    automated: {}
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook-staging
  namespace: argocd
  annotations:
    kargo.akuity.io/authorized-stage: "kargo-simple:staging"
    kargo.akuity.io/allow-mutations: "true"
spec:
  project: default
  source:
    repoURL: https://github.com/nohhyeongjun/kargo-simple.git
    path: env/staging
    targetRevision: main
  destination:
    server: https://kubernetes.default.svc
    namespace: guestbook-simple-staging
  syncPolicy:
    automated: {}
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook-prod
  namespace: argocd
  annotations:
    kargo.akuity.io/authorized-stage: "kargo-simple:prod"
    kargo.akuity.io/allow-mutations: "true"
spec:
  project: default
  source:
    repoURL: https://github.com/nohhyeongjun/kargo-simple.git
    path: env/prod
    targetRevision: main
  destination:
    server: https://kubernetes.default.svc
    namespace: guestbook-simple-prod
  syncPolicy:
    automated: {}

 

4. ArgoCD Application 생성 성공

Stage별 Application이 생성 되었다.

 

5. Stage별 승격 프로세스 확인

새로운 버전의 이미지를 devstagingprod 순으로 수동 승격해본다.

promote into stage를 통해 스테이지별 순서대로 배포한다.

→ 새로운 이미지로 각 스테이지별로 수동 배포를 성공한 것을 확인할 수 있다.

 

→ ArgoCD에도 새로운 버전으로 잘 배포된 것을 확인할 수 있다.


 

 


4. 결론

가볍게 예제를 통해 Kargo가 어떻게 사용되는 지 확인해보았다.

ArgoCD를 처음 사용했을 때, GitOps 기반의 자동 배포라는 것이 좋았고, 가장 좋았던 것은 쉽고 직관적인 UI 였다.

Kargo 또한 UI가 친숙하고 직관적이라 같은 느낌을 받았다.

앞으로 사용할 기회가 많을 것 같은 생각이고, Argo로는 할 수 없었던 스테이지별 직관적인 확인이 가능하다는 것이 좋은 것 같다.

또한, 스테이지별로 자동 테스트 및 연속 배포가 가능하다.

현재 제공중인 서비스에 도입해 볼 것이고, 나중에 Kargo 후기로 다시 작성하겠다.


profile
Cloud/DevOps & Network Virtualization에 관심 있는 대학생입니다. 🐳

0개의 댓글