새소식

CICD

[CI/CD Study 4주차] ArgoCD 사용 & Autopilot

  • -

CoudNet@ 팀의 가시다님께서 리딩하시는 CI/CD Study 4주차 스터디 내용 정리

 

이번 주차에서는 '예제로 배우는 ArgoCD 책' 기반으로 ArgoCD 에 대해서 학습했습니다.

 

그 중 1~3 강을 진행했으며 그 중 Kubernetes 와 ArgoCD 에 대한 개념은 이전 글에서 다룬 적이 있어 해당 글을 참고하시고,
이번 글에서는 ArgoCD 실습 위주로 작성하려고 합니다.

 

GitOps 개념과 Kubernetes

 

 

GitOps 개념과 Kubernetes

이번에 에이콘출판사에서 예제로 배우는 ArgoCD 책이 출판되었습니다. 한국어로 출간되는 첫 ArgoCD 관련 기술 서적으로 알고 있는데,내용이 굉장히 좋아서 관심이 있다면 한 번 사서 읽어보는 것

kimalarm.tistory.com

 

 

ArgoCD 란 무엇인가 ?? (핵심 용어, 구성 요소 등)

 

 

ArgoCD 란 무엇인가 ?? (핵심 용어, 구성 요소 등)

1. ArgoCD ArgoCD 는 Git 을 배포의 원천으로 사용하는 GitOps CD 도구입니다.GitOps 특성상 애플리케이션 자체의 소스코드와 배포에 해당되는 소스코드를 별개로 관리하는 것이 일반적입니다.Git 에 작성

kimalarm.tistory.com

 



1. ArgoCD 시작하기

 

실습은 Kind 클러스터를 통해 Control Plane 1대를 구성했습니다.

 

1.1. 실습환경 준비 (Kind 구성, ArgoCD 배포)

 

# Kind 클러스터 배포
kind create cluster --name myk8s --image kindest/node:v1.32.8 --config - <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 30000
    hostPort: 30000
  - containerPort: 30001
    hostPort: 30001
  - containerPort: 30002
    hostPort: 30002
  - containerPort: 30003
    hostPort: 30003
EOF

# ArgoCD 구성
kubectl create ns argocd
cat <<EOF > argocd-values.yaml
server:
  service:
    type: NodePort
    nodePortHttps: 30002
  extraArgs:
    - --insecure  # HTTPS 대신 HTTP 사용
EOF

# ArgoCD Helm 배포
helm repo add argo https://argoproj.github.io/argo-helm
helm install argocd argo/argo-cd --version 9.0.5 -f argocd-values.yaml --namespace argocd



ArgoCD 최초 비밀번호 확인

 

# 비밀번호 확인
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d ;echo

# ArgoCD UI 서비스 포트 확인
kubectl get svc -n argocd argocd-server

# Mac 의 경우 포트 포워딩된 포트 오픈
open "http://127.0.0.1:30002" # macOS

 



1.2. 데모 애플리케이션 배포 테스트

 

ArgoCD 동작 확인을 위해 ArgoCD CRD 를 통해 간단한 데모 애플리케이션을 실행해보겠습니다.
ArgoCD 배포 시 알아야 할 중요한 용어는 다음과 같습니다.

 

finalizers

 

- ArgoCD Application이 삭제될 때, 그 Application이 배포한 리소스들을 어떻게 처리할지를 제어

- resources-finalizer.argocd.argoproj.io 는 ArgoCD 가 애플리케이션을 삭제할 때,

   해당 앱이 생성한 리소스도 함께 삭제하도록 하는 의미

 

targetRevision

 

- 브랜치명 또는 commit
- HEAD 는 기본 브랜치 최신 커밋을 의미

 

syncPolicy

 

- automated.enable : 자동 동기화/배포 활성화
- automated.prune : ArgoCD 가 바라보고 있는 Git 에서 리소스가 삭제될 경우, 쿠버네티스 클러스터에서도 삭제
- automated.selfheal : 리소스가 Git 이 아닌 클러스터에서 직접 변경이 진행되어 Diff 가 발생할 경우, Git 에 정의된 상태로 변경(복구)
- syncOptions.CreateNamespace : 대상 네임스페이스가 없을 경우, 생성

 

cat <<EOF | kubectl apply -f -
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  source:
    helm:
      valueFiles:
      - values.yaml
    path: helm-guestbook
    repoURL: https://github.com/argoproj/argocd-example-apps
    targetRevision: HEAD
  syncPolicy:
    automated:
      enabled: true
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true
  destination:
    namespace: guestbook
    server: https://kubernetes.default.svc
EOF

 

배포된 애플리케이션의 Self Heal 동작을 확인해보겠습니다.

 

SelfHeal 테스트

 

# 서비스 확인
kubectl get svc -n guestbook

# 서비스 포트 변경
kubectl patch svc -n guestbook guestbook-helm-guestbook -p '{"spec":{"type":"NodePort","ports":[{"port":80,"targetPort":80,"nodePort":30003}]}}'

# 서비스 변경 사항 확인
kubectl get svc -n guestbook

 

 

SelfHeal 이 활성화 되어 있기 때문에, 클러스터에서 직접 변경을 해도 Git 상태로 복원되는 것을 확인할 수 있습니다.
ArgoCD UI 에서 SelfHeal 을 비활성화 한 후 다시 테스트 해보겠습니다.

 

 

# 서비스 확인
kubectl get svc -n guestbook

