마지막으로 쿠버네티스 활용에 대한 아쉬움과 함께 ArgoCD를 어떻게 활용했는지를 적어보겠다!
매니페스트 레포를 ArgoCD에 등록하면 Jenkins에서 해당 레포의 애플리케이션 이미지 태그를 바꿀 때마다 상태를 비교하고 CD를 지원할 수 있다.
구성한 쿠버네티스 클러스터 아키텍처는 다음과 같다.
ingress, argocd, cert-manager, cluster-autoscaler 등은 재배포 시에 업데이트가 필요하지 않아서 매니페스트 레포지토리에는 BE, AI 각각 애플리케이션의 Service, Deployment, HPA 선언 파일을 업로드했고 Deployment의 이미지 태그를 지속적으로 변경했다.
ArgoCD는 소개부터 Argo CD - Declarative GitOps CD for Kubernetes 라고 되어있을만큼 대표적인 pull type의 GitOps CD 오픈소스 툴이다. 그리고 kustomize applications, helm charts, jsonnet files, Plain directory of YAML/json manifests 등으로 매니페스트 관리 방식을 등록하면 선언된 상태와 현재 상태를 비교하여 CD를 지원한다.
나는 프로젝트에서 매니페스트 YAML을 담은 GitHub 레포지토리 PAPERPLE-CD를 등록했고 ArgoCD는 해당 레포에 있는 YAML 파일을 전부 긁어서 상태 비교에 활용한다.
ArgoCD는 argocd
라는 네임스페이스에 설치되지만 RBAC(Role-Based Access Control) 설정과 kube-apiserver를 통해 다른 네임스페이스의 리소스를 확인할 수 있고 이를 상태 비교에 활용한다.
ArgoCD는 아래 명령어를 통해서 클러스터에 설치할 수 있다.
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
CLI를 통한 설정과 UI를 통한 설정을 지원하는데 나는 UI를 사용해서 설정했다. 위의 yaml로 설치한 리소스 중에서 service/argocd-server
를 ClusterIP에서 LoadBalancer로 수정해서 생성된 EXTERNAL-IP를 통해 UI에 접근했다. EKS 환경에서는 도메인으로 나와서 해당 도메인을 새로 등록한 도메인의 CNAME 레코드에 등록하여 간편하게 활용했다.
위와 같이 지속적으로 매니페스트 레포지토리에 선언된 상태와 현재 상태를 비교하고 Sync만 누르면 선언된 상태로 만들어준다. 그리고 배포를 기록으로 관리하여 쉽게 롤백이 가능하다.
ArgoCD는 선언된 상태와 현재 상태를 자동으로 동기화하는 AutoSync를 지원하고 AutoSync를 활성화하면 기타 설정을 지원한다. 처음에는 CI/CD의 완전 자동화를 위해 당연히 AutoSync와 기타 설정 모두를 활성화했다.
하지만.. 나는 기존 리소스의 효율적인 활용을 위해 HPA를 설정하고 트래픽 대비를 위해 cluster-autoscaler를 설정했다. AutoSync를 켜두고 HPA를 설정하면 CPU 사용량이 아무리 높아지고 HPA가 파드를 새로 생성하려고 해도 선언된 레플리카 수를 ArgoCD가 지속적으로 맞추기 때문에 파드가 생성되지 않는다.
[K8s] HPA 설정 트러블슈팅하기 / #1 ArgoCD Auto-Sync 참고
AutoSync 켜둔 걸 까먹고 삽질을 했었고.. 그 이후로는 AutoSync를 끄고 필요할 때 Sync 버튼을 눌러주었다. 하지만 CD에서 자주 빠르게 배포가 필요하다면 딸깍 한 번하고 상태를 지켜보는 이 과정이 생각보다 불편하다. ArgoCD AutoSync와 HPA 둘 사이에서 타협을 해야할 것 같다.
애플리케이션에는 ingress를 설정하고 nginx-ingress-controller를 두어 https 설정을 했는데 ArgoCD에는 하지 못해서 UI로 argocd-server에 접근하려면 https 설정도 추가해야할 것 같다.
쿠버네티스에 개선할 점.. 너무도 많다.
kubectl logs ...
로 찍어주었다....프로젝트가 끝나서 시원하기도 하고 AWS 서버비 지원이 끝나서 아주 아쉽지만 짧은 기간 동안 비싼 EKS를 알차게 활용한 것 같다. 짧은 기간동안 직접 사용하면서 CI/CD와 쿠버네티스를 익혔다면 앞으로는 딥다이브를 해보고 싶다! CKA도 화이팅..
부족하거나 잘못된 부분이 있다면 편하게 조언, 지적 부탁드립니다. 🙇🏻♀️