원본: https://devopscube.com/create-helm-chart/?ref=blog.techiescamp.com

 

Helm 차트는 Kubernetes YAML 매니페스트 템플릿과 helm 특정 파일 의 조합입니다.

helm 패키지라고 부를 수 있습니다. Kubernetes YAML 매니페스트는 템플릿화할 수 있으므로 다양한 환경의 여러 helm 차트를 유지할 필요가 없습니다. Helm은 템플릿화 기능을 위해 go 템플릿화 엔진을 사용합니다.

 

단일 헬름 차트만 있으면 되고, 단일 값 파일을 변경하기만 하면 각 환경의 배포 매개변수를 수정할 수 있습니다. 헬름이 템플릿에 값을 적용합니다. 다음 섹션에서 실제적으로 자세히 알아보겠습니다.

 

높은 수준에서 Helm Charts는 복잡성을 줄이고, Kubernetes는 (dev, uat, cug, prod)단 하나의 템플릿으로 각 환경의 중복성을 구현합니다.

 

 

헬름 차트 구조

Helm 차트를 이해하기 위해 Nginx 배포의 예를 들어보겠습니다. Kubernetes에 Nginx를 배포하려면 일반적으로 다음 YAML 파일이 있어야 합니다.

nginx-deployment
    ├── configmap.yaml
    ├── deployment.yaml
    ├── ingress.yaml
    └── service.yaml

이제 위의 Nginx 배포를 위한 Helm Chart를 생성하면 다음과 같은 디렉토리 구조가 됩니다.

