GitOps란?
특정 도구가 아닌 방법론이며 이름에서 알 수 있듯이 깃(Git)으로 관리(Ops)를 하겠다 라는 개념이다. DevOps를 적용하는 실천 방법 중 하나이며, Kubernetes를 대상으로 지속적 배포 (Continous Deployment)에 초점을 두고 있다. 때문에 GitOps는 빌드와 테스트를 하는 지속적 통합(Continuos Integration) 단계가 끝나고 난 후 배포하는 과정을 다루게 된다.
GitLab에서 Kubernetes Agent를 통해 CI/CD 모두를 제공하지만 본인은 GitOps 방식의 장점을 살리고 배포에 관련된 모든 것을 Git에서 관리하는 선언형(Declarative)으로 배포를 원하기 때문에 GitLab과 ArgoCD를 연동하여 배포시스템을 구축하였다.
GitOps의 원칙
- 모든 시스템은 선언적(Declarative)으로 구성되어야 한다.
- 시스템의 상태는 Git을 따르며 SSOT(Single Source of Truth)원칙을 따라야 한다.
- 승인된 변화는 자동으로 시스템에 적용된다.
- 배포에 실패하면 Alert으로 사용자에게 경고한다.
ArgoCD를 채택한 이유는 다음과 같다.
- GitOps 방식으로 관리되는 Manifest(yaml) 파일의 변경사항을 감시하며, 현재 배포된환경의 상태와 Git Source 파일에 정의된 상태를 동일하게 유지하는 역할을 수행한다.
- 배포된 Application을 직관적이고 간결하게 확인할 수 있다.
- 클러스터 지원 및 Argo Rollout과 같은 CRD(Custom Resource Definition)을 제공하며 이를 이용해 Blue-Green, Canary와 같은 배포 전략을 수립할 수 있다.
ArgoCD 설치
ArgoCD에서 배포 타켓 In-cluster를 지원하기 때문에 배포할 클러스터에 설치해준다.
❯ kubectl create namespace argocd
❯ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
아래 명령어를 통해 ArgoCD 설치를 확인할 수 있다.
❯ kubectl get pod -n argocd
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 5d
argocd-applicationset-controller-66689cbf4b-mjm6z 1/1 Running 0 5d
argocd-dex-server-66fc6c99cc-fz5dm 1/1 Running 0 5d
argocd-notifications-controller-8f8f46bd6-87fmm 1/1 Running 0 5d
argocd-redis-ha-haproxy-7bd6656877-76c58 1/1 Running 0 5d
argocd-redis-ha-haproxy-7bd6656877-v4kg2 1/1 Running 0 5d
argocd-redis-ha-haproxy-7bd6656877-x4f6v 1/1 Running 0 4d23h
argocd-redis-ha-server-0 2/2 Running 0 5d
argocd-redis-ha-server-1 2/2 Running 0 5d
argocd-redis-ha-server-2 2/2 Running 0 5d
argocd-repo-server-66cd97b547-fzwpj 1/1 Running 0 5d
argocd-repo-server-66cd97b547-tk872 1/1 Running 0 4d23h
argocd-server-6468b6d7b4-wc22z 1/1 Running 0 5d
처음 ArgoCD가 설치되면 기본은 Cluster IP로 되어있는데, ArgoCD에 접근하기 위해서 서비스 타입을 바꿔주자
본인의 환경은 ALB Ingress Controller를 이용하여 AWS에 ALB를 만들고 ACM을 통해 SSL 인증서, 그리고 external-dns를 이용해 Route 53에 도메인까지 생성하도록 설정하였다.
먼저 서비스 Type을 NodePort로 변경한다.
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'
argocd-ingress.yaml 파일을 생성후 아래와 같이 입력한다.
❯ cat argocd-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:{SSL인증서의 arn값}
alb.ingress.kubernetes.io/healthcheck-path: /
alb.ingress.kubernetes.io/healthcheck-protocol: HTTP
alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
kubernetes.io/ingress.class: alb
external-dns.alpha.kubernetes.io/hostname: {Route 53에 생성할 도메인}
finalizers:
- ingress.k8s.aws/resources
labels:
app: argocd-test
tier: backend
name: argocd-ingress # 인그레스 이름 정하기
namespace: argocd # 설치할 네임스페이스
spec:
containers:
rules:
- http:
paths:
- backend:
service:
name: argocd-server # 연결할 서비스 (이부분은 고정)
port:
number: 80 # (이부분도 고정)
path: /*
pathType: ImplementationSpecific
생성한 URL이 정상적으로 AWS에 구성되었는지 확인한 후 접속하면 아래와 같이 문어친구를 볼 수 있다.
최초 로그인 비밀번호는 다음과 같이 확인한다.
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d