12. gitops로 nginx 배포

2024. 11. 20. 17:30·devops/minikube

nginx를 gitops로 배포하게 되면 어떠한 애플리케이션도 쉽게 배포할 수가 있다. istio-gateway 차트도 있기 때문에 web으로도 쉽게 오픈할 수가 있다. 여태까지 어렵게 어렵게 돌아왔지만 다 지금을 위한 단계였다고 생각하면 좋을 것 같다. 잡설은 이정도로 하기로 하고 nginx를 올려보겠다.

Argo CD에서 app을 배포하기 위해 2가지 개념이 존재한다. 바로

  • Application
  • ApplicationSet

이다. 이 2가지는 서로 다른 개념으로 사용되는데 Application부터 알아보자.

Application

쿠버네티스 클러스터에 배포할 애플리케이션을 정의하는 리소스이다. 이 것은 Git 저장소의 특정경로에 있는 Kubernetes 메니페스트를 참조할 수도 있고, Helm 저장소를 참조할 수도 있다. 주로 단일 애플리케이션을 특정 클러스터에 배포할 때 사용한다.

 

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: myapp
spec:
  project: default
  source:
    repoURL: 'https://github.com/yourrepo/yourproject'
    targetRevision: HEAD
    path: path/to/app
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: default
  syncPolicy:
    automated: {}

ApplicationSet

ApplicationSet은 여러 Application 인스턴스를 동적으로 생성하기 위한 리소스이다.  이는 하나의 매니페스트를 사용하여 여러 클러스터나 여러 애플리케이션을 동시에 관리할 수 있게 한다. 대규모의 멀티 클러스터 배포나 동적배포, 동일한 애플리케이션을 여러 환경에 배포해야 할 때 유용하다. 여기서 포인트는 동적배포이다.  ApplicationSet은 다양한 제네레이터(List, Cluster, SCM Provider 등)를 사용하여 Application을 생성한다. 다음 예를 보자.

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: guestbook
spec:
  generators:
  - list:
      elements:
      - cluster: dev
        url: 'https://dev.cluster.com'
      - cluster: prod
        url: 'https://prod.cluster.com'
  template:
    metadata:
      name: '{{cluster}}-guestbook'
    spec:
      project: default
      source:
        repoURL: 'https://github.com/argoproj-labs/applicationset.git'
        targetRevision: HEAD
        path: examples/list-generator/guestbook/{{cluster}}
      destination:
        server: '{{url}}'
        namespace: guestbook


주요 차이점은 다음과 같다.

  •  관리 규모: Application은 한 개의 애플리케이션을 관리하고, ApplicationSet은 여러 애플리케이션을 동시에 관리함.
  • 유연성: ApplicationSet은 동적으로 Application을 생성하고, 다양한 환경에 맞춰 매개변수를 변경할 수 있다.
  • 복잡성: ApplicationSet은 설정과 관리 측면에서 조금 더 복잡하지만, 대규모 운영에서 유용하다.

나는 ApplicationSet을 이용해 배포할 계획이다. 그 이유는 다음과 같다.

 

Github에서 Yaml을 이용해 제너레이터를 사용하고, 그 때 values만 따로 모아서 관리하여 사용하려고 한다.(물론 github에 헬름차트를 통으로 넣으면 이런식으로 안해도된다.) 이렇게 세팅을 하려면 applicationset이 유일한 해결책이다.

 

 

Project

Argo CD에서 Project는 애플리케이션을 논리적으로 그룹화하고, 해당 애플리케이션의 배포를 제한한다.  여러가지 기능이 있지만 대표적으로

  • 리소스제한
  • RBAC
$ mkdir -p argocd/project
$ vi argocd/project/project.yaml

 

 

 

argocd/project/project.yaml

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: test
  namespace: argocd
spec:
  description: authenticator
  clusterResourceWhitelist:
    - group: '*'
      kind: '*'
  destinations:
    - namespace: '*'
      server: '*'
  sourceRepos:
    - '*'

 


이렇게 파일을 만들고 실행시켜주겠습니다.

$ kubectl apply -f argocd/project/project.yaml
appproject.argoproj.io/test created

 

 

이제 개발자스럽게 폴더트리를 짜도록하자.

