이 연재글은 EKS(Elastic Kubernetes Service) 실습의 6번째 글입니다.

이번 장에서는 Docker Container Repository에 업로드된 Docker Image를 ArgoCD를 이용하여 k8s(kubernetes) cluster에 배포하는 방법에 대하여 알아보겠습니다.

이전 장의 실습을 통해 k8s cluster 구성요소들을 관리하고 배포하기 위해서는 정해진 양식의 manifest(.yaml)파일을 구성하여 실행하면 된다는 것을 알게 되었습니다. 이러한 설정 파일들은 계속해서 새로 생겨나고 수정을 반복하기 때문에 지속적인 관리가 필요합니다. 대부분 이러한 파일들의 관리는 Github repository를 이용해 관리하게 되며 이러한 접근 방식을 Gitops라고 합니다.

GitOps

Git을 비롯한 일련의 code repository들은 코드가 생성되고 수정되고 삭제되는 일련의 과정을 기록하고 검증하며, 변경한 내용을 적용하거나 되돌리고 작업자를 추적할 수 있는 기능을 제공합니다. 개발자가 program의 소스코드를 지속적으로 개발하고 관리해 나가기 위해서 Git를 사용하는 것처럼 일련의 시스템 구성요소를 선언적인(declarative) 코드로 정의하고 Git repository를 통해 지속적으로 관리 및 확장에 나가는 방식을 GitOps라고 합니다.

k8s의 모든 요소는 manifest 파일(.yaml)로 코드화 되어 관리됩니다. 이러한 코드는 GitOps 방식으로 관리될 수 있으며 이를 통해 현재 배포 환경의 상태를 쉽게 파악할 수 있습니다. 코드화 되어있기 때문에 쉽게 수정하고 배포할 수 있으며 자동화를 통해 더 빠르고 지속적인 배포도 가능하게 됩니다.

ArgoCD

ArgoCD는 GitOps 방식으로 관리되는 manifest 파일의 변경사항을 감시하며, 현재 배포된 환경의 상태와 Github manifest 파일에 정의된 상태를 동일하게 유지하는 역할을 수행합니다.

Kubernetes Cluster에 ArgoCD 배포

ArgoCD 배포

배포 대상이 되는 kubernetes cluster에 ArgoCD namespace를 생성한 후 cluster에 ArgoCD를 배포합니다.

# ArgoCD 네임스페이스 생성 
$ kubectl create namespace argocd
  
# ArgoCD 배포
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# Argo CD Server를 외부에서 접속할 수 있도록 Service의 type을 LoadBalancer로 변경
$ kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'

ArgoCD CLI(Command Line Interface) 설치

가장 최근에 Release된 ArgoCD CLI를 다운로드 받아 설치합니다.

