Jenkins์ ArgoCD๋ฅผ ํตํด ๊ตฌ์ถํด๋ณด๋ GitOps ๊ธฐ๋ฐ CI / CD ํ์ดํ๋ผ์ธ
๋ณธ ์ ์ฅ์๋ Jenkins์ ArgoCD๋ฅผ ํ์ฉํด ๊ตฌ์ถํ GitOps CI / CD ํ์ดํ๋ผ์ธ์ ๋ํ Helm ์ฐจํธ ์ ์ฅ์์ด๋ค.
GitOps๋ Kubernetes์ ํน์ง์ธ ์ฝ๋ํ ์ธํ๋ผ(Infrastructure as Code, IaC)์ Git์ ํ์ ๊ด๋ฆฌ๋ฅผ ๊ฒฐํฉํ์ฌ ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ํ๊ฒฝ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ DevOps์ ๊ตฌํ ๋ฐฉ๋ฒ ์ค ํ๋์ด๋ค.
Kubernets์ ๋งค๋ํ์คํธ(Manifest)๋ค์ GitHub ๋ ํฌ์งํ ๋ฆฌ์ ์ ์ฅํด ์ธํ๋ผ์ ๋ํ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ฒ ๋๋ค.
๊ฒ๋ค๊ฐ Terraform ๋ฑ์ ํ๋ก๋น์ ๋(Provisioning) ๋๊ตฌ๊น์ง ํจ๊ป ์ฌ์ฉํ๋ฉด ํด๋ผ์ฐ๋๋ถํฐ ํด๋ผ์ฐ๋ ๋ด์ ์ ํ๋ฆฌ์ผ์ด์
๋ฐฐํฌ๊น์ง Git์ ํตํด ๊ด๋ฆฌํ๊ณ ์ธ์ ๋ ์ง ๋ณต๊ตฌํ ์ ์๊ฒ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก GitOps๋ Kubernetes์ ์ง์์ ๋ฐฐํฌ ๋๊ตฌ ์ค ํ๋์ธ ArgoCD๋ฅผ ํ์ฉํด ๊ตฌํํ ์ ์๋ค.
์ด๋, ๋งค๋ํ์คํธ๋ค์ ๊ด๋ฆฌ๋ฅผ ํธ๋ฆฌํ๊ฒ ํ๊ธฐ ์ํด Helm์ ํจ๊ป ์ฌ์ฉํ๋ค.
๋ค์ ์ ์ฐจ๋ ArgoCD์ CI / CD ๋๊ตฌ์ธ Jenkins๋ฅผ ํจ๊ป ์ฌ์ฉํด ๊ตฌ์ถํ GitOps CI / CD ํ์ดํ๋ผ์ธ์ด๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ๋ ํฌ์งํ ๋ฆฌ์ ๋ณ๊ฒฝ์ฌํญ์ ๊ฐ์งํ Jenkins๊ฐ ํด๋น ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ์๋ก ๊ฐ์ ธ์ด.
- ์ ๋ฐ์ดํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ก์ด ์ด๋ฏธ์ง ๋น๋
- ๋ง๋ค์ด์ง ์ด๋ฏธ์ง๋ฅผ ์ปจํ ์ด๋ ๋ ์ง์คํธ๋ฆฌ์ ๊ฒ์
- ์ฐจํธ ๋ ํฌ์งํ ๋ฆฌ ๋ด์ ํด๋นํ๋ ์ด๋ฏธ์ง ํ๊ทธ๋ฅผ ์๋ก ๊ฒ์ํ ์ด๋ฏธ์ง์ ํ๊ทธ๋ก ์์
- ์ฐจํธ ๋ ํฌ์งํ ๋ฆฌ์ ๋ณ๊ฒฝ์ฌํญ์ ๊ฐ์งํ ArgoCD๊ฐ ํด๋น ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ์๋ก ๊ฐ์ ธ์ด.
- ์ ๋ฐ์ดํธ๋ ์ฐจํธ๋ฅผ Kubernetes ํด๋ฌ์คํฐ์ ๋ฐฐํฌ
- kubelet์ด ํด๋น ์ฐจํธ์ ๋ง๋ ์๋ก์ด ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ ์ปจํ ์ด๋ ๊ตฌ์ถ ๋ฐ ์คํ
์ด๋, ํด๋ฌ์คํฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํด ๋กค๋ฐฑ(Rollback)์ ์ํํ๊ณ ์ถ๋ค๋ฉด ๋จ์ํ ์ฐจํธ ๋ ํฌ์งํ ๋ฆฌ์ ๋ํด git revert๋ฅผ ์ํํ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ์ธํ๋ผ์ ๋ํด ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ํํ ์ ์๊ณ ์ด๋ฌํ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ๊ฐ๋ฐ์๋ค์๊ฒ ์น์ํ ํ์ ๊ด๋ฆฌ ๋๊ตฌ์ธ Git์ผ๋ก ํ๋ค๋ ์ ์ด GitOps์ ํฐ ์ฅ์ ์ค ํ๋์ด๋ค.
> git clone https://github.com/earlgrey02/gitops-chart
> cd gitops-chart
> helm dependencies update
> helm install gitops .๋ณธ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ํตํด Nginx Ingress Controller, Jenkins, ArgoCD๋ฅผ Helm์ผ๋ก ํ ๋ฒ์ ๊ตฌ์ถํ ์ ์๋ค.
> kubectl get service -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
gitops-ingress-nginx-controller NodePort 10.103.83.33 <none> 80:32748/TCP,443:30083/TCP 13m์ฐจํธ ๋ด์ Nginx Ingress Controller๋ NodePort ํ์
์ ์ฌ์ฉํ๋ฏ๋ก ํด๋นํ๋ ํฌํธ์ ํจ๊ป ๊ฐ๊ฐ /jenkins, /argocd๋ก ์ ์ํ๋ฉด Jenkins์ ArgoCD์ ๋์๋ณด๋์ ์ ์ํ ์ ์๋ค.
Jenkins์ ArgoCD๋ ๋ชจ๋ admin๊ณผ root๋ฅผ ์์ด๋, ํจ์ค์๋๋ก ๊ฐ์ง๊ณ ์๋ค.
apiVersion: v1
kind: Secret
metadata:
name: argocd-notifications-secret
namespace: {{ index .Values "argo-cd" "namespaceOverride" }}
type: Opaque
stringData:
discord-url: <Webhook URL>ArgoCD๋ example-application.yaml์ Application์ผ๋ก ๊ฐ์ง๊ณ ์๋๋ฐ ํด๋น Application์ด ๋๊ธฐํ๋ ๋๋ง๋ค ์๋ฆผ์ด ๊ฐ๋๋ก ์ค์ ๋์ด ์๋ค.
๋ง์ฝ ์ค์ ๋ก ์๋ฆผ์ ๋ฐ๊ณ ์ถ๋ค๋ฉด ์ secret.yaml์ ์ค์ Discord์ ์นํ
(Webhook) URL์ ์์ฑํ๋ฉด ๋๋ค.