본문 바로가기
Development, Architecture/Docker, k8s

[쿠버네티스] 헬름을 이용한 애플리케이션 패키징

by ggyongi 2024. 8. 4.
반응형

헬름이란

헬름을 사용하면 여러 개의 yaml 정의 스크립트를 하나의 아티팩트로 묶어 공개 또는 비공개 리포지터리에 공유할 수 있다

헬름은 쿠버네티스에 애플리케이션 수준의 추상화를 추가해준다.

헬름에서 사용되는 패키징 포맷은 쿱네티스 yaml 파일을 확장한 것으로, 헬름 패키지는 여러 개의 메니페스트를 모아 놓은 것과 같다.

 

헬름 사용하기

헬름을 사용하기위해 레포지토리를 따로 설정해야 한다. 헬름 레포지토리란 도커 허브 같은 컨테이너 이미지 레지스트리라고 생각하면 된다. 서버에서 사용가능한 모든 페키지의 목록을 제공하며 이 목록을 로컬에 저장했다가 패키지 검색에 사용한다.

 

용어 정리

차트: 애플리케이션의 패키지. 로컬 컴퓨터에서 만들어져 로컬에 설치될 수도 있고 레포지토리로 배포할 수도 있다.

릴리스: 설치한 차트를 의미한다. 릴리스에 이름을 붙일 수 있어 하나의 클러스터에 같은 차트를 여러 벌 설치할 수 있다.

 

명령어 예시

## 헬름 레포지토리 추가
## helm repo add <레포지토리_이름> <레포지토리_URL>
helm repo add stable https://charts.helm.sh/stable


## 레포지토리 업데이트
helm repo update


## 차트 검색
## helm search repo <검색_키워드>
helm search repo nginx


## 차트 설치
## helm install <릴리스_이름> <차트_이름>
helm install my-nginx stable/nginx


## 차트 업그레이드
## helm upgrade <릴리스_이름> <차트_이름>
helm upgrade my-nginx stable/nginx


## 차트 삭제
## helm uninstall <릴리스_이름>
helm uninstall my-nginx

 

차트의 구조

최상위 디렉토리: 이 디렉토리 이름이 차트 이름이 된다.

 

my-chart/
  ├── Chart.yaml
  ├── values.yaml
  ├── templates/
  │   ├── deployment.yaml
  │   ├── service.yaml
  │   └── _helpers.tpl
  ├── charts/
  └── .helmignore

 

아래는 chatGPT를 이용해 빠르게 정리해본 내용..

 

1. Chart.yaml

  • 차트의 메타데이터를 정의하는 파일로, 차트의 이름, 버전, 설명 등을 포함합니다.
  • 예시:

2. values.yaml

  • 차트에 대한 기본 설정 값을 정의하는 파일입니다. 사용자가 특정 값을 지정하지 않으면 이 파일의 값이 사용됩니다.
  • 이 파일을 통해 템플릿 파일에 동적으로 값을 주입할 수 있습니다.
  • 예시:
replicaCount: 2

image:
  repository: nginx
  tag: "1.16.0"
  pullPolicy: IfNotPresent

service:
  type: ClusterIP
  port: 80

 

