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 |