CICD

Argo CD

JAEJUNG 2021. 10. 13. 17:28

Argo CD 주요 구성 요소

 

1. API Server

- WebUI, CLI, CICD  시스템용 API

2. Repository Server

- 매니페스트를 보관하는 git 저장소의 로컬 캐시를 유지하는 내부 서비스

3. Application Controller

- 애플리케이션 제어, 모니터링 / 상태 비교하는 Kubernetes 컨트롤러

 

Argo CD 설치

 

- 위 세 구성요소는 Argo Project에서 매니페스트를 제공한다.

mzmz01:~/environment $ kubectl create namespace argocd
namespace/argocd created

mzmz01:~/environment $ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.0.4/manifests/install.yaml
customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io created
serviceaccount/argocd-application-controller created
serviceaccount/argocd-dex-server created
serviceaccount/argocd-redis created
...
...
networkpolicy.networking.k8s.io/argocd-repo-server-network-policy created
networkpolicy.networking.k8s.io/argocd-server-network-policy created

 

Argo CD CLI 설치

sudo curl --silent --location -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/download/v2.0.4/argocd-linux-amd64

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

 

argocd version 명령어를 통해 버전을 확인한다.

mzmz01:~/environment $ argocd version
argocd: v2.0.4+0842d44
  BuildDate: 2021-06-23T01:27:53Z
  GitCommit: 0842d448107eb1397b251e63ec4d4bc1b4efdd6e
  GitTreeState: clean
  GoVersion: go1.16
  Compiler: gc
  Platform: linux/amd64
FATA[0000] Argo CD server address unspecified

 

version의 맨 마지막 줄을 보면 Argo CD 서버 주소와 관련된 noti가 보인다.

기본적으로 Argo CD Server는 외부에 노출되어 있지 않기 때문에 로드밸런서 서비스를 만들어준다.

로드밸런서 생성을 위해 약 2분간 대기하고, EXTERNAL-IP 값을 변수로 등록해준다.

mzmz01:~/environment $ export ARGOCD_SERVER=`kubectl get svc argocd-server -n argocd -o json | jq --raw-output '.status.loadBalancer.ingress[0].hostname'`

mzmz01:~/environment $ echo $ARGOCD_SERVER
a2a1822d0bc86427399485a2415433c9-1257108177.ap-northeast-2.elb.amazonaws.com

 

초기 암호는 ArgoCD API 서버의 Pod 이름으로 자동 생성된다.

mzmz01:~/environment $ export ARGO_PWD=`kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d`

mzmz01:~/environment $ echo $ARGO_PWD
JLmYmFRvNzPpGrDW

 

앞서 설정했던 SERVER와 PWD 값으로 로그인을 시도한다.

아래와 같이 successfully 로그가 표시되면 된다.

mzmz01:~/environment $ argocd login $ARGOCD_SERVER --username admin --password $ARGO_PWD --insecure
'admin:login' logged in successfully

 

실제 WebUI에서도 정상적으로 로그인되는지 확인한다.

Username에 admin을 입력해주고, Password로 $ARGO_PWD 값을 입력해준다.

 

이제 Argo CD가 구축됐고, 애플리케이션을 구축하는 과정을 설명한다.

먼저 github에 로그인해서 https://github.com/brentley/ecsdemo-nodejs.git로 이동한다.

https URL을 가져온다. ==> https://github.com/brentley/ecsdemo-nodejs.git

 

위 URL은 Argo CD로 애플리케이션을 구성할 때 필요하다.

 

Application 만들기

 

클러스터 컨텍스트를 사용하여 Argo CD CLI로 연결한다.

mzmz01:~/environment $ kubectl config view -o jsonpath='{.current-context}'
arn:aws:eks:ap-northeast-2:371156277055:cluster/cccr3

mzmz01:~/environment $ CONTEXT_NAME=`kubectl config view -o jsonpath='{.current-context}'`
mzmz01:~/environment $ argocd cluster list
SERVER                          NAME        VERSION  STATUS   MESSAGE
https://kubernetes.default.svc  in-cluster           Unknown  Cluster has no application and not being monitored.

mzmz01:~/environment $ argocd cluster add $CONTEXT_NAME
INFO[0001] ServiceAccount "argocd-manager" created in namespace "kube-system" 
INFO[0002] ClusterRole "argocd-manager-role" created    
INFO[0002] ClusterRoleBinding "argocd-manager-role-binding" created 
Cluster 'https://4D737EDC2081C11BE5B251137E0BC129.gr7.ap-northeast-2.eks.amazonaws.com' added

