목차
1. GitOps
GitOps 는 Weaveworks 라는 회사에서 처음 쓰기 시작했다.
- Git 저장소에 저장된 쿠버네티스 매니페스트 파일이 쿠버네티스 클러스터에 똑같이 반영된다.
- Human Error 를 줄일 수 있어 안정성이 보장된다.
- 변경사항을 커밋 로그및 히스토리로 확인 할 수 있어 장애 발생시 빠르게 롤백할 수 있고 버전 관리 가 된다.
- 누가 수정했는지 코드로 확인할 수 있다.
매니페스트가 정의되어 있는 Git 저장소가 변경되면, Git 저장소의 내용과 쿠버네티스 클러스터를 동기화 해주는 에이전트가(=ArgoCD) 변경 내역을 쿠버네티스 클러스터에 반영해 주게 되는 것입니다.
인프라 관리를 점차 코드를 통해 관리하는 추세인데 GitOps 또한 그런 맥락으로 이해할 수 있을 것 같다. IaC(Infrastructure as Code) 가 더 포괄적인 개념.
2. ArgoCD 란?
ArgoCD 는 GitOps 스타일의 배포를 지원하는 CD 도구이다.
Git Repository 에 선언된 쿠버네티스 설정을 쿠버네티스 클러스터에 동기화 해주는 역할을한다.
즉, 지정한 대상 환경에 (=쿠버네티스 클러스터) 원하는 상태로 애플리케이션을 자동 배포하는 도구라고 이해하면 된다.
3.ArgoCD Sync
argocd는 default 설정으로 3분마다 git과 쿠버네티스 클러스터의 현재상태를 비교하며 이 주기를 Period라고 한다.
GitOps Repository 에 push 하는 동시에 쿠버네티스 클러스터에 매니페스트 내용이 자동으로 적용되도록 하고 싶다면 argocd webhook 을 설정하면된다.
4. ArogdCD 설치
Window WSL2 환경에서 Kind 설치후 ArgoCD 설치 진행함
4.1. ArgoCD 최신 버전 설치
# argocd namespace 생성
kubectl create namespace argocd
# argocd 최신버전 설치
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
ArgoCD 특정 버전 설치시 stable 대신 버전명 ( stable → v2.4.11 ) 을 넣으면 된다.
운영환경에서 설치하거나, 로컬에서 운영환경과 동일하게 설치하고 싶다면 버전명을 기입하는것이 좋다.
(Argo CD 버전에 따라 UI ,기능 들이 조금씩 달라진다.)
ArgoCD 설치 터미널
# ArgoCD 설치 터미널
11:28:44 ubuntu@DESKTOP ~ → kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
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-server created
clusterrole.rbac.authorization.k8s.io/argocd-application-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-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
ArgoCD 설치후 Pod , Service 조회
# argocd 설치후 Pod, Service 조회
11:29:48 ubuntu@DESKTOP ~ → k get svc,pod -n argocd
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/argocd-applicationset-controller ClusterIP 10.96.164.148 <none> 7000/TCP,8080/TCP 60s
service/argocd-dex-server ClusterIP 10.96.181.111 <none> 5556/TCP,5557/TCP,5558/TCP 60s
service/argocd-metrics ClusterIP 10.96.244.128 <none> 8082/TCP 60s
service/argocd-notifications-controller-metrics ClusterIP 10.96.170.72 <none> 9001/TCP 60s
service/argocd-redis ClusterIP 10.96.153.103 <none> 6379/TCP 59s
service/argocd-repo-server ClusterIP 10.96.131.99 <none> 8081/TCP,8084/TCP 59s
service/argocd-server ClusterIP 10.96.233.212 <none> 80/TCP,443/TCP 59s
service/argocd-server-metrics ClusterIP 10.96.123.102 <none> 8083/TCP 59s
NAME READY STATUS RESTARTS AGE
pod/argocd-application-controller-0 1/1 Running 0 59s
pod/argocd-applicationset-controller-74575b6959-r27r5 1/1 Running 0 59s
pod/argocd-dex-server-64897989f8-8zv4z 1/1 Running 0 59s
pod/argocd-notifications-controller-566bc99494-bzp7q 1/1 Running 0 59s
pod/argocd-redis-79c755c747-vwdqb 1/1 Running 0 59s
pod/argocd-repo-server-bc9c646dc-svdfq 1/1 Running 0 59s
pod/argocd-server-757fddb4d7-cb2cl 1/1 Running 0 59s
초기 설치시 service type 이 ClusterIP 로 생성됨을 확인할 수 있다.
로컬 쿠버네티스에서 설치한경우 ArgoCD Service 에 접속하는 방법은 1) NodePort 2) PortForwarding 3) Ingress Controller 설치후 ingress 생성이 있다.
AWS , GCP , Naver Cloud 와 같이 공인 IP 가 부여되는 Cloud 환경에 설치한 경우 Service 를 LoadBalancer type 으로 변경 후 ArgoCD Service 에 접속이 가능하다.
5. ArgoCD Service 접속
5.1. Service Type NodePort 로 변경
11:30:50 ubuntu@DESKTOP ~ → kubectl patch svc argocd-server -n argocd --patch \
> '{"spec": { "type": "NodePort", "ports": [ { "nodePort": 30000, "port": 80, "protocol": "TCP", "targetPort": 8080} ] } }'
service/argocd-server patched
Service 확인
11:30:54 ubuntu@DESKTOP ~ → k get svc -n argocd
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-applicationset-controller ClusterIP 10.96.164.148 <none> 7000/TCP,8080/TCP 2m8s
argocd-dex-server ClusterIP 10.96.181.111 <none> 5556/TCP,5557/TCP,5558/TCP 2m8s
argocd-metrics ClusterIP 10.96.244.128 <none> 8082/TCP 2m8s
argocd-notifications-controller-metrics ClusterIP 10.96.170.72 <none> 9001/TCP 2m8s
argocd-redis ClusterIP 10.96.153.103 <none> 6379/TCP 2m7s
argocd-repo-server ClusterIP 10.96.131.99 <none> 8081/TCP,8084/TCP 2m7s
argocd-server NodePort 10.96.233.212 <none> 80:30000/TCP,443:31998/TCP 2m7s
argocd-server-metrics ClusterIP 10.96.123.102 <none> 8083/TCP 2m7s
argocd-server 서비스가 NodePort Type 으로 바뀐 것을 확인할수 있다.
http://localhost:30000/ 을 브라우저에 입력하면 ArgoCD 로그인 창으로 이동하게된다.
http://localhost:30000/ 을 브라우저에 입력하면 ArgoCD 로그인 창으로 이동하게된다.
5.2. 포트 포워딩
argocd-server 서비스를 19090 포트로 포트포워딩을 실행한다.
11:45:59 ubuntu@DESKTOP kind → kubectl port-forward svc/argocd-server 19090:80 -n argocd
Forwarding from 127.0.0.1:19090 -> 8080
Forwarding from [::1]:19090 -> 8080
Handling connection for 19090
Handling connection for 19090
Handling connection for 19090
Handling connection for 19090
Handling connection for 19090
Handling connection for 19090
Handling connection for 19090
Handling connection for 19090
Handling connection for 19090
Handling connection for 19090
Handling connection for 19090
Handling connection for 19090
Handling connection for 19090
http://localhost:19090/ 으로 접속하면 ArgoCD 로그인창으로 이동한다.
포트포워딩 명령어를 실행한 터미널을 닫거나 Ctrl (컨트롤) + C 를 누르면 Port Forwarding 이 종료됨을 주의해야한다.
5.3. ingress 생성
ArgoCD 는 내부적으로 https 를 사용하기 때문에 kubernetes 에 설치한 ingress controller의 deployment 를 수정해줘야한다. (Nginx Ingress Controller 기준)
kubectl edit deploy -n ingress-nginx
spec.containers.args[] 에 아래 내용을 추가해준다.
--enable-ssl-passthrough
운영 환경에서는 SSL 인증서를 Setting 하면 되므로 위 절차는 생략해도된다.
ArgoCD ingress example (Nginx)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argocd-ingress
namespace: argocd
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
rules:
- host: "argocd.demo.com"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: argocd-server
port:
number: 80
hosts 설정 (window example)
hosts 파일에 아래 내용을 추가해준다.
# C:\Windows\System32\drivers\etc\hosts
127.0.0.1 argocd.demo.com
http://argocd.demo.com 으로 접속하면 로그인창으로 이동하는것을 확인할 수있다.
6. ArgoCD 로그인
아이디 : admin
ArgoCD 초기 비밀번호는 아래 명령어로 찾을 수 있다.
# admin 초기 비밀번호
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
로그인후 비밀번호를 변경하면된다.
'DevOps, Infra' 카테고리의 다른 글
[skaffold] window 에 설치한 skaffold Trouble Shooting (0) | 2022.12.29 |
---|---|
[ArgoCD] 무중단 배포 전략 (0) | 2022.12.29 |
[Jenkins] 빌드 자동화 - webhook (0) | 2022.12.28 |
[Jenkins] Jenkinsfile (0) | 2022.12.28 |
[Jenkins] 빌드 자동화 - polling (0) | 2022.12.27 |