지난번에 'Jib로 자바 컨테이너 빌드 및 배포하기' 로 도커 이미지를 빌드하고 저장소에 배포하는 방법을 알아봤다.
이번에는 이미지의 태그가 새로운 버전으로 업데이트 될때마다 실행중인 k8s 파드 역시 새로운 버전에 맞게 자동으로 배포하고자 한다.
ArgoCD는 쿠버네티스를 위한 CD 툴이며 GitOps 방식으로 관리되는 manifest(yaml) 파일의 변경사항을 감시하여, 현재 배포된 상태를 Git에 정의해둔 Manfiest 상태와 동일하게 유지 시켜주는 역할을 수행한다.
이 방식을 통해서 Manifest에 정의된 이미지 버전을 수정할때마다 ArgoCD에서 자동으로 감지하여 새로운 버전으로 배포하도록 하고자 한다.
이미지 버전을 수정하기 위한 방법으로 Kustomize 를 활용하였다.
Kustomize는 쿠버네티스 리소스(manifest 파일)를 직접 변경하지 않고 필드를 재정의하여 새로운 쿠버네티스 리소스를 생성할 수 있는 도구이다.
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
images:
- name: my-api-server
newTag: "old-version"
kustomization.yaml 파일이 다음과 같이 정의되어 있을 때 my-api-server 이미지의 태그를 변경하고자 하면 어떻게 해야할까?
직접 파일에 접근해서 newTag 로 재정의된 버전을 수정하는 방법도 있긴 하지만 이방법으로는 자동으로 관리하기에 까다롭다.
Kustomize 명령을 활용하면 kustomize edit set image my-api-server:new-version
과 같은 명령어를 치면 아래와 같이 파일이 변경된 것을 확인할 수 있다.
...
images:
- name: my-api-server
newTag: "new-version"
이제 Kustomize를 활용해 이미지 버전을 수정하고 git에 push하면 자동으로 ArgoCD 에서 변경사항을 감지해 새로운 이미지 버전에 맞게 업데이트할 수 있다.
이미지 버전이 업데이트 되면, 자동으로 manifest 파일 역시 이미지 버전을 동일하게 업데이트하여 git 에 push 해두는 Jenkins 파이프라인을 구성해보자
// change-image-tag.jenkinsfile
pipeline {
agent any
stages {
stage('Pull git repository') {
steps {
git branch: 'main', url: 'https://github.com/yellowsunn/argocd-manifest'
}
}
stage('Install kustomize') {
steps {
sh """
if [ ! -f "${env.WORKSPACE}/kustomize" ]; then
curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
fi
${env.WORKSPACE}/kustomize version
"""
}
}
stage('Change imag tag') {
steps {
sh """
cd $baseDirectory
${env.WORKSPACE}/kustomize edit set image $imageName:$tag
"""
}
}
stage('Push to manifest repo') {
steps {
withCredentials([usernamePassword(credentialsId: '073c37ff-f218-4988-8490-8fbe46760674', passwordVariable: 'gitPassword', usernameVariable: 'gitUsername'), string(credentialsId: 'github_email', variable: 'gitEmail')]) {
sh """
git config user.email $gitEmail
git config user.name $gitUsername
git add -A
git commit -m '[jenkins] update image tag = $imageName:$tag'
git push https://${gitUsername}:${gitPassword}@github.com/yellowsunn/argocd-manifest.git
"""
}
}
}
}
}
이미지 빌드 및 배포 파이프라인이 완료되면 마지막에 해당 파이프라인을 실행 요청
git에 업데이트된 버전(20230225050400)에 맞게 파드가 다시 배포됨
참고자료
https://nayoungs.tistory.com/entry/ArgoCD%EB%9E%80-ArgoCD-%EA%B0%9C%EC%9A%94-%EB%B0%8F-%EC%84%A4%EC%B9%98
https://malwareanalysis.tistory.com/402
https://kubectl.docs.kubernetes.io/guides/introduction/kustomize/
https://argo-cd.readthedocs.io/en/stable/operator-manual/webhook/