[CI/CD] GitOps 방식의 CI/CD 구축하기 - ArgoCD

@isle·2022년 9월 7일
0

CI/CD

목록 보기
3/3
post-thumbnail

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
profile
사용자의 기억법

0개의 댓글