[Week7] AWS EKS CI/CD (2/2)

오태경·2024년 4월 20일
post-thumbnail

본 게시물은 CloudNet@팀 Gasida(서종호) 님이 진행하시는
AWS EKS Workshop Study 내용을 기반으로 작성되었습니다.

Argo CD

  • Kubernetes 애플리케이션을 위한 오픈 소스 지속적 전달 도구
  • GitOps 접근 방식을 사용하여 Kubernetes 클러스터에 애플리케이션 배포를 자동화
  • YAML 파일을 사용한 선언적 구성



Architecture

  • API Server : Web UI 대시보드, k8s api 처럼 API 서버 역할

    • 웹 UI, CLI 및 CI/CD 시스템에서 소비되는 API를 노출하는 gRPC/REST 서버
    • 애플리케이션 관리 및 상태 보고
    • 애플리케이션 작업 호출 (e.g. sync, rollback, user-defined actions)
    • repository and cluster 자격 증명 관리 (stored as K8s secrets)
    • 외부 ID 공급자에게 인증 및 위임
    • RBAC 시행
    • Git webhook 이벤트에 대한 수신자/송신자
  • Repository Server : Git 연결 및 배포할 yaml 생성

    • 애플리케이션 매니페스트를 보유하고 있는 Git repository의 로컬 캐시를 유지하는 내부 서비스
      다음 입력이 제공될 때 Kubernetes 매니페스트를 생성하고 반환하는 역할을 한다.
      • repository URL
      • revision (commit, tag, branch)
      • application path
      • template specific settings: parameters, helm values.yaml
  • Application Controller : k8s 리소스 모니터링, Git과 비교

    • Kubernetes 컨트롤러로 실행 중인 애플리케이션을 지속적으로 모니터링하고 현재 라이브 상태를 원하는 대상 상태와 비교 (repo에 지정된 대로)
    • OutOfSync 애플리케이션 상태를 감지하고 선택적으로 수정 조치를 취함
    • 라이프사이클 이벤트(PreSync, Sync, PostSync)에 대한 사용자 정의 hook를 호출하는 역할
  • Redis : k8s api와 git 요청을 줄이기 위한 캐싱

  • Notification : 이벤트 알림, 트리거

  • Dex : 외부 인증 관리

  • ApplicationSet Controller : 멀티 클러스터를 위한 App 패키징 관리



설치

# helm 설치
cat <<EOT > argocd-values.yaml
global:
  domain: argocd.$MyDomain

configs:
  params:
    server.insecure: true

controller:
  metrics:
    enabled: true
    serviceMonitor:
      enabled: true

server:
  ingress:
    enabled: true
    controller: aws
    ingressClassName: alb
    hostname: "argocd.$MyDomain"
    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/backend-protocol: HTTP
      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":80}, {"HTTPS":443}]'
      alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
      alb.ingress.kubernetes.io/ssl-redirect: '443'
    aws:
      serviceType: ClusterIP
      backendProtocolVersion: GRPC
  metrics:
    enabled: true
    serviceMonitor:
      enabled: true

repoServer:
  metrics:
    enabled: true
    serviceMonitor:
      enabled: true

applicationSet:
  metrics:
    enabled: true
    serviceMonitor:
      enabled: true

notifications:
  metrics:
    enabled: true
    serviceMonitor:
      enabled: true
EOT

kubectl create ns argocd
helm repo add argo https://argoproj.github.io/argo-helm
helm install argocd argo/argo-cd --version 6.7.11 -f argocd-values.yaml --namespace argocd

# 확인
kubectl get ingress,pod,svc -n argocd
NAME                                      CLASS   HOSTS                ADDRESS   PORTS   AGE
ingress.networking.k8s.io/argocd-server   alb     argocd.tkops.click             80      23s

NAME                                                    READY   STATUS    RESTARTS   AGE
pod/argocd-application-controller-0                     0/1     Running   0          23s
pod/argocd-applicationset-controller-85d64c6b7f-m6zfb   1/1     Running   0          23s
pod/argocd-dex-server-7746bdfd75-dfgrd                  1/1     Running   0          23s
pod/argocd-notifications-controller-64d9b554f4-9kbpk    1/1     Running   0          23s
pod/argocd-redis-554fbc6587-5bhsm                       1/1     Running   0          23s
pod/argocd-repo-server-5cd49b877-6d2zx                  0/1     Running   0          23s
pod/argocd-server-6c757c4964-9gr4b                      0/1     Running   0          23s

