[ArgoCD] CD Tool 도입개요 및 설치방법
현재 재직중인 회사에서는 Github Action으로 모든 CI/CD 작업을 진행하고 있다.
즉, Master/Dev/QA branch로 Merge가 되면 코드를 합치고, 이를 기반으로 Helm upgrade Job이 실행된다.
그렇기에 Helm Rollback도 Cli로 수동으로 진행해야 하고, 배포 전략도 단순한 Rolling update밖에 못하는것 같고
특히 Cluster 백업 체계를 수립하기 어렵다는 결론을 내렸고 CD Tool을 도입하기로 했다!!
구분 |
문제점 |
배포 수단 |
|
배포 전략 |
|
복구/백업 방안 |
|
ArgoCD, Spinnker, FluxCD 를 고려했으며, 한국에서 가장 많은 레퍼런스가 있고 다양한 Plugin이 있는 ArgoCD를 도입하고자 한다.
- 사실 위 3개 솔루션 모두 비슷한 기능을 한다. 직접적으로 모두 사용해서 비교해보진 못했으나
- 당장 CD Tool을 도입하는것이 급선무였고, 모두 PoC할 시간이 부족해서 범용성이 큰 ArgoCD를 선택했다 ㅜㅜ
- 최근에는 FluxCD의 성장세가 크다고 들었는데 시간이 부족해서 비교 못해보는것은 조금 아쉽다 ㅜㅜ
ArgoCD 개요
구성도
ArgoCD를 검색하면 가장 많이 나오는 구성도이다. 쉽게 풀이하면 다음과 같다.
- 사용자가 GIt에 코드가 Merge 되면, Git Webhook Event를 통해서 변경 사실을 ArgoCD에 알려준다.
- ArgoCD는 Git Event를 받아서 현재 배포된 Manifest와 비교하게 되고 변경분이 있다면 Sync up을 한다.
- Sync up 하는 방법은 Auto, Manual 방법이 있고, 필자는 Auto Sync up으로 구성했다.
- 왜냐하면? Git Merge를 할 때 개발팀/QA팀의 승인을 받기 때문이다.
Helm 배포
설치는 어렵지 않다. ArgoCD Docs Install 을 참고해도 되지만, 향후 유지보수 및 관리에는 Helm으로 배포하는것이 좋다.
그래서 필자는 Helm 으로 배포하였고, 기본 Charts는 수정하지 않고 Values를 수정해서 배포하였다.
아래 과정을 통해서 ArgoCD의 Chart와 Values를 받을 수 있다. Repo pull을 할 필요는 없으나 필자는 이 방법이 편하다ㅎㅎ
# argocd helm repo add
helm repo add argo https://argoproj.github.io/argo-helm
# helm repo update
helm repo update
# helm repo pull
helm pull argo/argo-cd
그리고 Values를 수정한 다음에 배포를 하면 된다.
- argocd namespace에 배포하였으며 argocd helm release 이름으로 배포하였다.
# argocd helm install
helm upgrade --install argocd ./ -f ./values.yaml
사실 배포는 어렵지 않다. Values의 내용도 Github 또는 Docs를 살펴보면 크게 어렵지 않게 설정할 수 있다.
다만, 좀 고생한것은 Ingress 설정이다 :(
개발팀 또는 다른팀에서도 접속이 가능해야 하므로 Ingress를 만들고 도메인 설정을 하였다.
하지만 그냥 배포했을 때 307 Status Code로 접속이 되지 않았고 이것때문에 몇시간이나 허비하였다 ㅜㅜ
이 글을 보는 사람은 동일한 문제를 겪지 않기를 바란다.
Reddit, Github에 동일한 증상이 있는 가이드 내용을 참고하여 수정했을 때 아래와 같이 수정을 하면 Ingress에 문제가 없다.
찝찝한것은 server.insecure 옵션이나 이것은 ArgoCD 도메인에 대해 IP whitelist하기 때문에 크게 문제가 되지 않는다고 생각했다.
- 이 외 나머지 설정은 각자 상황에 맞춰서 하면 된다.
- Domain, Request size, Replicas, Slack Alarm etc..
- 전체 Values가 필요하신분이 있으시면 댓글 남겨주시면 드릴게요~
# 내부 네트워크에 대해서 TLS 통신을 하지 않도록 하는 옵셥 변경 안하면 307 Statis Code로 접속이 안됨
params:
server.insecure: true
'''''''
ingress:
enabled: true
create: true
annotations:
'''
# Healthcheck 설정을 하지 않으면 Target group 설정에서 307 Status Code를 받음
alb.ingress.kubernetes.io/healthcheck-path: /
alb.ingress.kubernetes.io/healthcheck-protocol: HTTPS
'''
# tls 설정안하면 HTTPS 접속 시 307 Status Code로 접속이 안됨
tls:
- secretName: argocd-secret
hosts:
- {argocd domain}
초기 패스워드 변경
정상적으로 설치 후, 아래와 같이 접속을 하면 이제 절반 이상이 끝났다!!
- ArgoCD를 설치하면 기본적으로 admin 계정이 생성된다.
- 이는 argocd namespace에 argocd-initial-admin-secret secrets로 생성되어 있으므로 base64로 다시 디코딩하면 된다.
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
그리고 초기 비밀번호는 Secrets에 저장되어 있는 만큼 권한이 있는 사용자라면 복호화할 수 있어서 아래 방법으로 변경하는것이 좋다.
- 위 Values에 Ingress domain을 생성했다면 아래 방법으로 진행하면 되나, 그렇지 않으면 port-forwording을 해야 한다.
# argocd login
❯ argocd login {argocd domain}
Username: admin
Password:
'admin:login' logged in successfully
Context {argocd domain} updated
$argocd password update
❯ argocd account update-password
*** Enter password of currently logged in user (admin):
*** Enter new password for user admin:
*** Confirm new password for user admin:
Password updated
Context {argocd domain} updated
설치까지 이상 없었다면 아제 50% 이상은 온것이다.
다음 게시물에는 Webhook Event를 받는 방법, Slack Alarm을 받는 방법, Project/Application 생성 방법에 대해서 정리한다!
매번 느끼는거지만, 세상 똑똑한 사람이 많은것 같다. 관리가 편하기 위해서 Helm을 만들고 각 시스템도 Values만 있으면 간단하게 배포할 수 있다.
아직은 그정도 실력이 안되지만, 나도 언젠가는 뭔가 새로운 시스템을 만들고 이를 사람들에게 배포하는 날?이 오도록 노력해야겠다!!
끝!!