EKS Cluster에 Argo CD 배포 및 세팅하는 법

ShinChul Bang
finda 기술 블로그
14 min readApr 23, 2020

Overview

AWS EKS 클러스터 내부에 지속적 전달(Continuous Deploy)을 위한 Argo CD를 세팅하는 방법에 대해 알아본다.

Argo CD는 쿠버네티스 환경에서 지속적 전달을 통해 서비스를 배포하기 위한 전략을 도와주는 오픈소스 툴킷이다.

Argo CD는 쿠버네티스 클러스터 내부에 Pod 형태로 배포가 되며, 실제 쿠버네티스 클러스터 내부에서의 역할이 정확히 무엇인지는 아래 그림을 참고한다.

Argo CD는 특정 원격 저장소(GitOps Repository)의 내용을 감지하여 내용의 변경사항(Diff)이 발견되면 이를 사용자에게 알려주고 반영할지 여부를 물어본다.

여기서 우리는 특정 원격 저장소(GitOps Repository) 라는 것이 무엇인지 알아야 하는데,

GitOps Repository는 이름 그대로 운영(Operation)에 관련된 리소스를 Git으로 관리하고 있는 원격 저장소(Repository) 라고 생각하면 된다.

쿠버네티스에서 배포나 서비스 설정을 위해 사용하는 매니페스트 리소스(=yaml 파일)들을 관리하는 원격 저장소라고 보면 된다.

여기서 특정 원격 저장소라고 거창하게 이야기 했지만, 사실상 특별한 것 이 없이 그저 GitHub, Bitbucket, 또는 Gitlab과 같은 원격 리포지토리 안에 쿠버네티스에서 사용할 매니페스트 리소스들만 들어가있는 것 뿐이다.

(물론 보안을 위해서는 해당 원격 리포지토리를 Private하게 관리해야할 것이다)

또한 Argo CD는 자신만의 대시보드를 제공해준다.

Argo CD 대시보드를 통해 여러가지 조작을 하는 모습

이 대시보드에서 Argo CD를 통해 배포된 많은 서비스들을 한눈에 볼 수 있으며, 새로운 어플리케이션의 배포 및 롤백, 관리도 가능하다.

이제 Argo CD가 어떤 일을 하는지 대충 감이 잡힐 것이다.

따라서 본격적으로 Argo CD를 설치해보자.

Cluster에 Argo CD 설치

먼저 작업하기 이전에 AWS EKS를 통해 쿠버네티스 클러스터가 구성되어 있고, 로컬 PC에서 kubectl이 설치되어 있다고 가정한다.

만약 로컬 PC에 kubectl이 설치되어 있지 않다면 아래 링크를 통해 설치한다.

Argo CD를 설치하기 위해서 아래와 같이 kubectl 커맨드를 실행한다.

# argocd 네임스페이스 생성 
$ kubectl create namespace argocd

# Argo CD 배포
$ kubectl apply -n argocd -f <https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml>
# Argo CD API Server에서 외부 통신을 할 수 있도록 Argo CD의 Service의 Type을 Load Balancer로 변경(AWS에서는 Classic Load Balancer로 배포됨)
$ kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'

쿠버네티스 클러스터 내부에 Argo CD의 리소스를 배포하기 위해 먼저 argocd라는 네임스페이스를 만들었고, 이 네임스페이스 안에 Argo CD를 배포하였다.

또한 Argo CD API Server가 있는데, 이 서버가 대시보드를 제공한다.

따라서 해당 Pod의 Service를 통해 외부 접속을 해야 하는데 이를 위해서 Service의 타입을 LoadBalancer로 변경해준다.(Default는 ClusterIP로 설정되어있음)

Argo CD는 Argo CD만의 CLI(Command Line Interface)를 제공한다.

이 CLI를 통해 Argo CD를 제어할 수 있다.

Argo CD CLI는 위에서 설명한 Argo CD API Server에게 명령을 전달한다.

이 포스트에서는 Argo CD CLI를 통해 초기 ADMIN 계정의 패스워드를 변경할 것이다.

따라서 Argo CD CLI도 설치한다. (MacOS를 기준으로 설명한다.)

$ brew tap argoproj/tap 
$ brew install argoproj/tap/argocd
#설치 확인을 위해 argocd 명령어 실행
$ argocd
argocd controls a Argo CD server
Usage:
argocd [flags]
argocd [command]
Available Commands:
account Manage account settings
app Manage applications
cert Manage repository certificates and SSH known hosts entries
cluster Manage cluster credentials
completion output shell completion code for the specified shell (bash or zsh)
context Switch between contexts
help Help about any command
login Log in to Argo CD
logout Log out from Argo CD
proj Manage projects
relogin Refresh an expired authenticate token
repo Manage repository connection parameters
version Print version information
Flags:
--auth-token string Authentication token
--config string Path to Argo CD config (default "/Users/shinchulbang/.argocd/config")
--grpc-web Enables gRPC-web protocol. Useful if Argo CD server is behind proxy which does not support HTTP2.
-H, --header strings Sets additional header to all requests made by Argo CD CLI. (Can be repeated multiple times to add multiple headers, also supports comma separated headers)
-h, --help help for argocd
--insecure Skip server certificate and domain verification
--loglevel string Set the logging level. One of: debug|info|warn|error (default "info")
--plaintext Disable TLS
--server string Argo CD server address
--server-crt string Server certificate file
Use "argocd [command] --help" for more information about a command.