mzmz01:~/environment $ argocd cluster list
SERVER                                                                         NAME                                                   VERSION  STATUS      MESSAGE
https://4D737EDC2081C11BE5B251137E0BC129.gr7.ap-northeast-2.eks.amazonaws.com  arn:aws:eks:ap-northeast-2:371156277055:cluster/cccr3  1.20+    Successful  
https://kubernetes.default.svc                                                 in-cluster                                                      Unknown     Cluster has no application and not being monitored.

 

새로운 namespace를 만들고 애플리케이션을 구성한다.

mzmz01:~/environment $ argocd app create ecsdemo-nodejs --repo https://github.com/brentley/ecsdemo-nodejs.git --path kubernetes --dest-server https://kubernetes.default.svc --dest-namespace ecsdemo-nodejs                                                                                              
application 'ecsdemo-nodejs' created

mzmz01:~/environment $ argocd app list
NAME            CLUSTER                         NAMESPACE       PROJECT  STATUS     HEALTH   SYNCPOLICY  CONDITIONS  REPO                                            PATH        TARGET
ecsdemo-nodejs  https://kubernetes.default.svc  ecsdemo-nodejs  default  OutOfSync  Missing  <none>      <none>      https://github.com/brentley/ecsdemo-nodejs.git  kubernetes

 

현재 ecsdemo-nodejs 애플리케이션의 정보를 보면 STATUS가 OutOfSync 상태로 돼있다.

(아직 배포되지 않았기 때문에 OutOfSync)

mzmz01:~/environment $ argocd app get ecsdemo-nodejs
Name:               ecsdemo-nodejs
...
Sync Status:        OutOfSync from  (c61db33)
Health Status:      Missing

GROUP  KIND        NAMESPACE       NAME            STATUS     HEALTH   HOOK  MESSAGE
       Service     ecsdemo-nodejs  ecsdemo-nodejs  OutOfSync  Missing        
apps   Deployment  default         ecsdemo-nodejs  OutOfSync  Missing

 

명령어로 확인하는 방법 이외에도 Argo CD 관리자 페이지에서 확인하는 방법이 있다.

 

app sync 명령어로 애플리케이션을 동기화 시켜준다.

mzmz01:~/environment $ argocd app sync ecsdemo-nodejs

 

app get 명령어와 대시보드를 통해 애플리케이션 상태를 확인한다.

mzmz01:~/environment $ argocd app get ecsdemo-nodejs
Name:               ecsdemo-nodejs
...
GROUP  KIND        NAMESPACE       NAME            STATUS  HEALTH   HOOK  MESSAGE
       Service     ecsdemo-nodejs  ecsdemo-nodejs  Synced  Healthy        service/ecsdemo-nodejs created
apps   Deployment  default         ecsdemo-nodejs  Synced  Healthy        deployment.apps/ecsdemo-nodejs created

 

애플리케이션 수정, 배포

 

이제 애플리케이션을 수정하고 업데이트해보자.

이번 실습에선 replicas를 1에서 2로 수정하고 commit 하는 방법으로 진행한다.

ecsdemo-nodejs/kubernetes/deployment.yaml 파일을 수정한다.

 

Argo CD 대시보드를 새로고침 하면 app 상태가 다시 OutOfSync로 변경된 것을 확인할 수 있다.

현재 Repository와 app 상태를 계속해서 Syncronization 해주기 때문에 Repository에 commit이 일어나면 앱의 상태도

OutOfSync가 된다.

 

상단의 'SYNC' 를 통해 Git Repository와 동기화를 시도한다.

 

SYNC가 완료되면 app status가 다시 'Synced' 상태로 변경되고 replicas 수를 2로 변경했으므로 pod 개수가 두개로 증가한 것을 확인할 수 있다.

 

CleanUp

 

Argo CD를 이용한 애플리케이션 배포를 실습해보았다.

이제 생성했던 리소스들을 지워보자.

 

먼저 app을 삭제한다.

mzmz01:~/environment $ argocd app delete ecsdemo-nodejs
Are you sure you want to delete 'ecsdemo-nodejs' and all its resources? [y/n]
y

 

Argo CD를 삭제한다.

mzmz01:~/environment $ kubectl delete -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.0.4/manifests/install.yaml

 

Namespace를 삭제한다.

mzmz01:~/environment $ kubectl delete ns argocd
namespace "argocd" deleted

mzmz01:~/environment $ kubectl delete ns ecsdemo-nodejs
namespace "ecsdemo-nodejs" deleted

'CICD' 카테고리의 다른 글

CI/CD with Jenkins&ArgoCD  (0) 2022.05.03
AWS CodePipeline을 이용한 깃옵스(GitOps) 구현하기  (0) 2021.09.04