Argo CD 시작
개요
Argo CD는 GitHub Repository의 최신화된 Kubernetes 설정으로 Kubernetes Cluster를 배포해주는 GitOps CD 툴이다.
간단하게 설명하자면,
- Kubernetes 설정 파일이 있는 GitHub Repository를 Argo CD에 설정한다.
- Argo CD 자동 배포를 시작한다! → Kubernetes Cluster가 만들어진다!
- GitHub Repository의 갱신이 발생하면 Argo CD가 감지해서 Kubernetes Cluster를 갱신된 설정으로 유지시킨다!
이렇게 된다.
Jenkins 파이프라인이 성공적으로 돌아갔다면 파이프라인 말미에 Kubernetes 설정 파일 쪽 Repository를 변경하고, 그걸 Argo CD가 가져가서 최신화된 배포 상태를 유지하는 방식이다.
따라서 개발자는 소스 코드의 GitHub Push 이벤트 하나로 배포까지 되는 모습을 바라볼 수 있다.
테스트는 Ubuntu 24.04, minikube로 진행했다.
Argo CD 설치
Argo CD는 쿠버네티스 안에서 돌아간다. 따라서 kubectl로 Argo CD를 올려준다.
1
kubectl create namespace argocd
결과
1
namespace/argocd created
1
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/applicationsets.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io created
serviceaccount/argocd-application-controller created
serviceaccount/argocd-applicationset-controller created
serviceaccount/argocd-dex-server created
serviceaccount/argocd-notifications-controller created
serviceaccount/argocd-redis created
serviceaccount/argocd-repo-server created
serviceaccount/argocd-server created
role.rbac.authorization.k8s.io/argocd-application-controller created
role.rbac.authorization.k8s.io/argocd-applicationset-controller created
role.rbac.authorization.k8s.io/argocd-dex-server created
role.rbac.authorization.k8s.io/argocd-notifications-controller created
role.rbac.authorization.k8s.io/argocd-redis created
role.rbac.authorization.k8s.io/argocd-server created
clusterrole.rbac.authorization.k8s.io/argocd-application-controller created
clusterrole.rbac.authorization.k8s.io/argocd-applicationset-controller created
clusterrole.rbac.authorization.k8s.io/argocd-server created
rolebinding.rbac.authorization.k8s.io/argocd-application-controller created
rolebinding.rbac.authorization.k8s.io/argocd-applicationset-controller created
rolebinding.rbac.authorization.k8s.io/argocd-dex-server created
rolebinding.rbac.authorization.k8s.io/argocd-notifications-controller created
rolebinding.rbac.authorization.k8s.io/argocd-redis created
rolebinding.rbac.authorization.k8s.io/argocd-server created
clusterrolebinding.rbac.authorization.k8s.io/argocd-application-controller created
clusterrolebinding.rbac.authorization.k8s.io/argocd-applicationset-controller created
clusterrolebinding.rbac.authorization.k8s.io/argocd-server created
configmap/argocd-cm created
configmap/argocd-cmd-params-cm created
configmap/argocd-gpg-keys-cm created
configmap/argocd-notifications-cm created
configmap/argocd-rbac-cm created
configmap/argocd-ssh-known-hosts-cm created
configmap/argocd-tls-certs-cm created
secret/argocd-notifications-secret created
secret/argocd-secret created
service/argocd-applicationset-controller created
service/argocd-dex-server created
service/argocd-metrics created
service/argocd-notifications-controller-metrics created
service/argocd-redis created
service/argocd-repo-server created
service/argocd-server created
service/argocd-server-metrics created
deployment.apps/argocd-applicationset-controller created
deployment.apps/argocd-dex-server created
deployment.apps/argocd-notifications-controller created
deployment.apps/argocd-redis created
deployment.apps/argocd-repo-server created
deployment.apps/argocd-server created
statefulset.apps/argocd-application-controller created
networkpolicy.networking.k8s.io/argocd-application-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-applicationset-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-dex-server-network-policy created
networkpolicy.networking.k8s.io/argocd-notifications-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-redis-network-policy created
networkpolicy.networking.k8s.io/argocd-repo-server-network-policy created
networkpolicy.networking.k8s.io/argocd-server-network-policy created
Argo CD CLI 설치
“Argo CD를 설치했는데 CLI인가 뭐신가를 또 설치한다고?” 라고 했다면 이 시점에서 나와 똑같은 생각을 한 것이다. ㅋㅋ
Argo CD는 내 기준 신기하게 동작한다.
일단 Argo CD를 쿠버네티스 안에 설치한다. 그러면 여기에 명령을 어떻게 내리냐?
- Web GUI로 명령을 내린다.
- CLI로 명령을 내린다.
하지만 잠깐 써 본 바로는 CLI가 기능이 완전한 것으로 보인다. 그렇다면 CLI가 필요한데, 이미 쿠버네티스 안에 컨테이너로 돌아가는 Argo CD에게 명령어를 보내는 방법으로 Argo CD는 gRPC를 이용한다.
Argo CD CLI가 Argo CD Web 서버로 gRPC 요청을 보내서 명령하는 것이다!
처음 보는 광경이라 ‘이게 이렇다고?’ 했는데 생각해보니 그럴 수도 있겠다는 생각이 들었다.
어쨌든 그래서 우리에게는 CLI도 필요한 것이다!
최신 버전 다운로드 및 설치
1
2
3
4
VERSION=$(curl -L -s https://raw.githubusercontent.com/argoproj/argo-cd/stable/VERSION)
curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/download/v$VERSION/argocd-linux-amd64
sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
rm argocd-linux-amd64
Argo CD 서버 노출
이제 Argo CD의 웹 서버를 쿠버네티스 바깥으로 노출시켜준다.
Service 타입 변경
1
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
결과
1
service/argocd-server patched
Port 확인
1
kubectl get svc argocd-server -n argocd
결과
1
2
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-server LoadBalancer 10.103.199.113 <pending> 80:30135/TCP,443:30752/TCP 12s
IP 확인
나는 minikube로 진행했기 때문에 minikube의 IP를 확인했다.
1
minikube ip
결과
1
192.168.49.2
번외: Nginx Reverse Proxy
원격지에서 서버의 Argo CD를 확인하려면 서버의 Nginx로 연결해주면 된다.
아주 기본적인 Nginx Reverse Proxy 설정이니 익숙한 사람은 슥~ 패스해도 무관!
proxy_pass만 minikube:argocd로 맞춰주면 된다.
설정 파일 생성
1
sudo nano /etc/nginx/sites-available/argocd
1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 443;
server_name yourdomain.com;
location / {
proxy_pass https://192.168.49.2:30752;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
설정 파일 적용
1
2
3
sudo ln -s /etc/nginx/sites-available/argocd /etc/nginx/sites-enabled/argocd
sudo nginx -t
sudo systemctl reload nginx
Argo CD 로그인
이제 외부로 노출된 Argo CD를 웹으로 접근해서 로그인하면 된다.
초기 username은 admin이고,
password는 아래 명령어로 확인할 수 있다.
password 확인
1
argocd admin initial-password -n argocd
결과
1
2
3
4
2024/11/09 21:00:09 maxprocs: Leaving GOMAXPROCS=4: CPU quota undefined
0000000000000000
This password must be only used for first time login. We strongly recommend you update the password using `argocd account update-password`.
CLI 로그인
이렇게 접근이 가능해진 Argo CD로 로그인 요청을 보내면 된다.
1
argocd login <ARGOCD_SERVER>
로그인이 되면 이제 Argo CD CLI에서 Argo CD 서버로 명령을 보낼 수 있게 된다!
이후의 과정은 글을 새로 만들까 아래에 더 적을까 고민 중!