혹시 MacOS가 아닌 유저 or 리눅스 유저인 경우 아래 링크를 참고한다.

Argo CD CLI 설치를 완료했으면 초기 ADMIN의 계정 설정을 진행해보자.

아래의 커맨드를 따라 진행한다.

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'`
# argocd 커맨드라인 인터페이스는 HTTP2/gRPC 프로토콜을 통해 통신하므로
# 로드밸런서 혹은 외부 통신을 담당하는 라우터가 HTTP2/gRPC 프로토콜을 완벽히 지원해야함.
# 하지만 AWS에서 제공하는 ALB 혹은 Classic LB는 HTTP2/gRPC 프로토콜을 완벽하게 지원하지 않기 때문에
# --grpc-web 이라는 옵션을 추가적으로 붙여줘야 함.
$ argocd login <ARGOCD_SERVER_HOST>:80 --grpc-web # AWS EKS 혹은 HTTP2/gRPC 프로토콜을 완벽히 지원해 주지 않는 로드밸런서만 해당
# 그 외의 경우
$ argocd login <ARGOCD_SERVER_HOST>
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: # 변경할 비밀번호 재입력(확인)

이제 초기 계정 설정을 마쳤으니, 브라우저를 통해 Load Balancer의 엔드포인트로 접속하여 Argo CD 대시보드로 들어가 로그인을 해보자.

만약 엔드포인트를 찾기 어렵다면 간단히 아래 커맨드를 통해 확인할 수 있다.

$ kubectl get svc argocd-server -n argocd -o json | jq -r '.status.loadBalancer.ingress[0].hostname'

브라우저를 통해 접속하면 아래와 같이 대시보드 로그인 화면을 확인할 수 있다.

한번 로그인을 진행해보자.

로그인을 진행하고 처음 들어가면 이러한 화면이 보일 것이다.

여기에서 실제 쿠버네티스 클러스터 내부에 배포될 서비스들을 생성하고 관리하게 된다.

그러기에 앞서 이전에 이야기 했던 것처럼 Argo CD는 특정 원격 저장소(GitOps Repository)를 알고 있어야 한다.

따라서 우선적으로 특정 원격 저장소(GitOps Repository)를 등록해 주어야 한다.

아래 그림을 따라 진행한다.

왼쪽 메뉴에서 두번째 아이콘을 클릭하여 ‘Repositories’를 클릭한다.
여기서는 HTTPS를 통해 Repository와 연결할 것이기 때문에 ‘Connect Repo Using Https’를 클릭한다.
해당 포스트에서 테스트를 위해 사용할 GitOps Repository이다. 해당 url을 복사한다.
‘Repository URL’에 복사해둔 GitOps Repository의 url을 붙여넣기 한다. 해당 Repository는 Public이기 때문에 username과 password를 입력하지 않았다.
만약 자신의 Private GitOps Repository 가 있다면 위 그림과 같이 해당 Repo에 접근 권한이 있는 계정의 정보를 입력한다.
정상적으로 연결이 완료 되었다면 위와 같이 확인할 수 있다.

이렇게 간단히 특정 원격 저장소(GitOps Repository)를 등록했다.

이제 실제 서비스를 Argo CD를 통해 배포해보자.

왼쪽 메뉴 중 첫번째 아이콘을 클릭하여 초기 화면으로 돌아온 후 상단의 ‘New APP’ 버튼을 클릭한다.
‘New APP’ 버튼을 클릭하면 볼 수 있는 화면. 이 화면의 input box & select box 만으로 쿠버네티스 클러스터에 서비스를 배포할 수 있다.
새로운 앱을 배포하기 위해 위와 같이 insert box와 select box를 설정한다. 배포할 서비스의 이름은 hello-world이고 이 서비스의 배포를 위해서 GitOps Repo의 /resources/base 디렉터리를 참조한다.
실제 서비스가 배포될 목적지(Destination)가 어디인지 설정한다. 기본값은 Argo CD가 설치된 쿠버네티스 클러스터 내부이다. 목적지를 설정하고나서 상단의 ‘Create’버튼을 클릭하면 서비스 배포를 위한 환경이 구성된다.
서비스 배포를 위해 구성된 환경(App)의 모습. 이 App을 클릭하면 상세 화면으로 이동할 수 있다.
App을 클릭한 뒤 상세 화면. 여기에서 ‘Sync’ 버튼을 통해 쿠버네티스 클러스터 내부에 새로운 서비스를 배포할 수 있다.
‘Syncronize’ 버튼을 클릭하면 새로운 서비스가 배포된다.

Argo CD를 셋업하고 간단한 서비스를 배포해보았다.

Argo CD를 사용하면 쿠버네티스 환경에서의 배포를 좀 더 손쉽게 진행할 수 있고, 수많은 서비스들에 대해서 관리하기가 편해진다.

Argo CD에 대해 좀 더 상세히 알고싶다면 아래 ‘참고’에 있는 링크를 참조해보시길

--

--