├── argocd
│   ├── applicationsets
│   │   ├── dev
│   │   └── prod
│   └── project
│       └── project.yaml
└── helm-values
    ├── dev
    └── prod

 


gitops의 필수조건인 github와 argocd를 연결하도록 하겠다.

 

  • Repository URL: 본인 github주소
  • Username: github username
  • Password: github Token Or Password

를 넣어서 github와 연동을 완료하면된다.


이제 환경파일을 만들도록 하자.

$ vi argocd/applicationsets/config/dev/nginx-test.yaml

 

 

nginx-test.yaml

env: dev
project: test
repoURL: https://charts.bitnami.com/bitnami
chartName: nginx
chartVersion: 18.2.5
appname: nginx-test
namespace: test

 

values파일을 helm-values에 모아두도록한다.

$ vi helm-values/dev/nginx-test/values.yaml

 

values.yaml

# this is override default values
replicaCount: 1

service:
  type: ClusterIP

 

이 2가지 파일을 일단 푸쉬하자.


그런다음에 applicationsets을 만들어주면된다.

$ vi argocd/applicationsets/dev/test-applicationset.yaml

 

 

test-applicationset.yaml

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: test-application
  namespace: argocd
spec:
  generators:
  - git:
      repoURL: https://github.com/ggorockee/devops-camping.git
      revision: HEAD
      files:
      - path: "argocd/applicationsets/config/dev/*-test.yaml"

  template:
    metadata:
      name: '{{appname}}'
    spec:
      project: '{{project}}'
      sources:
      - repoURL: '{{repoURL}}'
        chart: '{{chartName}}'
        targetRevision: '{{chartVersion}}'
        helm:
          valueFiles:
            - "$values/helm-values/{{env}}/{{appname}}/values.yaml"
      - repoURL: https://github.com/ggorockee/devops-camping.git
        targetRevision: HEAD
        ref: values

      destination:
        server: 'https://kubernetes.default.svc'
        namespace: '{{namespace}}'
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
        syncOptions:
          - CreateNamespace=true

 

이제 실행해주겠다.

$ kubectl apply -f argocd/applicationsets/dev/test-applicationset.yaml

예쁘게 실행된 것을 볼 수 있다.

 

후에 아래파일을 변경해보자.

helm-values/dev/nginx-test/values.yaml

# this is override default values
replicaCount: 3

service:
  type: ClusterIP

replicaCount: 1->3

 

 

약 1~3분 후에 자동으로 변경되는 것을 볼 수 있다.

replica가 3으로 늘어난 것을 볼 수 있다.

 

이제 argocd와 git이 연결된 것을 볼 수 가 있다.

이런작업을 하기위해 부단히 많은 것을 해왔다. 여기까지 성공했으면 대부분 된거나 마찬가지라 생각한다. 최적화나 메모리 관리, 배포전략 같은 것은 정말 나중에 해도 늦지 않다. 지금은 어떻게든 경험하여 경험치를 올리는게 먼저니까 말이다.

 

'devops > minikube' 카테고리의 다른 글

14. Docker Image를 이용한 Helm Template 수정  (31) 2024.11.21
13. CI 구축  (26) 2024.11.21
11. argocd 접속  (24) 2024.11.20
10. argocd 설치  (0) 2024.11.20
9. 나만의 헬름차트 만들기 (2)  (24) 2024.11.19
'devops/minikube' 카테고리의 다른 글
  • 14. Docker Image를 이용한 Helm Template 수정
  • 13. CI 구축
  • 11. argocd 접속
  • 10. argocd 설치
꼬락이
꼬락이
ggorockee 님의 블로그 입니다.
  • 꼬락이
    꼬락이의 개발일지
    꼬락이
  • 전체
    오늘
    어제
    • 분류 전체보기 (30)
      • devops (28)
        • aws (0)
        • minikube (18)
        • go (10)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    EC2
    CICD
    Teleport
    clean-archtiecture
    쿠버네티스
    cert-manager
    systemd
    JWT
    istio
    rds
    Github action
    ArgoCD
    golang
    helm
    Minikube
    Gorm
    repository
    DB 연결
    CI
    k8s
    port-forwarding
    Github
    db 우회
    GO
    aws
    Clean Architecture
    yq
    SWAGGER
    argoc
    Kubernetes
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
꼬락이
12. gitops로 nginx 배포
상단으로

티스토리툴바