
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 기반의 프로모션 및 릴리스를 제공하는 오픈소스 도구이다.
Stage → Stage 로 애플리케이션을 점진적으로 승격시키는 과정을 자동화하고, 배포 파이프라인을 단순화 할 수 있다.
ArgoCD와 무엇이 다른가?
애플리케이션의 다양한 환경(개발, 테스트, 스테이징, 프로덕션)을 통과하는 전체 프로모션 과정을 관리
퀄리티 게이트, 성능 지표 등에 기반한 자동화된 승격 결정 메커니즘을 제공
프로모션 프로세스에 승인 워크플로우, 정책 검사, 규정 준수 게이트를 통합
복잡한 시스템(마이크로 서비스)에서 일관된 배포 보장
Kargo의 특징
GitOps 원칙 준수
프로모션 워크 플로우
점진적 배포 지원
ArgoCD와 통합
복잡한 배포 오케스트레이션
거버넌스 및 감사
공식문서를 참고해 helm으로 설치한다.
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 접속 시 비밀번호로 사용된다.
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
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를 제공한다.)

기본적으로 argoRollout이 비활성화 되어 있으므로, 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
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 로 설정해준다.
https://github.com/akuity/kargo-simple
기본적으로 위의 예제를 따라가며, 추가로 ArgoCD를 이용해 배포 단계도 진행한다.

위와 같은 프로젝트가 생성 될 것이다.
dev , staging , prod
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: {}
Stage별 Application이 생성 되었다.

새로운 버전의 이미지를
dev→staging→prod순으로 수동 승격해본다.
promote into stage를 통해 스테이지별 순서대로 배포한다.


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

→ ArgoCD에도 새로운 버전으로 잘 배포된 것을 확인할 수 있다.
가볍게 예제를 통해 Kargo가 어떻게 사용되는 지 확인해보았다.
ArgoCD를 처음 사용했을 때, GitOps 기반의 자동 배포라는 것이 좋았고, 가장 좋았던 것은 쉽고 직관적인 UI 였다.
Kargo 또한 UI가 친숙하고 직관적이라 같은 느낌을 받았다.
앞으로 사용할 기회가 많을 것 같은 생각이고, Argo로는 할 수 없었던 스테이지별 직관적인 확인이 가능하다는 것이 좋은 것 같다.
또한, 스테이지별로 자동 테스트 및 연속 배포가 가능하다.
현재 제공중인 서비스에 도입해 볼 것이고, 나중에 Kargo 후기로 다시 작성하겠다.