ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ArgoCD로 gitOps 구현하기
    SRE TechNote/ArgoCD 2022. 2. 7. 01:42

    쿠버네티스 환경에서 서비스를 운영하다 보면 각 서비스나 파드의 명세서(yaml)를 변경해야 하는 일이 생긴다. 하지만 다른 코드처럼 버전 관리나 문제가 생겼을 때의 롤백은 체계적으로 잡혀있지 않다.

    쿠버네티스의 시스템 구성요소 또한 선언적인 코드로 정의하고 Git Repo를 통해 지속적으로 관리 및 확장이 필요하다. 이러한 개념을 gitOps라 정의하고 이를 구현하도록 도와주는 툴이 바로 ArgoCD이다.

    기존 CI/CD 구성

    AWS 서비스를 이용해 서비스 운영 중인 쿠버네티스 환경의 CI/CD 구성도이다. 새로운 코드가 master 브랜치에 push 될 때마다 Jenkins를 통해 Deployment가 업데이트 되는 형식이다. 하지만 이 방식은 버전 외에 다른 정보를 수정하려면 jenkins 파이프라인을 별도로 수정해야 하므로 관리가 어려울뿐더러 번거로운 단점이 있다. 

    ArgoCD 도입

    ArgoCD를 도입한 후의 CI/CD 구성도이다. ArgoCD는 등록된 CodeCommit의 레포지토리를 지속적으로 모니터링하다가 yaml 파일에 변경이 있을 때 apply 시킨다. 이로써 CD를 ArgoCD에서 자동화 시킬 수 있으며 이력관리, 롤백 또한 쉬워지게 된다.

    ArgoCD 설정

     

    Getting Started - Argo CD - Declarative GitOps CD for Kubernetes

    Getting Started Tip This guide assumes you have a grounding in the tools that Argo CD is based on. Please read understanding the basics to learn about these tools. Requirements Installed kubectl command-line tool. Have a kubeconfig file (default location i

    argo-cd.readthedocs.io

    ArgoCD의 배포는 간단하다. 아래의 두줄이면 필요한 모든 리소스가 자동으로 배포되고 위의 공식 문서에 자세하게 나와있고 어려운 내용이 아니기 때문에 이글에서 자세히 다루지 않고 헷갈릴 수 있는 부분만 정리하려고 한다.

    kubectl create namespace argocd
    kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
     NAMESPACE↑   NAME                                     READY RESTARTS STATUS   
    │ argocd      argocd-application-controller-0           1/1         0 Running
    │ argocd      argocd-dex-server-5896d988bb-df4sn        1/1         0 Running  
    │ argocd      argocd-redis-74d8c6db65-crvnt             1/1         0 Running  
    │ argocd      argocd-repo-server-6fd99dbbb5-kqw6f       1/1         0 Running   
    │ argocd      argocd-server-64f7596ff4-5bx5g            1/1         0 Running

    argocd-server: 웹 UI, CLI 및 CI/CD 시스템에서 사용하는 API를 노출하는 gRPC/REST 서버이다.

    argocd-repo-server: 애플리케이션 manifest를 보유하는 Git 리포지토리의 로컬 캐시를 유지 관리하는 서버이다.

    argocd-application-controller: 실행 중인 애플리케이션을 지속적으로 모니터링하고 라이브 상태를 대상 상대와 비교하는 서버이다.


    Argo CD API Server를 외부 IP로 노출하는 방법은 위의 공식 문서에 나와있듯이 Service Type을 LoadBalancer로 변경하는 방법, Port Forwarding을 이용해 접근하는 방법 등이 있다. 하지만 우리는 주로 ALB를 이용해 접속하는 것에 익숙하기 때문에 alb ingress controller를 사용하는 분들은 Ingress로 배포 가능하니 아래 명세서를 참고하면 좋을 것이다.

    HTTPS를 사용하지 않고 HTTP로 접근할 때 로그인이 되지 않거나 Too Many Redirection이 발생하니 주의하자.

    Ingress 명세서

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: argocd-ingress
      namespace: argocd
      annotations:
        kubernetes.io/ingress.class: alb
        alb.ingress.kubernetes.io/listen-ports: |
          [{"HTTP": 80}, {"HTTPS": 443}]
        alb.ingress.kubernetes.io/certificate-arn: [ACM의 ARN]
        alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-2016-08
        alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
        alb.ingress.kubernetes.io/target-type: instance
        alb.ingress.kubernetes.io/scheme: internet-facing
        alb.ingress.kubernetes.io/backend-protocol: HTTPS
        alb.ingress.kubernetes.io/healthcheck-path: '/'
        alb.ingress.kubernetes.io/success-codes : '200'
        alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds=360
        alb.ingress.kubernetes.io/inbound-cidrs: [접속 가능한 IP], [...]
    spec:
      rules:
      - http:
          paths:
          - path: /*
            backend:
              serviceName: argocd-server
              servicePort: 443

     

    admin 계정의 패스워드를 변경 한 뒤 접속하면 된다. (공식 문서를 참조)

     

     

    설치는 모두 끝났다. 이제 git만으로 kubernetes의 리소스를 정의하고 다룰 수 있다. 주로 사용하는 git 리포지토리에 아래와 같은 구조로 리소스들을 명시해준다. 나는 resources 폴더를 Root로 잡고 각 애플리케이션별로 정리했다. 각 애플리케이션 폴더 아래에 리소스 명세서 (yaml 파일)을 정의해준다. 모든 리소스를 완벽하게 적용한 것은 아니기에 느낌만 봐주면 좋을 것 같다.

    Manifest 구조

    .
    ├── README.md
    └── resources
        ├── asset_mgmt
        │   ├── asset_mgmt_deploy.yaml
        │   └── asset_mgmt_svc.yaml
        ├── scheduler
        │   ├── scheduler_configmap.yaml
        │   ├── scheduler_deploy.yaml
        │   └── scheduler_secrets.yaml
        ├── srebgk
        │   ├── alb-ingress.yaml
        │   ├── backend_configmap.yaml
        │   ├── backend_secrets.yaml
        │   ├── hpa.yaml
        │   ├── pdb-srebgk.yaml
        │   └── sre_backend_deployment.yaml

    해당 코드를 git 리포지토리에 push 한 뒤 아래와 같이 ArgoCD에서 NEW APP 버튼을 눌러 적용한 뒤 생성하면 git에 올라간 명세서들이 클러스터의 리소스들과 동기화가 된다.

     

    각 APP을 눌러보면 git 리포지토리에 올라간 리소스들이 보일 거다. 이제부터 쿠버네티스의 리소스는 git으로만 관리하게 되는 것이다. 해당 리포지토리가 단일 진실 공급원 (SSOT)가 되는 것이고  kubectl 명령어로 리소스를 변경하더라도 ArgoCD에서 SYNC APP이 맞춰지는 순간 변경사항이 되돌아가니 아무 의미 없는 작업이 될 것이다.

    마치며


    ArgoCD를 적용한 뒤부터 쿠버네티스 리소스 작업이 좀 더 쉬어졌다. 매번 Vim 편집기를 이용해 Yaml파일을 수정하다 보니 휴먼 에러가 자주 발생하곤 했는데, Code로 관리함으로써 VSCode를 사용해 git Push 만으로 리소스가 동기화가 되니 너무 편하다.

    도입을 망설이는 분들께 추천하며, 신규 App 뿐 아니라 기존의 리소스에도 적용이 가능하다. ArgoCD를 적용한다고 기존 리소스가 지워지고 새롭게 올라오는 것이 아닌 Sync만 맞추는 것이기 때문에 쉽게 적용 가능할 것이다.


    댓글

Designed by Tistory.