3. templates/

  • Kubernetes 리소스 파일들의 템플릿이 저장되는 디렉터리입니다. 이 템플릿 파일들은 Go 템플릿 엔진을 사용해 동적으로 값을 삽입할 수 있습니다.
  • 보통 deployment.yaml, service.yaml 같은 리소스 정의 파일들이 위치하며, _helpers.tpl 같은 헬퍼 템플릿 파일도 포함될 수 있습니다.
  • 예시: deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "my-chart.fullname" . }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ include "my-chart.name" . }}
  template:
    metadata:
      labels:
        app: {{ include "my-chart.name" . }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          ports:
            - containerPort: {{ .Values.service.port }}

4. charts/

  • 차트 의존성을 저장하는 디렉터리입니다. 이곳에 다른 차트를 포함해 복잡한 애플리케이션을 구성할 수 있습니다.
  • 차트 의존성은 requirements.yaml 파일을 통해 정의되거나, 직접 charts/ 디렉터리에 포함됩니다.

5. .helmignore

  • 차트 패키징 시 포함하지 않을 파일이나 디렉터리를 지정하는 파일입니다.
  • .gitignore와 유사하게 특정 패턴의 파일을 무시할 수 있습니다.

 

 

변수를 다른 변수로 치환해서 차트 업그레이드하는 예시

helm upgrade my-nginx stable/nginx --set replicaCount=3 --set image.tag="1.17.0"

 

 

 

차트를 레포지토리에 배포하는 과정

1. 차트 패키징

먼저, 차트를 패키징하여 .tgz 파일로 만듭니다. 이 파일은 차트를 배포 가능한 패키지 형식으로 압축한 것입니다.

## helm package <차트_디렉터리>
helm package my-chart/

이 명령어를 실행하면 my-chart-0.1.0.tgz와 같은 파일이 생성됩니다. 이 파일의 이름은 Chart.yaml에 정의된 name과 version을 기반으로 자동 생성됩니다.

2. 로컬 레포지토리 생성 (선택사항)

로컬에서 헬름 레포지토리를 생성하고 싶다면, 다음과 같이 helm repo index 명령어를 사용하여 인덱스를 생성할 수 있습니다.

## helm repo index . --url <레포지토리_URL>
helm repo index . --url https://my-repo.com/charts

이 명령어는 현재 디렉터리에 있는 모든 .tgz 파일을 인덱싱하고, index.yaml 파일을 생성합니다. 이 파일은 차트의 메타데이터를 포함하며, 헬름 클라이언트가 레포지토리에서 차트를 검색할 수 있도록 합니다.

3. 차트를 원격 레포지토리에 업로드

원격 레포지토리에 차트를 업로드하는 방법은 사용 중인 레포지토리의 종류에 따라 다릅니다. 

ChartMuseum과 같은 헬름 레포지토리를 사용할 경우, curl을 사용해 HTTP POST 요청으로 .tgz 파일을 업로드할 수 있습니다.

curl --data-binary "@my-chart-0.1.0.tgz" http://my-chartmuseum.local/api/charts

4. 레포지토리 추가 및 업데이트

배포한 차트를 사용하려면, 헬름 클라이언트에서 해당 레포지토리를 추가하고 업데이트해야 합니다.

helm repo add my-repo https://my-repo.com/charts
helm repo update

5. 차트 설치

레포지토리에 업로드된 차트를 설치할 수 있습니다.

helm install my-release my-repo/my-chart

 

의존 차트 관리

차트 간에도 의존관계를 설정할 수 있어 복잡한 애플리케이션을 여러 개의 차트로 구성하고 관리할 수 있다. 예를 들어, 하나의 애플리케이션을 배포할 때 데이터베이스와 같은 다른 애플리케이션이 필요하다면, 이를 의존 차트로 설정하여 자동으로 함께 배포할 수 있다.

 

의존 차트 설정 방법

 

1. Chart.yaml 파일에 의존성 추가

의존 차트를 설정하려면, Chart.yaml 파일에 dependencies 섹션을 추가해야 합니다. 이 섹션에는 의존하는 차트의 이름, 버전, 저장소(URL) 등이 정의됩니다.

apiVersion: v2
name: my-app
version: 0.1.0

dependencies:
  - name: redis
    version: 14.6.0
    repository: https://charts.bitnami.com/bitnami
  - name: postgresql
    version: 10.13.4
    repository: https://charts.bitnami.com/bitnami

2. 의존성 차트 다운로드

Chart.yaml에 의존성을 추가한 후, 해당 차트들을 로컬에 다운로드해야 합니다. 이는 helm dependency update 명령어를 통해 수행됩니다. 이 명령어는 charts/ 디렉터리 아래에 필요한 차트들을 다운로드하고, 압축된 형태로 저장합니다. 예를 들어, my-app/charts/ 디렉터리 아래에 redis-14.6.0.tgz와 postgresql-10.13.4.tgz 파일이 생성됩니다.

## helm dependency update <차트_디렉터리>
helm dependency update my-app/

 

3. 의존 차트의 사용

의존 차트가 설정되면, 메인 차트와 함께 의존 차트들도 자동으로 배포됩니다. 예를 들어, my-app 차트를 설치하면 redis와 postgresql 차트도 함께 설치됩니다.

 

4. 의존성 버전 관리

의존 차트의 버전 관리는 매우 중요합니다. 의존 차트가 업데이트되면, 의존하는 차트도 이를 반영할 수 있도록 Chart.yaml 파일에서 버전을 업데이트하고, helm dependency update 명령어를 다시 실행해야 합니다.

 

 

롤백 사용하기

 

  • 릴리스 히스토리: 헬름은 각 릴리스의 배포 히스토리를 관리합니다. helm upgrade를 실행할 때마다 새로운 릴리스 버전이 생성되며, 각 버전은 고유한 번호로 관리됩니다.
  • 롤백 대상: 특정 릴리스 버전을 선택해 롤백할 수 있습니다. 예를 들어, 릴리스 버전 3에서 문제가 발생했다면, 버전 2로 롤백할 수 있습니다.

 

 

롤백 명령어 사용 방법

1. 릴리스 히스토리 확인

먼저, 릴리스의 히스토리를 확인하여 롤백할 버전을 선택합니다.

## helm history <릴리스_이름>
helm history my-release
 

이 명령어는 릴리스의 모든 히스토리를 보여주며, 각 버전의 번호, 상태, 업데이트 시간 등을 확인할 수 있습니다.

2. 특정 버전으로 롤백

히스토리에서 원하는 버전을 선택하여 롤백할 수 있습니다.

## helm rollback <릴리스_이름> <버전_번호>
helm rollback my-release 2

이 명령어는 my-release를 버전 2로 롤백합니다. 롤백이 완료되면, 릴리스는 지정된 버전의 설정으로 되돌아갑니다.

3. 롤백 결과 확인

롤백이 완료된 후, 현재 릴리스 상태를 확인하여 롤백이 성공적으로 이루어졌는지 점검할 수 있습니다.

## helm status <릴리스_이름>
helm status my-release
 

추가 옵션

롤백 명령어는 몇 가지 유용한 플래그를 제공합니다:

  • --dry-run: 실제로 롤백을 수행하지 않고, 어떤 변화가 있을지 미리 확인할 수 있습니다.
  • --recreate-pods: 롤백 과정에서 새로운 Pod를 생성하게 하여, Pod가 삭제되고 새로 생성되도록 할 수 있습니다.
  • --timeout: 롤백 작업에 지정된 시간 안에 완료되지 않으면 실패로 간주합니다.
 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글