# Helm과 Kustomize 사용법 ## 목차 - [Helm과 Kustomize 사용법](#helm과-kustomize-사용법) - [목차](#목차) - [참고 자료](#참고-자료) - [Helm 소개](#helm-소개) - [Helm이란 무엇인가?](#helm이란-무엇인가) - [Helm의 기본 구성 요소](#helm의-기본-구성-요소) - [Chart: Helm 패키지의 구조](#chart-helm-패키지의-구조) - [Repository: 차트 저장과 공유](#repository-차트-저장과-공유) - [Releases: 배포 관리](#releases-배포-관리) - [Helm 설치 및 설정](#helm-설치-및-설정) - [Helm 설치하기](#helm-설치하기) - [차트 사용](#차트-사용) - [차트 검색 및 추가](#차트-검색-및-추가) - [차트 설치, 업그레이드 및 롤백](#차트-설치-업그레이드-및-롤백) - [차트 값 커스터마이징](#차트-값-커스터마이징) - [차트 만들기](#차트-만들기) - [차트 생성 및 Packaging](#차트-생성-및-packaging) - [Chart 구성:](#chart-구성) - [의존성 관리](#의존성-관리) - [고급 Helm 기능](#고급-helm-기능) - [Helm 훅 (Hooks): 배포 흐름 제어](#helm-훅-hooks-배포-흐름-제어) - [Kustomize](#kustomize) - [Kustomize의 개념](#kustomize의-개념) - [Kustomize의 핵심 요소](#kustomize의-핵심-요소) - [Base와 Overlay의 개념](#base와-overlay의-개념) - [Kustomize의 사용법](#kustomize의-사용법) - [Kustomization 파일](#kustomization-파일) - [고급 기능](#고급-기능) - [Transformers](#transformers) - [Generators](#generators) - [ConfigMapGenerator](#configmapgenerator) - [SecretsGenerator](#secretsgenerator) - [HelmChartInflationGenerator](#helmchartinflationgenerator) - [Kustomize와 Helm의 차이점](#kustomize와-helm의-차이점) ### 참고 자료 - [https://helm.sh/docs/](https://helm.sh/docs/) - [https://kubectl.docs.kubernetes.io/references/kustomize/builtins/](https://kubectl.docs.kubernetes.io/references/kustomize/builtins/)
## Helm 소개 ### Helm이란 무엇인가? Helm은 Kubernetes에서 사용되는 패키지 매니저로, 애플리케이션의 정의, 설치, 업그레이드를 간소화하는 도구입니다. ### Helm의 기본 구성 요소  #### Chart: Helm 패키지의 구조 Helm의 패키지로, 쿠버네티스 클러스터 내에서 애플리케이션을 실행하는데 필요한 모든 리소스와 설정을 담고 있는 파일의 집합입니다. 차트는 YAML 파일로 구성된 템플릿과 메타데이터로 구성됩니다. #### Repository: 차트 저장과 공유 차트를 저장하고 공유하는 공간입니다. 사용자는 자신의 차트를 생성하여 레포지토리에 업로드할 수 있고, 필요에 따라 다른 사용자의 차트를 검색하고 사용할 수 있습니다. #### Releases: 배포 관리 차트가 클러스터에 설치되었을 때의 인스턴스입니다. 하나의 차트로 여러 번의 설치가 가능하며, 각각은 독립적인 릴리스로 관리됩니다. ### Helm 설치 및 설정 #### Helm 설치하기 [Helm 설치 가이드 링크](https://helm.sh/docs/intro/install/) ### 차트 사용 #### 차트 검색 및 추가 Repo 추가 ``` helm repo add [repo_name] [repo_url] helm repo update ``` Chart 검색 helm search repo [keyword] #### 차트 설치, 업그레이드 및 롤백 설치 ``` helm install [release_name] [chart_name] ``` 구성 값 설정 ``` helm install [release_name] [chart_name] --values custom_values.yaml helm install [release_name] [chart_name] --set key=value ``` 업그레이드 및 롤백 ``` helm upgrade [release_name] [chart_name] helm rollback [release_name] [revision] ``` Chart 삭제 ``` helm uninstall [release_name] ``` #### 차트 값 커스터마이징 ``` helm install [release_name] [chart_name] --values custom_values.yaml helm install [release_name] [chart_name] --set key=value ``` ### 차트 만들기 #### 차트 생성 및 Packaging ``` helm create [chart_name] ``` #### Chart 구성: 1. **Chart.yaml** 기본 정보 파일: 차트의 메타데이터를 포함하며, 차트의 이름, 버전, 설명 등이 포함됩니다. 이 파일은 차트의 아이덴티티를 정의하고 다른 차트와 구별하는 데 사용됩니다. 2. **values.yaml** 기본 설정 파일: 차트의 설치 시 사용되는 기본 구성 값들을 정의합니다. 사용자는 이 파일에 정의된 값을 오버라이드하여 사용자 정의 설정을 적용할 수 있습니다. 3. **templates/** 쿠버네티스 리소스 템플릿: 이 디렉토리에는 차트의 리소스를 생성하는 데 사용되는 템플릿 파일들이 들어 있습니다. 각 파일은 쿠버네티스 API 객체를 정의하며, Helm의 템플릿 언어를 사용하여 동적으로 값들을 주입할 수 있습니다. 4. **charts/** 종속 차트: 다른 차트에 의존하는 차트들을 포함하는 디렉토리입니다. 주로 복잡한 애플리케이션을 모듈화하여 관리할 때 사용됩니다. 예를 들어, 웹 애플리케이션 차트가 데이터베이스 차트에 의존할 수 있습니다. 5. **crds/** Custom Resource Definitions (CRDs): 차트가 사용하는 커스텀 리소스 정의를 포함합니다. 이 디렉토리의 CRD 파일들은 차트 설치 시 클러스터에 먼저 설치되어야 하는 리소스를 정의합니다. 6. **.helmignore** 차트 패키징에서 제외할 파일 목록: .gitignore 파일과 유사하게 작동하며, 차트를 패키징할 때 무시해야 할 파일이나 디렉토리를 지정합니다. #### 의존성 관리 Chart.yaml 파일의 dependencies 필드에 아래와 같이 리스트업합니다. ``` dependencies: - name: apache version: 1.2.3 repository: https://example.com/charts - name: mysql version: 3.2.1 repository: https://another.example.com/charts ``` 의존성 관리 명령어: ``` helm dependency list helm dependency update helm dependency build ``` ### 고급 Helm 기능 #### Helm 훅 (Hooks): 배포 흐름 제어 Helm hook은 Helm 차트의 생명주기 동안 특정 포인트에서 사용자 정의 작업을 실행할 수 있는 기능을 제공합니다. Annotation Value | Description ---------|--------- pre-install | Executes after templates are rendered, but before any resources are created in Kubernetes post-install | Executes after all resources are loaded into Kubernetes pre-delete | Executes on a deletion request before any resources are deleted from Kubernetes post-delete | Executes on a deletion request after all of the release's resources have been deleted pre-upgrade | Executes on an upgrade request after templates are rendered, but before any resources are updated post-upgrade | Executes on an upgrade request after all resources have been upgraded pre-rollback | Executes on a rollback request after templates are rendered, but before any resources are rolled back post-rollback | Executes on a rollback request after all resources have been modified test | Executes when the Helm test subcommand is invoked ( view test docs) 예제: ``` apiVersion: batch/v1 kind: Job metadata: name: "{{ .Release.Name }}" labels: app.kubernetes.io/managed-by: {{ .Release.Service | quote }} app.kubernetes.io/instance: {{ .Release.Name | quote }} app.kubernetes.io/version: {{ .Chart.AppVersion }} helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" annotations: # This is what defines this resource as a hook. Without this line, the # job is considered part of the release. "helm.sh/hook": post-install "helm.sh/hook-weight": "-5" "helm.sh/hook-delete-policy": hook-succeeded spec: template: metadata: name: "{{ .Release.Name }}" labels: app.kubernetes.io/managed-by: {{ .Release.Service | quote }} app.kubernetes.io/instance: {{ .Release.Name | quote }} helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" spec: restartPolicy: Never containers: - name: post-install-job image: "alpine:3.3" command: ["/bin/sleep","{{ default "10" .Values.sleepyTime }}"] ``` ## Kustomize ### Kustomize의 개념 - Kustomize는 Kubernetes 리소스의 Manifest 파일을 관리하는 도구입니다. - 원본 Manifest를 도대로 사용자가 정의한 변경내용을 적용하여 새로운/커스커마이즈된 manifest를 생성해주는 도구입니다. - 코드 중복을 최소화하면서 여러 환경(개발, 스테이징, 프로덕션 등)에 대해 동일한 애플리케이션을 다르게 설정할 수 있게 해줍니다.  ### Kustomize의 핵심 요소 **kustomization.yaml** 파일 - *kustomization.yaml* 파일로, Kustomize의 작업을 지시합니다. 이 파일은 사용할 리소스, 적용할 패치, 그리고 다른 설정(예: 네임스페이스 변경, 라벨 추가)을 정의합니다. **변형에 대한 정의**: - **Transformer** - 여러 리소스에 대한 일괄적으로 적용 작업 수행 (namespace, label, annotation, prefix 등) - **Patch** - 리소스의 특정 부분을 수정하기 위한 패치 파일을 지정합니다. 패치는 strategic, JSON, 그리고 merge patch의 형식을 사용할 수 있습니다. - **Generator** - ConfigMaps과 Secrets를 동적으로 생성할 수 있도록 합니다. #### Base와 Overlay의 개념 여러 환경(개발, 스테이징, 프로덕션 등)에 대해 동일한 애플리케이션을 다르게 설정할 수 있게 해줍니다. **Base** Base는 재사용 가능한 구성 요소의 집합입니다. 이는 쿠버네티스 리소스(예: Deployment, Service, ConfigMap 등)의 기본 구성 파일을 포함하며, 하나 이상의 overlay에서 참조되고 재사용됩니다. Base 구성은 일반적으로 공통의 로직, 미들웨어 설정, 기본 애플리케이션 설정 등을 포함할 수 있으며, 모든 환경에서 기본적으로 필요로 하는 설정들을 담고 있습니다. **Overlay** Overlay는 base에 대해 특정 환경에 맞게 수정을 가하는 구성입니다. 예를 들어, 개발, 스테이징, 프로덕션 환경에 따라 CPU 및 메모리 할당량, 환경 변수, 비밀번호, API 키 등이 다를 수 있습니다. 각각의 overlay는 이런 특정 환경을 타겟으로 하여 base에서 정의된 리소스에 패치를 적용하거나 리소스를 추가, 변경합니다. Overlay는 환경별 설정을 관리하는 데 유용하여, 각 환경에 맞춤화된 구성을 생성할 수 있습니다. **작동 원리** Kustomize는 base와 여러 overlay를 사용하여 각 환경에 맞는 구성을 조합합니다. 사용자는 kustomization.yaml 파일을 통해 base 리소스를 정의하고, 각 환경별 overlay 폴더에서 환경 특화 구성을 추가로 정의할 수 있습니다. Kustomize는 이 정보를 읽고, base에 overlay의 변경 사항을 머지하여 최종 쿠버네티스 구성을 생성합니다. 이러한 접근 방식은 구성의 일관성을 유지하고, 관리를 단순화하는 데 크게 기여합니다. ``` . ├── base │ ├── kustomization.yaml │ ├── deployment.yaml │ └── service.yaml └── overlays ├── development │ ├── kustomization.yaml │ └── patch_deployment.yaml ├── staging │ ├── kustomization.yaml │ └── patch_deployment.yaml └── production ├── kustomization.yaml └── patch_deployment.yaml ``` #### Kustomize의 사용법 결과 출력: ``` kubectl kustomize