티스토리 뷰

실제 EKS에서 동작 확인을 하는건 ArgoCD 까지만 진행할 예정이다.

 

백엔드 개발자에게 관찰 가능성 도구들까지 배포하고 기능 확인까지하라는건 너무 가혹하다.

 

k8s에서 어플리케이션을 개발하고 배포한다면, ArgoCD는 한번쯤 들어봤을 수 있다.

 

주로 GitOps를 위해 사용되는데 ArgoCD와 GitHub을 이용해 자동 배포까지 진행해보려 한다.

 

이번 장에서는 ArgoCD를 배포하고 대시보드를 만들어 볼 것이다.

 

GitOps란?

GitOps는 Git 리포지토리를 단일 정보 소스로 사용하여 인프라를 코드로 제공합니다. 제출된 코드에서는 
CI 프로세스를 확인하고, CD 프로세스에서는 보안, 코드형 인프라(IaC) 또는 애플리케이션 프레임워크에 설정된 기타 경계와 같은 요구 사항을 확인하고 적용합니다. 코드에 대한 모든 변경 사항이 추적되므로 업데이트를 손쉽게 수행할 수 있으며 롤백이 필요한 경우 버전 제어 기능도 제공합니다.
https://www.redhat.com/ko/topics/devops/what-is-gitops

 

 

 

ArgoCD를 알아보기 전에 GitOps의 개념부터 알고 넘어가야 한다.

 

레거시 어플리케이션을 운영/개발하다보면 배포부터 피곤한 상황에 자주 놓인다. 첫 회사가 그랬다.

 

인프라와 어플리케이션을 따로 관리하고, 배포 작업을 수작업으로 하다보니 인프라와 소프트웨어 간의 설정이 다른 경우가 자주 발생했다.

 

이러한 불일치는 배포 및 운영 과정에서 다양한 문제를 발생시키며 수정하는데 큰 비용이 필요하다(로컬에서는 잘 동작하기 때문에 어디서 잘못됐는지 알아차리기가 힘들다).

 

이러한 문제를 해결하기 위해 GitOps가 등장했다. GitOps는 어플리케이션 배포에 Git 저장소를 활용하는 접근 방법으로 이번 포스팅에서는 GitHub을 활용한다.

 

ArgoCD란?

AWS - Github Actions를 썼을 때 CI/CD 파이프라인

 

ArgoCD는 GitOps를 지원하는 오픈소스 도구이다.

 

k8s 클러스터에 배포된 앱의 소스 코드가 저장된 Git 저장소를 모니터링하다가 변경 사항을 감지하여 자동으로 배포한다. 

ArgoCD는 배포를 위해 선언적 애플리케이션 관리(Declarative Application Management)를 사용한다.

 

이는 개발자가 어플리케이션의 상태를 명시적으로 정의해두면, ArgoCD가 현재 앱의 상태와 비교하여 정의해둔 상태를 유지하게 끔 만들어준다.

 

변경 사항이 발생하면 즉시 반영이 되기 때문에 통해 애플리케이션 운영/배포 과정에서 생길 수 있는 문제들을 막을 수 있게 된다.

 

ArgoCD는 k8s 오픈소스치곤 제법 오래됐다. 2022년부터 CNCF에서 Graduated 레벨을 받았다. (그런데 왜 ArgoCD GitHub에는 2천9백개의 이슈가...)

 

2022년에 CNCF에서 graduated 단계로 이동시킴

 

이정도면 ArgoCD와 GitOps에 대한 설명은 잘 된 것 같다.

 

GitHub Action 스크립트와 EKS 에서의 배포가 필요한데 GitHub Action 스크립트는 정리가 필요해서 2장에서 다루려고 한다.

 

우선은  EKS에 ArgoCD를 배포하고 대시보드에 접근하는데까지만 지행해보려고 한다.

 

Terraform 코드

Helm으로 ArgoCD 어플리케이션을 배포하고, VirtualService를 만들어 ArgoCD Dashboard 페이지와 연결해준다.

 

배포까지는 많은 코드가 필요하지 않다.

 

ArgoCD PAT(Personal Accesss Token)는 내가 사용할 Repository가 있는 GitHub에서 발급받으면 된다.

 

ArgoCD & Argo Rollouts

variable "argocd_chart" {
  type        = map(string)
  description = "ArgoCD chart"
  default = {
    name       = "argocd"
    namespace  = "argocd"
    repository = "https://argoproj.github.io/argo-helm"
    chart      = "argo-cd"
    version    = "5.46.6"
  }
}

variable "argo_rollouts_chart" {
  type        = map(string)
  description = "Argo Rollouts chart"
  default = {
    name       = "argo-rollouts"
    namespace  = "argo-rollouts"
    repository = "https://argoproj.github.io/argo-helm"
    chart      = "argo-rollouts"
    version    = "2.31.1"
  }
}