nginx-chart/
|-- Chart.yaml
|-- charts
|-- templates
|   |-- NOTES.txt
|   |-- _helpers.tpl
|   |-- deployment.yaml
|   |-- configmap.yaml
|   |-- ingress.yaml
|   |-- service.yaml
|   `-- tests
|       `-- test-connection.yaml
`-- values.yaml
  1. .helmignore: helm 차트에 포함시키고 싶지 않은 모든 파일을 정의하는 데 사용됩니다. .gitignore파일과 비슷하게 작동합니다.
  2. Chart.yaml: 버전, 이름, 설명 등 헬름 차트에 대한 정보가 포함되어 있습니다.
  3. values.yaml : 이 파일에서 YAML 템플릿의 값을 정의합니다. 예를 들어, 이미지 이름, 복제본 수, HPA 값 등입니다. 앞서 설명했듯이 각 환경에서 파일만 변경됩니다. 또한 이러한 값을 동적으로 재정의하거나 또는 명령을 values.yaml 사용하여 차트를 설치할 때 재정의할 수 있습니다 .--values--set
  4. charts: 우리의 주요 차트가 다른 차트에 대한 종속성이 있는 경우, 이 디렉토리 안에 다른 차트의 구조를 추가할 수 있습니다. 기본적으로 이 디렉토리는 비어 있습니다.
  5. templates: 이 디렉토리에는 애플리케이션을 형성하는 모든 Kubernetes 매니페스트 파일이 들어 있습니다. 이러한 매니페스트 파일은 values.yaml 파일에서 값에 액세스하도록 템플릿화할 수 있습니다. Helm은 deployment.yaml, service.yaml 등과 같은 Kubernetes 객체 에 대한 몇 가지 기본 템플릿을 생성하며 , 이를 직접 사용하거나 수정하거나 파일로 재정의할 수 있습니다.
  6. templates/NOTES.txt: 차트가 성공적으로 배포된 후 인쇄되는 일반 텍스트 파일입니다. 
  7. templates/_helpers.tpl: 해당 파일에는 여러 메서드와 하위 템플릿이 들어 있습니다. 이러한 파일은 Kubernetes 객체 정의에 렌더링되지 않지만 다른 차트 템플릿 내에서 어디에서나 사용할 수 있습니다. 
  8. templates/tests/: 차트가 설치되었을 때 예상대로 작동하는지 확인하기 위해 차트에서 테스트를 정의할 수 있습니다. 

 

Helm Chart 튜토리얼 GitHub Repo

이 Helm Chart Tutorial에서 사용된 예제 Helm Chart와 매니페스트는 Helm Chart Github repo 에 호스팅되어 있습니다 . 이를 복제하여 가이드를 따라갈 수 있습니다.

git clone https://github.com/techiescamp/helm-tutorial.git

 

헬름 최신버전 설치

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

처음부터 Helm 차트 만들기

헬름 차트를 직접 만들어보기 위해, Nginx 헬름 차트를 처음부터 만들어 보겠습니다.

다음 명령을 실행하여 차트 보일러플레이트를 만듭니다. nginx-chart기본 파일과 폴더가 있는 이름의 차트를 만듭니다.

helm create nginx-chart

생성된 차트를 확인해보면 다음과 같은 파일과 디렉토리가 있습니다.

nginx-chart
│   ├── Chart.yaml
│   ├── charts
│   ├── templates
│   │   ├── NOTES.txt
│   │   ├── _helpers.tpl
│   │   ├── deployment.yaml
│   │   ├── hpa.yaml
│   │   ├── ingress.yaml
│   │   ├── service.yaml
│   │   ├── serviceaccount.yaml
│   │   └── tests
│   │       └── test-connection.yaml
│   └── values.yaml

생성된 차트 디렉토리로 cd해 보겠습니다.

cd nginx-chart

우리는 배포 요구 사항에 따라 파일을 하나씩 편집 할 것입니다.

차트.yaml

위에서 언급했듯이, 우리는 차트의 세부 정보를 Chart.yaml파일에 넣습니다. 기본 내용을 chart.yaml 다음으로 바꿉니다.

apiVersion: v2
name: nginx-chart
description: My First Helm Chart
type: application
version: 0.1.0
appVersion: "1.0.0"
maintainers:
- email: contact@devopscube.com
  name: devopscube
  1. apiVersion : 차트 API 버전을 나타냅니다. v2는 Helm 3용이고 v1은 이전 버전용입니다.
  2. 이름: 차트의 이름을 나타냅니다.
  3. 설명: 헬름 차트에 대한 설명을 나타냅니다.
  4. 유형 : 차트 유형은 ' 애플리케이션 ' 또는 ' 라이브러리 '일 수 있습니다. 애플리케이션 차트는 Kubernetes에 배포하는 것입니다. 라이브러리 차트는 다른 차트와 함께 사용할 수 있는 재사용 가능한 차트입니다. 프로그래밍에서 라이브러리와 유사한 개념입니다.
  5. 버전 : 차트 버전을 나타냅니다. 
  6. appVersion : 이는 애플리케이션(Nginx)의 버전 번호를 나타냅니다. 
  7. 유지 관리자: 차트 소유자에 대한 정보입니다.

우리는 애플리케이션을 변경할 때마다  version와 를 증가시켜야 합니다 . 종속성, 아이콘 등과 같은 다른 필드도 있습니다.appVersion

템플릿

Helm에서 만든 디렉토리 에는 여러 파일이 있습니다 templates . 우리의 경우, 간단한 Kubernetes Nginx 배포를 작업할 것입니다.

템플릿 디렉토리에서 모든 기본 파일을 제거해 보겠습니다.

rm -rf templates/*

더 나은 이해를 위해 Nginx YAML 파일을 추가하고 이를 템플릿으로 변경하겠습니다.

파일을 만들고 deployment.yaml다음 내용을 복사하세요.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: release-name-nginx
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx-chart
          image: "nginx:1.16.0"
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
          volumeMounts:
            - name: nginx-index-file
              mountPath: /usr/share/nginx/html/
      volumes:
        - name: nginx-index-file
          configMap:
            name: index-html-configmap

위의 YAML 파일을 보면 값은 정적입니다. 헬름 차트의 아이디어는 YAML 파일을 템플릿화하여 여러 환경에서 동적으로 값을 할당하여 재사용할 수 있도록 하는 것입니다.

값을 템플릿화하려면 아래에 표시된 대로 중괄호 안에 개체 매개변수를 추가하기만 하면 됩니다 . 이를 템플릿 지시문 이라고 하며 구문은 Go 템플릿화 에 특화되어 있습니다.

{{ .Object.Parameter }}

먼저 객체가 무엇인지 알아봅시다. 다음은 이 예제에서 사용할 세 가지 객체입니다.

  1. 릴리스 : 모든 헬름 차트는 릴리스 이름과 함께 배포됩니다. 릴리스 이름을 사용하거나 템플릿 내에서 릴리스 관련 동적 값에 액세스하려면 릴리스 객체를 사용할 수 있습니다.
  2. 차트 : chart.yaml 에 언급한 값을 사용하려면 차트 객체를 사용하면 됩니다.
  3. 값 : values.yaml 파일 내의 모든 매개변수는 Values ​​객체를 사용하여 액세스할 수 있습니다.

지원되는 객체에 대한 자세한 내용을 알아보려면 Helm 내장 객체 문서를 확인하세요.

다음 이미지는 내장된 객체가 템플릿 내부에서 어떻게 대체되는지 보여줍니다.

먼저, 어떤 값이 변경될 수 있는지 또는 무엇을 템플릿화하고 싶은지 알아내야 합니다. 저는 YAML 파일에서 굵은 글씨로 강조한 name , replicas, container name, image, imagePullPolicy  configMap Name을 선택합니다.

  1. name: name: {{ .Release.Name }}-nginx : Helm에서는 동일한 이름으로 릴리스를 설치할 수 없으므로 배포 이름을 매번 변경해야 합니다. 따라서 배포 이름을 릴리스 이름으로 템플릿화하고 -nginx를 함께 삽입합니다. 이제 frontend 라는 이름으로 릴리스를 만들면 배포 이름은 frontend-nginx 가 됩니다 . 이렇게 하면 고유한 이름이 보장됩니다.
  2. 컨테이너 이름 : {{ .Chart.Name }}컨테이너 이름으로 Chart 객체를 사용하고 chart.yaml 의 차트 이름을 컨테이너 이름으로 사용합니다.
  3. 복제본: values.yaml {{ .Values.replicaCount }} 파일 에서 복제본 값에 접근합니다 .
  4. 이미지: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" 여기서는 한 줄에 여러 개의 템플릿 지시어를 사용하고 값 파일의 이미지 키 아래에 있는 저장소와 태그 정보에 액세스합니다.
  5. configMap 이름:{{ .Release.Name }}-index-html-configmap. 여기에서는 릴리스 이름을 configmap에 추가합니다.

마찬가지로, YAML 파일에서 필요한 값을 템플릿화할 수 있습니다.

템플릿을 적용한 후의 최종 파일입니다 deployment.yaml. 템플릿 부분은 굵은 글씨로 강조 표시되어 있습니다. 배포 파일 내용을 다음으로 바꾸세요.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-nginx
  labels:
    app: nginx
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
          volumeMounts:
            - name: nginx-index-file
              mountPath: /usr/share/nginx/html/
      volumes:
        - name: nginx-index-file
          configMap:
            name: {{ .Release.Name }}-index-html-configmap
apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}-service
spec:
  selector:
    app.kubernetes.io/instance: {{ .Release.Name }}
  type: {{ .Values.service.type }}
  ports:
    - protocol: {{ .Values.service.protocol | default "TCP" }}
      port: {{ .Values.service.port }}
      targetPort: {{ .Values.service.targetPort }}

프로토콜 템플릿 지시문 에서 파이프를 볼 수 있습니다 ( | ). 이것은 프로토콜의 기본값을 TCP로 정의하는 데 사용됩니다. 즉, values.yaml 파일에 프로토콜 값을 정의하지 않거나 비어 있는 경우 프로토콜의 기본값으로 TCP를 사용합니다.

를 만들고 다음 내용을 추가합니다. 여기서 기본 Nginx index.htmlconfigmap.yaml 페이지를 사용자 지정 HTML 페이지로 바꿉니다 . 또한 HTML에서 환경 이름을 대체하기 위한 템플릿 지시문을 추가했습니다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-index-html-configmap
  namespace: default
data:
  index.html: |
    <html>
    <h1>Welcome</h1>
    </br>
    <h1>Hi! I got deployed in {{ .Values.env.name }} Environment using Helm Chart </h1>
    </html

값.yaml

파일 values.yaml에는 템플릿에서 사용한 템플릿 지시문에서 대체해야 하는 모든 값이 들어 있습니다. 예를 들어, deployment.yaml템플릿에는 values.yaml파일에서 이미지 저장소, 태그 및 pullPolicy를 가져오는 템플릿 지시문이 들어 있습니다. 다음 values.yaml파일을 확인하면 이미지 키 아래에 저장소, 태그 및 pullPolicy 키-값 쌍이 중첩되어 있습니다. 이것이 우리가 사용한 이유입니다.Values.image.repository

이제 기본 values.yaml콘텐츠를 다음으로 바꾸세요.

replicaCount: 2

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

service:
  name: nginx-service
  type: ClusterIP
  port: 80
  targetPort: 9000

env:
  name: dev

이제 Nginx 헬름 차트가 준비되었으며 최종 헬름 차트 구조는 다음과 같습니다.

nginx-chart
├── Chart.yaml
├── charts
├── templates
│   ├── configmap.yaml
│   ├── deployment.yaml
│   └── service.yaml
└── values.yaml

Helm 차트 검증

이제 차트가 유효한지, 모든 들여쓰기가 괜찮은지 확인하기 위해 아래 명령을 실행할 수 있습니다. 차트 디렉토리 안에 있는지 확인하세요.

helm lint .

디렉토리 외부에서 실행하는 경우 nginx-chart 전체 경로를 제공하세요.nginx-chart

helm lint /path/to/nginx-chart

오류나 문제가 없으면 이 결과가 표시됩니다.

==> Linting ./nginx
[INFO] Chart.yaml: icon is recommended

1 chart(s) linted, 0 chart(s) failed

템플릿에서 값이 대체되는지 확인하려면 다음 명령을 사용하여 값으로 템플릿화된 YAML 파일을 렌더링할 수 있습니다. 대체된 값이 있는 모든 매니페스트 파일을 생성하여 표시합니다.

helm template .

명령어를 사용하여 확인할 수도 있습니다 --dry-run. 이것은 차트를 클러스터에 설치하는 척하고 문제가 있으면 오류를 표시합니다.

helm install --dry-run my-release nginx-chart

모든 것이 괜찮다면 클러스터에 배포되는 매니페스트 출력이 표시됩니다.

Helm 차트 배포

차트를 배포하면 Helm은 values.yaml파일에서 차트와 구성 값을 읽고 매니페스트 파일을 생성합니다. 그런 다음 이러한 파일을 Kubernetes API 서버로 보내고 Kubernetes는 클러스터에서 요청된 리소스를 생성합니다.

이제 차트를 설치할 준비가 되었습니다.

폴더 외부의 디렉토리에서 Helm 명령을 실행하세요 helm-chart.

다음 명령을 실행합니다. 여기서 frontend릴리스 이름이고 nginx-chart차트 이름입니다. nginx-chart기본 네임스페이스에 설치됩니다.

helm install frontend nginx-chart
NAME: frontend
LAST DEPLOYED: Wed Jun 19 11:12:20 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

이제 다음 명령을 사용하여 릴리스 목록을 확인할 수 있습니다. ls대신 다음을 사용할 수도 있습니다.list

helm list

kubectl 명령을 실행하여 배포, 서비스, Pod를 확인합니다.

kubectl get deployment
kubectl get services
kubectl get configmap
kubectl get pods

아래에 표시된 대로 배포가 완료되었고 frontend-nginx, Pod가 실행 중인 것을 볼 수 있습니다.nginx-service

우리는 다양한 파일을 사용하여 단일 헬름 차트를 여러 환경에 사용할 수 있는 방법을 논의했습니다 values.yaml . 외부 파일로 헬름 차트를 설치하려면 values.yaml다음 명령을 --values플래그와 값 파일 경로와 함께 사용할 수 있습니다.

helm install frontend nginx-chart --values env/prod-values.yaml

CI/CD 파이프라인에 Helm을 사용하면 환경에 따라 필요한 값 파일을 전달하는 사용자 지정 로직을 작성할 수 있습니다.

Helm 업그레이드 및 롤백

이제 차트를 수정하고 업데이트된 버전을 설치하고 싶다면 아래 명령을 사용할 수 있습니다.

helm upgrade frontend nginx-chart

예를 들어, 복제본을 2에서 1로 변경했습니다. 개정 번호가 2이고 1개의 Pod만 실행 중인 것을 볼 수 있습니다.

이제 방금 변경한 내용을 롤백하고 이전 내용을 다시 배포하려면 rollback 명령을 사용하면 됩니다.

helm rollback frontend

위 명령은 헬름 릴리스를 이전 릴리스로 롤백합니다.

롤백 후에 2개의 포드가 다시 실행되는 것을 볼 수 있습니다. Helm이 롤백을 새로운 개정판으로 받아들이는 것을 주목하세요. 그래서 우리는 개정판을 3으로 받습니다.

특정 버전으로 롤백하고 싶다면 이렇게 개정 번호를 입력하면 됩니다.

helm rollback <release-name> <revision-number>

예를 들어,

helm rollback frontend 2

Helm 릴리스 제거

helm 릴리스를 제거하려면 uninstall 명령을 사용합니다. 차트의 마지막 릴리스와 관련된 모든 리소스를 제거합니다.

helm uninstall frontend

특정 네임스페이스에 릴리스를 배포한 경우 아래와 같이 uninstall 명령으로 네임스페이스 플래그를 전달할 수 있습니다.

helm uninstall <release-name> --namespace <namespace>

Helm 차트 패키징

차트를 패키징하여 Github, S3 또는 모든 차트 저장소에 배포할 수 있습니다.

다음 명령을 실행하여 .을 패키징합니다 nginx-chart.

helm package chart-name/

예를 들어,

helm package nginx-chart

Successfully packaged chart and saved it to: /home/vagrant/helm-tutorial/nginx-chart-0.1.0.tgz

패키징할 때는 Semver 2 버전 가이드라인을 따릅니다.

Helm 차트 디버깅

다음 명령을 사용하여 Helm 차트와 템플릿을 디버깅할 수 있습니다.

  1. helm lint:이 명령은 차트로의 경로를 가져와 일련의 테스트를 실행하여 차트가 제대로 구성되었는지 확인합니다.
  2. helm get values:이 명령은 클러스터에 설치된 릴리스 값을 출력합니다.
  3. helm install --dry-run:이 기능을 사용하면 모든 리소스 매니페스트를 확인하고 모든 템플릿이 제대로 작동하는지 확인할 수 있습니다.
  4. helm get manifest:이 명령은 클러스터에서 실행 중인 매니페스트를 출력합니다.
  5. helm diff:두 개정판의 차이점이 출력됩니다.
helm diff revision nginx-chart 1 2

헬름 차트 가능한 오류

기존 Helm 패키지를 설치하려고 하면 다음 오류가 발생합니다.

Error: INSTALLATION FAILED: cannot re-use a name that is still in use

릴리스를 업데이트하거나 업그레이드하려면 upgrade 명령을 실행해야 합니다.

차트의 절대 경로를 제공하지 않고 다른 위치에서 차트를 설치하려고 하면 다음과 같은 오류가 발생합니다.

Error: non-absolute URLs should be in form of repo_name/path_to_chart

이를 수정하려면 차트가 있는 디렉토리에서 helm 명령을 실행하거나 차트 디렉토리의 절대 경로 또는 상대 경로를 제공해야 합니다.

Helm 차트 모범 사례

헬름 차트를 개발할 때 따라야 할 모범 사례는 다음과 같습니다.

  1. 유지 관리 가능한 Helm 차트를 보장하려면 문서화가 필수이므로 주석과 README 파일을 추가하여 차트를 문서화하세요.
  2. Kubernetes 매니페스트 파일의 이름은 배포, 서비스, 비밀, 수신 등과 같은 객체 종류에 따라 지정해야 합니다.
  3. 차트 이름은 소문자로만 입력하시고, 두 단어 이상인 경우 하이픈(-)으로 구분하세요.
  4. values.yaml 파일의 필드 이름은 소문자여야 합니다.
  5. 문자열 값은 항상 따옴표로 묶어야 합니다.
  6. 더 간단하고 안전한 릴리스를 위해 Helm 버전 3을 사용하세요. 자세한 내용은 이 문서를 확인하세요.

Helm 명령 요약(속성표)

일상적인 작업 흐름에서 사용할 수 있는 일반적인 Helm 명령의 빠른 참조 목록은 다음과 같습니다.

helm install

Kubernetes 클러스터에 Helm 차트를 설치합니다.

helm install <release-name> <chart-path-or-name>

helm upgrade

기존 Helm 릴리스를 새로운 차트 변경 사항이나 업데이트된 값으로 업데이트합니다.

helm upgrade <release-name> <chart-path-or-name>

helm rollback

Helm 릴리스를 이전 버전으로 롤백합니다.

helm rollback <release-name> <revision-number>

헬름 테스트

Helm 차트 templates/tests디렉토리에 정의된 테스트를 릴리스에 대해 실행합니다.

helm test <release-name>

헬름 린트

차트에서 서식이나 누락된 필드 등 발생할 수 있는 문제를 확인합니다.

helm lint <chart-directory>

helm template

Kubernetes 매니페스트를 설치하지 않고도 보여주는 차트를 렌더링합니다. 템플릿 디버깅에 유용합니다.

helm template <chart-directory>

헬름 리스트(helm ls)

지정된 네임스페이스에 현재 설치된 모든 릴리스를 나열합니다(기본값은 현재 네임스페이스입니다).

helm list

헬름 설치 해제

Helm 릴리스를 제거하고 클러스터에서 관련된 모든 Kubernetes 리소스를 제거합니다.

helm uninstall <release-name>

결론

요약하자면,

  1. 우리는 헬름 차트와 그 구조에 대해 자세히 논의했습니다.
  2. 우리는 처음부터 헬름 차트를 만들어 배포했습니다.
  3. 또한 업그레이드, 롤백, 제거 방법도 배웠습니다.

Helm은 Kubernetes에 매우 유용한 패키지 관리자입니다. 사용자 지정 배포 요구 사항이 있는 다양한 환경이 있는 경우 helm은 필요에 따라 Kubernetes 매니페스트를 템플릿화하는 좋은 방법을 제공합니다.

차트 종속성 및 차트 재사용성과 같은 Helm 특유의 기능 덕분에 Helm은 훌륭한 Kubernetes 도구 중 하나입니다.

또한, CKAD 인증을 준비하고 있다면 Helm은 시험에서 중요한 주제입니다.

Helm의 대안은 Kustomize입니다. 템플릿을 사용하지 않지만 오버레이 개념을 사용합니다. 자세한 내용은 Kustomize 튜토리얼을 참조하세요.

또한, 쿠버네티스 학습 가이드를 확인해보면 쿠버네티스 패키지 관리를 위한 필수 도구로 헬름이 언급되어 있습니다.

'Kubernetes > Tool 활용' 카테고리의 다른 글

Kustomize (외부자료)  (0) 2025.02.28
(1) KIND란?  (0) 2025.01.24
(2) KIND 활용 예제 MSA 샘플  (0) 2025.01.24

+ Recent posts