$ VERSION=$(curl --silent "https://api.github.com/repos/argoproj/argo-cd/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')

$ sudo curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/download/$VERSION/argocd-linux-amd64

$ sudo chmod +x /usr/local/bin/argocd

ArgoCD Admin User Setting

ArgoCD 관리자 페이지에 로그인하기 위해 비밀번호를 재설정 합니다.

$ ARGOCD_SERVER=`kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2` 
$ ARGOCD_SERVER_HOST=`kubectl get svc argocd-server -o json -n argocd | jq -r '.status.loadBalancer.ingress[0].hostname'`
$ echo $ARGOCD_SERVER $ARGOCD_SERVER_HOST
argocd-server-6744f57d55-8mhc7 a4cfe1bb812ad4b2fb23df0c45845c8e-865510826.ap-southeast-1.elb.amazonaws.com
$ argocd login $ARGOCD_SERVER_HOST:80 --grpc-web

WARNING: server certificate had error: x509: certificate is valid for localhost, argocd-server, argocd-server.argocd, argocd-server.argocd.svc, argocd-server.argocd.svc.cluster.local, 
not a123456dd12ab11baba0a123a1234567-1234567890.ap-northeast-2.elb.amazonaws.com. Proceed insecurely (y/n)? y
Username: admin
Password: # ARGOCD_SERVER와 동일
'admin' logged in successfully
Context 'a123456dd12ab11baba0a123a1234567-1234567890.ap-northeast-2.elb.amazonaws.com:80' updated
# -------------------------------
# default 계정 정보는 아래와 같음
# username : admin
# password : ARGOCD_SERVER와 동일
# -------------------------------
# Argo CD 비밀번호 변경
$ argocd account update-password
*** Enter current password: # ARGOCD_SERVER와 동일
*** Enter new password: # 변경할 비밀번호 입력
*** Confirm new password: # 변경할 비밀번호 재입력(확인)

ArgoCD 관리 페이지 접속

아래 명령을 실행하여 argocd-server의 external-ip정보를 얻습니다. 브라우저에서 해당 정보를 입력하면 ArgoCD 관리 페이지에 접속할 수 있습니다. 위에서 설정한 password를 이용하여 로그인을 할 수 있습니다.

 kubectl get svc -n argocd argocd-server
NAME            TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
argocd-server   LoadBalancer   10.98.81.146   xxx.xxx.xxx.xxxx     80:32508/TCP,443:31463/TCP   4m29s

아직 등록한 애플리케이션이 없어 빈 페이지만 보입니다.

Kubernetes manifest 파일 관리를 위한 github repository 생성

Github repository를 새로 생성한 후 다음과 같이 kubernetes에 배포할 manifest 파일을 생성하고 commit & push 합니다. manifest 파일에 선언된 상태는 ArgoCD에 의해 kubernetes cluster에 동기화되어 적용됩니다.

argocd-resources
└── resources
    └── app
        └── demo
            ├── deployment.yaml
            └── service.yaml

ArgoCD에 새로운 git repository 등록

ArgoCD 관리페이지에서 톱니바퀴 – Repositories를 클릭하고 위에서 생성한 Git Repository를 등록합니다.

Git Repository 등록이 성공하면 아래와 같이 표시됩니다.

ArgoCD에 새로운 애플리케이션 등록

ArgoCD 첫 화면에서 +NEW APP을 클릭하여 새로운 애플리케이션을 등록합니다.

GENERAL 항목은 자신의 환경에 맞게 적당한 내용으로 작성합니다.

SOURCE – Repository URL에는 위에서 생성한 Git repository를 기입하면 됩니다. Revision은 HEAD로 두거나 적당한 branch명을 입력해 줍니다. Path에는 manifest 파일의 위치를 적습니다.

DESTINATION – Cluster URL은 기본을 선택합니다. Namespace에는 default 또는 배포할 namespace 이름을 입력합니다.

Create 버튼을 눌러 애플리케이션을 생성합니다.

최초 등록 시에는 한 번도 배포된 적이 없으므로 Status는 OutOfSync로 표시됩니다. SYNC – SYNCHRONIZE를 클릭하면 manifest에 설정된 docker image가 kubernetes cluster에 배포됩니다. 배포가 완료된 후에는 Status가 Healthy로 변경됩니다.

Application 박스를 클릭하면 좀 더 상세한 정보를 볼 수 있습니다.

애플리케이션 업데이트 내역 배포

애플리케이션이 업데이트되어 다시 배포 해야할 경우 Docker Container Registry에 업데이트된 Docker Image를 업로드 합니다. 이후에 deployment.yml manifest 파일의 Image URL을 최신 버전으로 수정한 후 GitHub에 Push하고 ArgoCD에서 SYNC를 눌러 Kubernetes Cluster에 배포합니다.

애플리케이션 업데이트 내역 롤백(Rollback)

만약 배포한 내용에 문제가 있어 이전 버전으로 되돌아 가야 하면 ArgoCD 메뉴의 HISTORY AND ROLLBACK 버튼을 클릭합니다. 클릭 하면 표시되는 배포 히스토리에서 원복하고자 하는 이미지의 컨텍스트 메뉴를 누르고 ROLLBACK을 선택하면 이전 배포 내역이 다시 배포 됩니다.

애플리케이션 자동 배포

Git Repository에 manifest 파일을 업데이트 하여 Push 하면 ArgoCD가 자동으로 배포하도록 설정이 가능합니다.

애플리케이션 상세화면에서 APP DETAILS를 클릭합니다.

이후 나타나는 화면에서 Sync Policy의 ENABLE AUTO-SYNC를 클릭하여 활성화 합니다. 이 후 배포부터는 manifest 파일이 업데이트 되면 자동으로 클러스터에 배포가 됩니다.

여기까지 간략하게 GitOps와 ArgoCD에 대해 살펴보았습니다. ArgoCD는 구성이 단순하고 진입장벽이 높지 않아 Kubernetes 배포 환경을 쉽게 구축할 수 있습니다. 배포 자동화를 생각하고 있다면 한번쯤 검토하고 사용해 보는 것을 추천드립니다.

더 자세한 내용은 아래 링크에서 확인하시면 됩니다.

https://argoproj.github.io/argo-cd

연재글 이동[이전글] EKS에 ALB 적용하여 서비스 노출하기(Ingress Application Loadbalancer)