mingming

Jenkins + ArgoCD CI/CD Pipeline 구축(2) - Kustomize, ArgoCD 본문

DevOps

Jenkins + ArgoCD CI/CD Pipeline 구축(2) - Kustomize, ArgoCD

mingming_96 2024. 2. 7. 21:37

Kustomize

Kustomize는 Kubernetes 애플리케이션 배포를 위한 오픈 소스 도구로, 배포 구성을 관리하고 수정하기 위한 YAML 패치 메커니즘을 제공합니다. Kustomize를 사용하면 Kubernetes 리소스 정의에 대한 설정을 관리하고 커스터마이징할 수 있으며, 여러 환경 또는 배포 단계에 따라 리소스를 조정할 수 있습니다. Kustomize는 Kubernetes에 내장되어 있으며, Kubernetes 1.14 버전 이후에는 kubectl 명령어를 통해 직접 사용할 수 있습니다.

 

해당 프로젝트에서 배포할 manifest 파일이 있는 git repo의 파일 구조는 다음과 같습니다.

├── base
│   ├── kustomization.yaml
│   ├── sessac-deployment.yaml
│   ├── sessac-ingress.yaml
│   └── sessac-service.yaml
├── ingress
│   ├── argo-ingress.yaml
│   ├── grafana-ingress.yaml
│   ├── jenkins-ingress.yaml
│   └── kibana-ingress.yaml
└── overlays
    ├── dev
    │   ├── dev-deployment-patch.yaml
    │   ├── dev-ingress-patch.yaml
    │   ├── dev-service-patch.yaml
    │   └── kustomization.yaml
    ├── product
    │   ├── kustomization.yaml
    │   ├── prod-deployment-patch.yaml
    │   ├── prod-ingress-patch.yaml
    │   └── prod-service-patch.yaml
    └── stage
        ├── kustomization.yaml
        ├── stage-deployment-patch.yaml
        ├── stage-ingress-patch.yaml
        └── stage-service-patch.yaml

 

Base

Base는 원본 리소스 정의를 담고 있는 디렉토리나 파일입니다. 기본적으로는 애플리케이션을 설명하는 Kubernetes 리소스 정의가 들어있는 곳입니다.

Overlay

Overlay는 Base를 기반으로 하여 수정사항이나 추가사항을 정의하는 디렉토리나 파일입니다. Overlay를 사용하여 리소스를 수정하거나 확장할 수 있습니다. 여러 Overlay를 사용하여 다양한 환경 또는 배포 단계에 맞게 설정을 변경할 수 있습니다.

Patch

Patch는 리소스의 특정 부분을 수정하기 위한 작은 YAML 파일입니다. 이를 사용하여 리소스의 필드를 추가, 변경 또는 삭제할 수 있습니다.

 

kustomization.yaml

kustomize 도구의 설정파일로 리소스 정의에 대한 수정을 허용하여 여러 환경에 맞게 manifest 파일을 쉽게 커스터마이징 할 수 있도록 합니다. 다음은 해당 프로젝트에서 사용한 kustomization.yaml 파일입니다.

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base  ## 참조할 base 리소스

patches:
- path: prod-ingress-patch.yaml  ## Ingress 리소스에 대한 패치 파일 경로
  target:
    group: networking.k8s.io
    kind: Ingress
    name: sessac-app-ingress  ## Ingress 리소스의 이름

- path: prod-deployment-patch.yaml  ## Deployment 리소스에 대한 패치 파일 경로
  target:
    group: apps
    kind: Deployment
    name: sessac-app-deployment  ## Deployment 리소스의 이름
    version: apps/v1  ## Deployment의 API 버전

- path: prod-service-patch.yaml  ## Service 리소스에 대한 패치 파일 경로
  target:
    kind: Service
    name: sessac-app-service  ## 목표 Service 리소스의 이름
    version: v1  ## Service의 API 버전

images:
- name: <AWSID>.dkr.ecr.ap-northeast-2.amazonaws.com/sessac-app
  newName: <AWSID>.dkr.ecr.ap-northeast-2.amazonaws.com/sessac-app 
  newTag: "{Build_Number}"  ## 새 이미지의 태그

 

ArgoCD

 

ArgoCD는 선언적 배포를 통해 정의되어있는 YAML파일을 Kubernetes cluster에 배포하는 역할을 담당합니다. YAML 파일이 저장되어 있는 git repo를 사용해 손쉽게 배포가 가능하고, 프라이빗 git repo를 이용하기 위해선 같이 인증을 통한 git repo 등록이 필요합니다. 

git repo 등록

 

SSH, HTTPS, Github App 등 여러가지 인증 방식을 지원하지만 해당 프로젝트에서 HTTPS 방식으로 인증을 진행했습니다. 해당 방식으로 repo를 등록할 때 사용자 이름과 Credential이 필요합니다. 

ArgoCD가 바라볼 manifest git repo에 대한 Credential을 생성 후 사용자 이름과 Credential을 입력하여 repo 등록을 완료합니다.

 

Applications 등록

  

Ingress와 prod-sesac-app 두 개의 Application을 생성했습니다. Application은 배포하고자 하는 애플리케이션을 의미합니다. 각 애플리케이션은 Git repo 에서 가져온 정의를 기반으로 하며, Kubernetes 클러스터에 배포됩니다.

ArgoCD는 Helm, Kustomize, Directory 방식의 배포를 지원하며. Ingress의 경우 변경사항이 거의 없을거라 판단하여 Directory 방식으로 애플리케이션을 구성하였고, prod-sesac-app의 경우 Kustomize 방식을 통해 애플리케이션을 구성하였습니다. 앞서 Jenkins에서 Kustomize 명령이 수행되어 변경된 kustomization.yaml 파일의 내용을 기반으로 build해 변경사항을 체크하고 지속적으로 sync를 맞추게 됩니다.

'DevOps' 카테고리의 다른 글

Jenkins Maven Project JDK 버전 설정  (0) 2025.02.08
Jenkins + ArgoCD CI/CD Pipeline 구축(1) - Jenkins  (0) 2024.02.04
Jenkins Blue/Green Deployment  (0) 2023.09.14
Jenkins 메뉴 소개  (0) 2023.09.11
jenkins on kubernetes  (0) 2023.09.10