본문 바로가기
Git-DevOps

GitLab-ArgoCD를 이용한 CD 구축

by 간식주인 2022. 9. 22.

요건

 - GitLab-jenkins 연동과 Pipeline을 통해 구축한 CI를 통해 Manifest 파일을 업데이트 하였다면, k8s cluster에 업데이트 된 파일을 자동으로 배포하기 위해 Argo CD를 이용하여 CD를 구축합니다.

 

환경

  • 1 GitLab Server
  • k8s cluster

Process

  1. k8s, GitLab,jenkins 구축 및 Pipeline 구성 확인
  2. yaml 추출을 위한 kubectl 확장 플러그인 설치
  3. k8s cluster에 Argo CD 배포 및 접속 설정
  4. GitLab-ArgoCD 연동 및 설정
  5. 소스코드 수정 후 CI/CD 작동 확인

주의 사항

 

==================================================================================

1. GitLab,jenkins 구축 및 Pipeline 구성 확인

CD 구성에 앞서 필요한 환경 및 설정이 준비되었는지 확인합니다.

2022.09.20 - [Git-DevOps] - GitLab-Jenkins 연동

 

GitLab-Jenkins 연동 및 Pipeline을 이용한 CI 구축

사설 GitLab을 구축하고 k8s cluster에 jenkins 설치까지 되었다면, 이제 본격적으로 CI를 위한 GitLab-Jenkins간 연동을 진행해보도록 하겠습니다. 요건  - GitLab에서 Application code push 시 자동으로 빌드..

enginnersnack.tistory.com

 

2. Yaml 추출을 위한 kubectl 확장 플러그인 설치

Control Plane에서 kubectl 확장 플러그인 설치를 위한 "krew"를 설치합니다.

(
  set -x; cd "$(mktemp -d)" &&
  OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
  ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
  KREW="krew-${OS}_${ARCH}" &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
  tar zxvf "${KREW}.tar.gz" &&
  ./"${KREW}" install krew
)

export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"
source ~/.bashrc

 

krew 설치가 완료되었다면 2개의 플러그인을 설치합니다.

ns : 네임스페이스를 쉽게 변환해주는 플러그인

neat : yaml 추출 시 불필요한 부분을 삭제하여 단정하게 볼 수 있는 플러그인

kubectl krew install ns
kubectl krew install neat

 

3. k8s cluster에 Argo CD 배포

k8s cluster에 Argo CD 배포를 위한 네임스페이스를 생성하고 ns 플러그인을 통해 기본 네임스페이스로 지정합니다.

kubectl create namespace argocd
kubectl ns argocd

 

명령어를 통해 Argo CD를 배포합니다.

kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

 

kubectl 조회 명령어로 정상적으로 배포되었는지 확인합니다.

kubectl get all -o wide

 

조회한 정보중 "argocd-server" 라는 이름의 서비스가 Cluster IP로 설정되어 있어서 외부에서 ArgoCD 관리 페이지에 접속할 수 없습으므로 Type을 ClusterIP에서 NodePort로 변경합니다.

변경하는 과정은 해당 서비스의 내용을 neat 플러그인을 이용하여 단정한 yaml로 추출한 후 apply 명령어로 변경하는 방식입니다.

*yaml 파일을 수정하는 경우 라인을 잘 맞추어서 작성합니다.

kubectl get svc argocd-server -o yaml |kubectl neat > argocd-server-svc.yml
vi argocd-server-svc.yml
(type 변경)
kubectl apply -f argocd-server-svc.yml

 

노드포트 번호를 확인합니다.

kubectl get service -o wide

 

ArgoCD 웹페이지에 접속하기 위해 암호를 평문으로 가져옵니다.

kubectl get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

 

워커노드의 공인아이피와 확인한 노드번호로 웹페이지에 접속한 후 로그인을 진행합니다.

admin/확인한 비밀번호

 

4. GitLab-ArgoCD 연동 및 설정

Argo CD - Git Repository 연결을 위해 화면 좌측 Configuration 톱니 바퀴 > Repositories > CONNET REPO USING HTTPS를 클릭합니다.

 

연결에 필요한 정보를 아래와 같이 입력합니다.

Type : git

Project : default

Repository URL : {Manifest 파일이 있는 GitLab Repository URL}

Username/Password : GitLab에 로그인하기 위한 계정

설정 하단부분에 인증서 관련 에러를 막기 위해 Skip server verification을 체크합니다.

 

정상적으로 연결된 것을 확인할 수 있습니다.

 

이제 자동화 배포를 위한 CD를 구축하기 위해 설정을 진행합니다.

Argo CD에서 좌측화면 상단 Application > + NEW APP 클릭한 후 아래와 같이 입력합니다.

Application Name : spring-app(임의 지정 가능)

Project Name : default

SYNC POLICY : Manual

(*Manual : 수동 싱크 방식, Automatic : 자동 싱크 방식) 

 

연결할 Git Repo를 선택한 후 Path를 지정합니다.

REPO URL : 

TARGET REVISION : HEAD

PATH : .

 

DESTINATION 으로 Local Kube Cluster(argocd가 배포된 클러스터), namespace로 default를 선택합니다.

Cluster URL : https://kubernetes.default.svc  

Namespace : default

이후 Create을 클릭합니다.

 

모든 설정을 마친 후 Sync를 클릭하여 배포를 진행하여 Status를 확인합니다.

 

Manual Sync 방식 테스트를 완료했다면 App DETAILS을 클릭하여 하단에 ENABLE AUTO-SYNC를 클릭합니다.(자동 배포)

변경 이후 상단에 SAVE를 클릭하여 저장합니다.

 

5. 소스코드 수정 후 CI/CD 작동 확인

이제 CI/CD 설정이 완료되었으므로 로컬 PC에서 소스코드를 수정한 뒤 애플리케이션 빌드 및 배포가 자동으로 이루어지는지 확인합니다.

기존 index.html을 수정한 뒤 이미지와 css를 추가합니다.(단순 텍스트 수정도 괜찮습니다.)

 

수정한 내용을 GitLab에 push 합니다.

git add .
git commit -m "create web project"
git push origin main

 

jenkins pipelin과 argo CD SYNC 상태를 확인합니다.

 

웹 애플리케이션 내용이 정상적으로 변경되었는지 워커 노드의 공인아이피와 노드포트로 접속을 진행합니다.

정상적으로 웹 애플리케이션이 변경된 것을 확인할 수 있습니다.

 

 

[여담]

k8s cluster 구축부터 CI/CD까지 진행을 해보았는데요 만약 여기까지 따라오신분이 있다면 대단하다는 말씀을 드리고싶습니다.

DevOps의 세계를 아주 조금 맛보셨는데요, 앞으로 더 많은 공부를 해서 더욱 실무적이고 디테일한 내용을 전달드릴 수 있도록 하겠습니다 ^^