NAME                                               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
service/argocd-application-controller-metrics      ClusterIP   10.100.212.39    <none>        8082/TCP            24s
service/argocd-applicationset-controller           ClusterIP   10.100.192.94    <none>        7000/TCP            24s
service/argocd-applicationset-controller-metrics   ClusterIP   10.100.253.157   <none>        8080/TCP            24s
service/argocd-dex-server                          ClusterIP   10.100.149.102   <none>        5556/TCP,5557/TCP   24s
service/argocd-notifications-controller-metrics    ClusterIP   10.100.106.72    <none>        9001/TCP            24s
service/argocd-redis                               ClusterIP   10.100.36.34     <none>        6379/TCP            24s
service/argocd-repo-server                         ClusterIP   10.100.238.214   <none>        8081/TCP            24s
service/argocd-repo-server-metrics                 ClusterIP   10.100.29.152    <none>        8084/TCP            24s
service/argocd-server                              ClusterIP   10.100.226.123   <none>        80/TCP,443/TCP      24s
service/argocd-server-grpc                         ClusterIP   10.100.73.20     <none>        80/TCP,443/TCP      24s
service/argocd-server-metrics                      ClusterIP   10.100.22.50     <none>        8083/TCP            24s

kubectl get crd | grep argo
applications.argoproj.io                     2024-04-20T14:08:22Z
applicationsets.argoproj.io                  2024-04-20T14:08:22Z
appprojects.argoproj.io                      2024-04-20T14:08:21Z

# 최초 접속 암호 확인
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d ;echo
  • 접속 확인



Application Deploy

  • App 생성

    • Application Name : first-myweb
    • Project Name : default
    • SYNC POLICY : Manual
      • AUTO-CREATE NAMESPACE : 클러스터에 네임스페이스가 없을 시 argocd에 입력한 이름으로 자동 생성
      • APPLY OUT OF SYNC ONLY : 현재 동기화 상태가 아닌 리소스만 배포
    • PRUNE PROPAGATION POLICY
      • foreground : 부모(소유자, ex. deployment) 자원을 먼저 삭제함
      • background : 자식(종속자, ex. pod) 자원을 먼저 삭제함
      • orphan : 고아(소유자는 삭제됐지만, 종속자가 삭제되지 않은 경우) 자원을 삭제함



  • 배포 실행 (SYNC -> SYNCHRONIZE)
    • PRUNE : GIt에서 자원 삭제 후 배포시 K8S에서는 삭제되지 않으나, 해당 옵션을 선택하면 삭제시킴

    • FORCE : --force 옵션으로 리소스 삭제

    • APPLY ONLY : ArgoCD의 Pre/Post Hook은 사용 안함 (리소스만 배포)

    • DRY RUN : 테스트 배포 (배포에 에러가 있는지 한번 확인해 볼때 사용)

    • 리소스 클릭 -> LIVE MANIFEST(쿠버네티스 기준) & DESIRED MANIFEST(Git 기준) 확인



  • manifest 수정

    • in argocd

      • 확인
        # label 추가 확인
        kubectl get deploy -n first --show-labels
        NAME    READY   UP-TO-DATE   AVAILABLE   AGE   LABELS
        myweb   4/4     4            4           14m   add=label-test,argocd.argoproj.io/instance=first-myweb,gitadd=webedit
    • in Kubernetes

      # label 추가
      kubectl edit deploy -n first myweb
      ...
      labels:
       add: label-test
       add2: k8s-test
      ...
      
      kubectl get deploy -n first --show-labels
      NAME    READY   UP-TO-DATE   AVAILABLE   AGE   LABELS
      myweb   4/4     4            4           18m   add2=k8s-test,add=label-test,argocd.argoproj.io/instance=first-myweb,gitadd=webedit  
      • 확인
        argocd는 Git을 기준으로 Sync하기 때문에 DIFF 및 DESIRED MANIFEST에 변경점이 없다.

    • in Github

    • 확인
      OutOfSync 상태로 DIFF가 확인되며, Sync를 진행한다.

      kubectl get deploy -n first --show-labels
      NAME    READY   UP-TO-DATE   AVAILABLE   AGE   LABELS
      myweb   4/4     4            4           31m   add2=k8s-test,add3=git-test,add=label-test,argocd.argoproj.io/instance=first-myweb,gitadd=webedit



  • 결론 : GitOps를 하려거든 대상(k8s)에서 변경하지 말고, 소스(git)에서 변경하자!

0개의 댓글