CI/CD with Minikube

(3) Jenkins-ArgoCD

Younghoon Yun
KLleon
7 min readJan 20, 2023

--

들어가며

프로그램 실행에 필요한 환경을 이미지로 만들어 컨테이너 환경에서 애플리케이션을 운영하는 방식이 주류를 이루게 되면서, 컨테이너 오케스트레이션 시스템이 중요하게 여겨지기 시작했습니다. 또한 CI뿐만 아니라 애플리케이션 배포 자동화까지 Kubernetes에서 구축할 수 있게 되었습니다.

이번 글에서는 ArgoCD를 배포하여, CI와 이어지는 CD 를 구축하는 방법을 다루도록 하겠습니다.

CD란?
CD란 Continuous Delivery의 약자로 업데이트된 코드가 있을 때, 업데이트가 반영된 애플리케이션 배포를 자동화 하는 것입니다.

ArgoCD

이번 글에서는 Github과 연동하여 쿠버네티스에서 간편한 CD 구축을 제공하는 ArgoCD를 이용하여 파이프라인을 구축하겠습니다.

ArgoCD

1. Deploy
배포는 ArgoCD의 공식 사이트( 링크 )를 기반으로 진행합니다.
ArgoCD는 Kubernetes 환경을 목표로 한 오픈소스이기 때문에, ArgoCD 또한 kubernetes에 배포됩니다. 공식 문서에 맞추어 큰 이유가 없다면 아래 명령어와 같이 배포를 진행하고, ArgoCD에 접근하기 위해 port forwarding을 합니다.
port forwarding 이외에도 NodePort, Ingress로 ArgoCD에 접근하는 방법이 있지만 이번 글에서는 간단한 방법인 port forwarding으로 배포하겠습니다.

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

kubectl port-forward svc/argocd-server -n argocd 8080:443

2. Pipeline
port forwarding된 ArgoCD에 접속하여 로그인하면, 아래와 같이 ArgoCD의 App 관리 창으로 이동하게 됩니다.

ArgoCD App

ArgoCD의 파이프라인은 App단위로 관리되며 ArgoCD의 App은 하나의 Github 레파지토리와 연동되어 해당 레파지토리의 업데이트를 감지하여 자동 배포를 진행합니다. 이를 ArgoCD에선 Sync 라고 부르며, Sync에 대한 정책은 사용자가 설정할 수 있습니다.

이후 + NEW APP 버튼을 눌러 공식 문서에 따라 App을 생성하면 아래와 같이 연결된 Github 레파지토리에 있는 kubernetes yaml 파일이 자동으로 배포됩니다.

ArgoCD Pipeline

위와 같이 화면이 나온다면, 정상적으로 ArgoCD 파이프라인이 구축된 것이며, Status 가 Healthy가 아닌 다른 상태일 경우 파일 확인이 필요할 수 있습니다.

하지만 현재까지 구축한 것만 진행하게 되면, Github 레파지토리의 코드를 직접 수정해야 하기 때문에 완벽한 자동화 파이프라인으로 볼 수 없습니다.
따라서 추가적으로 Code Update 파이프라인이 필요합니다.

Jenkins-Github-ArgoCD

일반적으로 Kubernetes에 배포되는 애플리케이션은 Python이나 Java 등의 언어로 작성된 애플리케이션 코드와 kubernetes에 이를 배포하기 위한 파일로 관리되며 배포됩니다.
따라서 애플리케이션 코드가 업데이트 되었을 때, 자동으로 kubernetes 파일을 업데이트하여 ArgoCD가 Sync를 맞추게 하는 스텝이 필요한데, 이를 이전에 다루었던 Jenkins로 구축해보겠습니다.

1. Credential 생성
Jenkins 파이프라인이 Github에 접근하여 Push까지 하기 위해서는 Github Credential이 필요합니다. 이때 Github Credential은 Username with Password 로 생성합니다. password엔 github auth token을 입력해주시면 됩니다.

2. Jenkinsfile 작성
다음은 kubernetes 파일이 있는 레파지토리에 Push할 Jenkinsfile 작성입니다. kubernetes에 배포되는 애플리케이션은 Docker Image로 배포되고, Tag를 통해 변경이 반영되기 때문에 우리는 새로 빌드된 이미지의 Tag를 자동으로 업데이트해줄 파이프라인이 필요합니다.
Ubuntu 에선 sed 명령어를 통해 shell에서도 파일을 수정할 수 있는데, sed를 이용하여 imagetag 를 변경해주는 Jenkinsfile을 아래와 같이 작성하여 레파지토리에 Push 합니다.

node {
def app

stage('Clone repository') {
checkout scm
}
stage('Update GIT') {
script {
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
withCredentials([usernamePassword(credentialsId: 'github', passwordVariable: 'GIT_PASSWORD', usernameVariable: 'GIT_USERNAME')]) {
sh "git config user.email {email}"
sh "git config user.name {user name}"
sh "sed -i 's+{Bef target code}.*+{Aft target code}+g' {file name}"
sh "git add ."
sh "git commit -m 'Done by Jenkins Job changemanifest'"
sh "git push https://${GIT_USERNAME}:${GIT_PASSWORD}@github.com/{/{repo name}.git HEAD:main"
}
}
}
}
}

이후 위 파이프라인이 실행되면, kubernetes 파일이 있는 레파지토리가 업데이트 되고, ArgoCD가 이를 감지하여 Sync를 맞춤으로써 자동 배포가 이루어지게 됩니다.

마치며

이번 글에서는 CI/CD의 마지막인 CD를 ArgoCD를 이용하여 구축하는 방법에 대해서 다루었습니다. ArgoCD만을 이용하면 완벽한 자동화 파이프라인이 아니지만, Jenkins와 같이 사용하게 되면 프로그램 코드만 수정함으로써 완벽하게 자동 배포까지 이어지는 파이프라인을 구축할 수 있게 됩니다.

이를 통해 배포에 소모되는 시간이 크게 단축되는 경험을 했기 때문에, 도커 이미지 빌드 및 푸쉬하는 파이프라인까지 추가하여 애플리케이션 코드 업데이트만으로 배포까지 진행되는 CI/CD 전체를 유기적으로 구축해보시면 좋을 것 같습니다.

이것으로 Kubernetes CI/CD 구축을 마치겠습니다.

--

--