# 서비스 포트 변경
kubectl patch svc -n guestbook guestbook-helm-guestbook -p '{"spec":{"type":"NodePort","ports":[{"port":80,"targetPort":80,"nodePort":30003}]}}'

# 서비스 변경 사항 확인
kubectl get svc -n guestbook

 

 

서비스 포트가 변경된 것을 확인했습니다.
SelfHeal 이 비활성화 되면, 클러스터에서 직접 수정을 가해도 ArgoCD 가 자동으로 복원을 시키지 않기 때문에 ArgoCD 를 사용할 때는 항상 활성화하는 것이 좋습니다.

 

다음 실습을 위한 리소스 정리

 

kubectl delete applications -n argocd guestbook



1.3. ArgoCD CLI

 

ArgoCD 도 CLI 를 통해 애플리케이션 배포가 가능합니다.

 

CLI 설치

 

# Mac Homebrew 설치
brew install argocd

# 버전 확인
argocd version --client

 

CLI 로그인

 

ArgoCD Server 측에 자격증명을 통한 로그인이 필요합니다.
암호는 초기 비밀번호에서 admin12345 로 변경한 후라 해당 비밀번호로 접속했습니다.

 

# Login
rgocd login 127.0.0.1:30002 --plaintext
Username: admin
Password: admin12345
'admin:login' logged in successfully
Context '127.0.0.1:30002' updated

 

CLI 를 통한 애플리케이션 배포

 

CLI 를 통해서도 ArgoCD 애플리케이션을 배포할 수는 있지만, 그렇게 된다면 GitOps 원칙을 위배하는 것이라 사용에 주의가 필요합니다.

 

# 애플리케이션 배포
argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path helm-guestbook \
  --dest-server https://kubernetes.default.svc --dest-namespace guestbook --values values.yaml

# 애플리케이션 확인
argocd app list
argocd app get argocd/guestbook

# 애플리케이션 싱크
argocd app sync argocd/guestbook
argocd app get argocd/guestbook

# 애플리케이션 삭제
argocd app delete argocd/guestbook

 

 

다음 실습을 위해서 ArgoCD 를 삭제합니다.

 

helm uninstall -n argocd argocd && kubectl delete ns argocd




2. ArgoCD Autopilot



2.1. 개요

 

출처: https://argocd-autopilot.readthedocs.io/en/stable/

 

ArgoCD 를 통해 애플리케이션을 배포하고 관리할 때 겪는 딜레마는 ArgoCD 자체는 어떻게 관리할 것인가입니다.
이를 해결하기 위한 구조로 App of Apps 패턴과 Autopilot 이 존재하는데, 여기서는 Autopilot 에 대해서 학습했습니다.

 

ArgoCD Autopilot 기능

 

  • 깃옵스를 사용해 부트스트랩 ArgoCD 애플리케이션을 생성하고 관리 - ArgoCD 자기 자신의 배포와 구성을 관리할 수 있음
  • 깃허브 리포지터리를 짜여진 구조로 세팅해 새로운 서비스를 추가하고 ArgoCD 수명 주기에 적용
  • 각각 다른 환경에서 애플리케이션을 업데이트하고 승격 (Promotion) 할 수 있게 함
  • 재해 복구 대비, 필요한 모든 유틸리티와 애플리케이션에 대한 장애 조치 클러스터를 부트스트랩
  • ArgoCD 애플리케이션에 시크릿에 대한 암호화 지원 예정

 

2.2. Autopilot 설치

 

Autopilot CLI 설치

 

Autopilot 배포를 위한 CLI 를 설치합니다.

 

# Mac Homebrew 설치
brew install argocd-autopilot

# 버전 확인
argocd-autopilot version

 

그 후, Github 에 ArgoCD Autopilot 을 위한 저장소를 하나 생성해둔 후 토큰도 발급합니다.
저장소는 아무것도 없이 비어있는 상태면 됩니다.

 

Autopilot 부트스트랩

 

export GIT_TOKEN=<자신의 Git Token>
export GIT_REPO=<자신의 Repo>

# 
argocd-autopilot repo bootstrap

 

 

부트스트랩 실행 이후 ArgoCD 가 배포되는 것을 확인할 수 있으며, Github 저장소에 파일이 푸시된 것을 알 수 있습니다.

 

ArgoCD UI 에서는 ArgoCD 애플리케이션 자체가 ArgoCD 로 관리되고 있는 것을 확인할 수 있습니다.

 

 

2.3. Project, Application 배포

 

출처:  https://sungwook-choi.gitbook.io/argocd/argo-cd-project/project

 

 

Autopilot 을 통해 관리되는 프로젝트와 애플리케이션을 배포해보겠습니다.

 

Project 생성

 

Autopilot CLI 를 사용하여 간단하게 프로젝트를 배포하고 Git 과 동기화를 할 수 있습니다.

 

argocd-autopilot project create dev
argocd-autopilot project create prd

 

 

Application 배포

 

마찬가지로 Autopilot CLI 를 사용하여 간단하게 애플리케이션을 배포하고 Git 과 동기화를 할 수 있습니다.

 

argocd-autopilot app create hello-world1 --app github.com/argoproj-labs/argocd-autopilot/examples/demo-app/ -p dev --type kustomize

 

 

또한 이 모든 내용은 Github 에 코드로 저장이 되게 되어 동기화가 자동으로 진행됩니다.

 

 

실습 종료 후 리소스 삭제

 

kind delete cluster --name myk8s

 

Contents

포스팅 주소를 복사했습니다