resource "helm_release" "argocd" {
  namespace        = var.argo_chart.namespace
  create_namespace = true
  repository       = var.argocd_chart.repository

  name    = var.argocd_chart.name
  chart   = var.argocd_chart.chart
  version = var.argocd_chart.version

  values = [
    yamlencode({
      server = {
        extraArgs = [
          "--insecure"
        ]
      }

      configs = {
        params = {
          "server.enable.gzip" = true
        }

        secret = {
          githubSecret = ""
          ## Argo expects the password in the secret to be bcrypt hashed. You can create this hash with
          argocdServerAdminPassword = ""
        }

        repositories = {
          "private-repo" = {
            url      = "url"
            project  = "default"
            type     = "git"
            # ArgoCD Personal Accesss Token
            password = ""
          }
        }
      }
    })
  ]
}

resource "helm_release" "argo_rollouts" {
  namespace        = var.argo_rollouts_chart.namespace
  create_namespace = true
  repository       = var.argo_rollouts_chart.repository

  name    = var.argo_rollouts_chart.name
  chart   = var.argo_rollouts_chart.chart
  version = var.argo_rollouts_chart.version

  values = [
    yamlencode({
      dashboard = {
          enabled = true
      }
    })
  ]

  depends_on = [helm_release.argocd]
}

Argo Rollouts는 Blue/Green, Canary 등의 고급 배포 기능을 지원한다.

 

dashboard.enabled = true 옵션을 주면 대시보드가 활성화된다.

 

여기까지 ArgoCD에 필요한 헬름차트이고, 이제 배포된 파드들에 접근하기 위한 service가 필요하다.

 

argocd service

resource "kubernetes_manifest" "argocd_route" {
  manifest = yamldecode(<<-YAML
  apiVersion: networking.istio.io/v1alpha3
  kind: VirtualService
  metadata:
    name: argocd
    namespace: argocd
  spec:
    gateways:
      - ${local.istio.namespace}/${kubernetes_manifest.istio_gateway.manifest["metadata"]["name"]}
    hosts:
      - argocd.[domain].com // "argoCD 접근 URL"
    http:
      - name: argocd-webhook-allow
        match:
          - uri:
              prefix: /api/webhook
        route:
          - destination:
              host: argocd-server.argocd.svc.cluster.local
              port:
                number: 80
        route:
          - destination:
              host: argocd-server.argocd.svc.cluster.local
              port:
                number: 80
YAML
  )

  field_manager {
    force_conflicts = true
  }

  depends_on = [kubernetes_manifest.istio_gateway]
}

잘 만들어 졌나 테스트

> kubectl get all -n argocd
NAME                                                   READY   STATUS    RESTARTS   AGE
pod/argocd-application-controller-0                    1/1     Running   0          3d23h
pod/argocd-applicationset-controller-786cb764c-lxg7m   1/1     Running   0          3d23h
pod/argocd-dex-server-7fbb8d5d4c-qvqn7                 1/1     Running   0          3d23h
pod/argocd-notifications-controller-59fcdb5c6f-gd5x5   1/1     Running   0          3d23h
pod/argocd-redis-5cf68b645d-cnz67                      1/1     Running   0          3d23h
pod/argocd-repo-server-67b8d4b698-57m25                1/1     Running   0          3d23h
pod/argocd-server-56b95dbcd4-ftcgg                     1/1     Running   0          3d23h

NAME                                       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
service/argocd-applicationset-controller   ClusterIP   10.100.238.210   <none>        7000/TCP            14d
service/argocd-dex-server                  ClusterIP   10.100.247.186   <none>        5556/TCP,5557/TCP   14d
service/argocd-redis                       ClusterIP   10.100.224.8     <none>        6379/TCP            14d
service/argocd-repo-server                 ClusterIP   10.100.20.34     <none>        8081/TCP            14d
service/argocd-server                      ClusterIP   10.100.20.203    <none>        80/TCP,443/TCP      14d

...

 

private-repo.url로 지정한 주소로 들어가주면 argocd 페이지가 나온다.

 

그리고 지정한 id/password를 작성하면 아래처럼 로그인이 되고 아래의 페이지가 나온다.

 

아직은 연결된 파드가 없어서 아무것도 나오지 않는다.

 

마치며

코드가 최신화가 되어있지 않아서 기회되면 github에 한번 더 정리할 계획이다.

 

그리고 다음장에서는 github와 연동하는 작업을 하려고 한다.

 

Github Action으로 CI를 구축하는 글은 7개월 전에 썼었는데 이제서야 이어서 쓰게 됐다...

2023.11.06 - [개발/인프라] - github action으로 CI/CD 구축하기 - 1. CI

2023.11.12 - [개발/인프라] - github action으로 CI/CD 구축하기 - 2. JIB

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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
글 보관함