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 |