새소식

AWS/EKS

[PKOS Study 3주차] GitOps System - ArgoCD 설치

  • -

CloudNet@ 팀의 가시다님께서 Leading 하시는 PKOS 2기 Study 내용 요약

해당 Kubernetes Study 는 '24단계 실습으로 정복하는 쿠버네티스' 책을 기반으로 진행 중입니다.

 

 

이번 포스팅에서는 ArgoCD 를 설치하고 실행하는 방법에 대해 알아보겠습니다.



 

1. ArgoCD

쿠버네티스 GitOps 환경에서 지속적인 배포를 위한 오픈소스 도구

기본적인 GitOps 아키텍처는 다음과 같습니다.
예전에 구축했던 GitOps 아키텍처인데, 현재 Anchore는 Harbor 의 Trivy 로 대체하였습니다.

 

GitOps 아키텍처의 흐름

  1. 소스코드 수정 및 Git Push
  2. Jenkins 등 빌드 도구에서 코드 변경 감지 및 Image Build
  3. 빌드된 이미지를 Harbor 등의 Image Registry 에 저장
  4. 빌드 도구에서 ArgoCD 가 바라보는 yaml 파일의 Image Tag 정보 변경
  5. yaml 파일의 변화를 감지한 ArgoCD가 해당 이미지를 Pull 해서 쿠버네티스에 새로 배포

 

 

2. ArgoCD 설치

해당 포스팅에서는 ArgoCD 를 Helm Chart로 설치할 예정입니다.

설치할 helm chart 링크는 아래와 같습니다.

 

argo-cd 5.27.3 · argoproj/argo

A Helm chart for Argo CD, a declarative, GitOps continuous delivery tool for Kubernetes.

artifacthub.io

 

 

2.1. 사전 준비

  • Helm 설치
  • Kubernetes by kops
  • Personal Domain
  • GitLab 설치

 

2.2. Helm Repo Add & Config

helm repo add argo https://argoproj.github.io/argo-helm
helm repo update

 

2.3. ArgoCD 설치

kubectl create ns argocd
helm install argocd argo/argo-cd --set server.service.type=LoadBalancer --namespace argocd --version 5.19.14

 

 

ArgoCD 접속 URL 확인

kubectl get svc -n argocd

 

 

ArgoCD 최초 비밀번호 확인

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
ID: admin
PW: <위 명령어 결과값 입력>

 



3. ArgoCD 활용

ArgoCD 를 활용하기 위해서는 Application & Repository 등록해야합니다.

 

Application

ArgoCD 를 통해 배포할 Application
ArgoCD 가 지속적으로 체크할 yaml 파일이 있는 저장소와 해당 파일을 지정

 

Repository

ArgoCD 가 배포할 Application 의 yaml 파일이 위치한 Repository
Repository 접근 권한 인증에 사용

 

Application 과 Repository 를 UI 에서 등록할 수도 있지만 CLI 에서 명령어를 통해 등록이 가능합니다.

 

 

CLI 를 통한 ArgoCD Repo & App 등록 방법

  1. ArgoCD CLI
  2. kubectl apply

 

ArgoCD cli 를 사용하면 ArgoCD 의 다양한 기능을 활용할 수 있으나,
CLI 를 설치해야되며 ArgoCD 에 로그인을 한 번 더 해야된다는 단점이 있습니다.

 

여기서는 kubectl 로 간단하게 배포를 해보겠습니다.

 

 

3.1. ArgoCD Repository 등록

ArgoCD 는 Repository 를 kubernetes secret 리소스로 관리합니다.

다음과 같이 Secret.yaml 파일을 생성해줍니다.

 

apiVersion: v1
kind: Secret
metadata:
  name: <SECRET_NAME>  # Secret 오브젝트 네임
  namespace: argocd    # Namespace 는 반드시 ArgoCD 가 배포된 Namespace 로 지정해야 됩니다.
  labels:
    argocd.argoproj.io/secret-type: repository
stringData:
  type: git
  url: https://<GIT_URL>
  # https://gitlab.kimalarm.net/root/test-stg.git
  username: <GIT_USER>            # Git Repo ID
  password: <GIT_USER_PASSWORD> # Git Repo PW

 

 

해당 secret 을 배포합니다.

kubectl apply -f pkos-secret.yaml

 

이후 ArgoCD 에서 확인할 수 있습니다.

 

3.2. GitLab Repository 에 Application 업로드

ArgoCD 로 배포할 Application 을 GitLab 에 Push 해봅시다.

 

간단한 RabbitMQ 애플리케이션을 배포할 예정입니다.

 

rabbitmq 11.12.0 · bitnami/bitnami

RabbitMQ is an open source general-purpose message broker that is designed for consistent, highly-available messaging scenarios (both synchronous and asynchronous).

artifacthub.io

 

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm fetch bitnami/rabbitmq --untar --version 11.10.3

 

별도로 지정한 yaml 파일을 배포하기 위해 새로운 yaml 파일을 생성합니다.

cd rabbitmq
cp values.yaml my-values.yaml

 

이후 GitLab 에 Push 합니다.

git add . & git commit -m "Add Rabbit MQ"
git push -u origin main

 

 

3.3. ArgoCD Application 등록

ArgoCD 는 Application 를 별도의 kubernetes crd 리소스로 관리합니다.

 

다음과 같이 app.yaml 파일을 작성해줍니다.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: rabbitmq-helm
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io

spec:
  project: default

  source:
    repoURL: https://gitlab.kimalarm.net/root/test-stg.git    # values.yaml 이 위치한 Repo
    path: rabbitmq
    targetRevision: HEAD
    helm:
      valueFiles:
      - my-values.yaml

  destination:
    namespace: rabbitmq
    server: https://kubernetes.default.svc

  syncPolicy:
    # automated:        # Auto Sync 옵션
    #   prune: true
    #   selfHeal: true
    syncOptions:
    - CreateNamespace=true

 

 

Application 등록

kubectl apply -f rabbitmq-helm-argo-application.yml

 

현재, AutoSync 가 비활성화 되어 있기 때문에 수동으로 Sync 를 눌러줘야 작동합니다.

 

 

Contents

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