Helm Chart 기본 구조

Helm Chart는 Kubernetes 애플리케이션을 패키징하고 배포하기 위한 파일과 디렉터리의 집합입니다.

Kubernetes 매니페스트를 직접 환경별로 관리하는 대신, Helm은 템플릿(Templates)과 설정값(Values)을 조합하여 Kubernetes 리소스를 동적으로 생성할 수 있도록 합니다.

일반적인 Helm Chart는 다음과 같은 구조를 가집니다.

mychart/
├── Chart.yaml
├── Chart.lock
├── values.yaml
├── values.schema.json
├── charts/
├── crds/
├── templates/
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── service.yaml
│   └── NOTES.txt
├── .helmignore
├── LICENSE
└── README.md

모든 파일이 반드시 필요한 것은 아닙니다. Chart.yaml은 필수이며, 나머지는 Chart의 목적과 구성에 따라 선택적으로 사용합니다.


1.1 Helm Chart 디렉터리 구조 이해#

Helm Chart의 각 파일과 디렉터리는 서로 다른 역할을 담당합니다. Chart를 제대로 이해하려면 각각의 역할과 상호 관계를 먼저 이해해야 합니다.

1.1.1 Chart.yaml: Chart 메타데이터#

Chart.yaml은 Helm Chart 자체에 대한 메타데이터를 정의하는 파일입니다.

Chart의 이름, 버전, 설명, 애플리케이션 버전, 의존성 등의 정보를 관리합니다.

apiVersion: v2
name: my-web-app
description: A Helm chart for deploying a web application
type: application
version: 0.1.0
appVersion: "1.0.0"

주요 필드는 다음과 같습니다.

필드 설명 필수
apiVersion Chart API 버전 O
name Chart 이름 O
version Chart 버전 O
description Chart 설명 X
type Chart 유형 X
appVersion 애플리케이션 버전 X
keywords 검색용 키워드 X
maintainers 유지보수자 정보 X
icon Chart 아이콘 URL X
dependencies Chart 의존성 X

Helm 3에서 일반적인 Chart는 apiVersion: v2를 사용합니다.

1.1.2 values.yaml: 기본 설정값#

values.yaml은 Chart에서 사용할 기본 설정값을 정의하는 파일입니다.

replicaCount: 2

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

service:
  type: ClusterIP
  port: 80
  targetPort: 80

resources:
  requests:
    cpu: 100m
    memory: 128Mi
  limits:
    cpu: 500m
    memory: 512Mi

템플릿에서는 다음과 같이 값을 참조할 수 있습니다.

{{ .Values.replicaCount }}
{{ .Values.image.repository }}
{{ .Values.image.tag }}

values.yaml의 가장 중요한 역할은 하나의 Chart를 여러 환경에서 재사용할 수 있도록 설정과 템플릿을 분리하는 것입니다.

1.1.3 charts/: 의존 Chart#

charts/ 디렉터리는 현재 Chart가 사용하는 하위 Chart(Subchart)를 저장합니다.

예:

charts/
├── redis/
│   ├── Chart.yaml
│   ├── values.yaml
│   └── templates/
└── mysql-1.0.0.tgz

일반적으로 의존성은 Chart.yaml의 dependencies에 선언한 후 다음 명령으로 관리합니다.

helm dependency update

Helm은 필요한 의존 Chart를 charts/ 디렉터리에 가져옵니다.

1.1.4 templates/: Kubernetes 매니페스트 템플릿#

templates/는 Helm Chart의 핵심 디렉터리입니다.

이 디렉터리에 Kubernetes 리소스를 생성하기 위한 템플릿을 작성합니다.

templates/
├── _helpers.tpl
├── deployment.yaml
├── service.yaml
├── configmap.yaml
├── secret.yaml
├── ingress.yaml
└── NOTES.txt

예를 들어 다음과 같은 템플릿을 작성할 수 있습니다.

spec:
  replicas: {{ .Values.replicaCount }}

values.yaml에서 다음과 같이 설정하면:

replicaCount: 3

Helm은 최종적으로 다음과 같은 Kubernetes 매니페스트를 생성합니다.

spec:
  replicas: 3

1.1.5 values.schema.json: Values 구조 검증#

values.schema.json은 Chart에 전달되는 Values의 구조와 데이터 타입을 검증하는 JSON Schema 파일입니다.

예:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "replicaCount": {
      "type": "integer",
      "minimum": 1
    }
  }
}

이를 활용하면 사용자가 잘못된 데이터 타입이나 허용되지 않는 값을 입력했을 때 배포 전에 문제를 발견할 수 있습니다.

특히 여러 사람이 사용하거나 외부에 배포하는 Chart에서는 유용합니다.

1.1.6 crds/: CustomResourceDefinition#

crds/ 디렉터리는 Kubernetes의 CustomResourceDefinition(CRD)을 저장할 때 사용합니다.

예:

crds/
└── applications.example.com.yaml

CRD는 일반적인 Kubernetes 리소스 템플릿과 처리 방식이 다르므로 Helm의 CRD 관리 방식을 별도로 이해해야 합니다.

1.1.7 _helpers.tpl: 재사용 가능한 템플릿#

_helpers.tpl은 여러 템플릿에서 반복적으로 사용하는 이름, 라벨 등의 템플릿을 정의하는 데 사용합니다.

예:

{{- define "mychart.fullname" -}}
{{ .Release.Name }}-{{ .Chart.Name }}
{{- end }}

다른 템플릿에서는 다음과 같이 사용할 수 있습니다.

metadata:
  name: {{ include "mychart.fullname" . }}

이렇게 하면 Deployment, Service 등의 리소스에서 동일한 이름 생성 규칙을 재사용할 수 있습니다.

1.1.8 templates/NOTES.txt: 설치 후 안내#

templates/NOTES.txt는 Chart 설치 또는 업그레이드 후 사용자에게 표시할 안내 내용을 작성하는 파일입니다.

예:

애플리케이션이 배포되었습니다.

Pod 상태 확인:

kubectl get pods

Service 확인:

kubectl get svc

설치 후 접속 방법이나 상태 확인 명령 등을 안내하는 데 사용할 수 있습니다.

1.1.9 .helmignore#

.helmignore는 Helm Chart를 패키징할 때 포함하지 않을 파일을 지정합니다.

Git의 .gitignore와 비슷한 개념이지만, 목적은 Helm Chart 패키지에서 특정 파일을 제외하는 것입니다.


1.2 Chart.yaml 작성법#

Chart.yaml은 Chart 자체의 메타데이터와 의존성을 정의하는 핵심 파일입니다.

1.2.1 주요 필드#

기본적인 Chart.yaml은 다음과 같이 작성할 수 있습니다.

apiVersion: v2
name: my-web-app
description: A Helm chart for deploying a web application
type: application
version: 0.1.0
appVersion: "1.0.0"

apiVersion은 Helm 3에서 일반적으로 v2를 사용합니다.

name은 Chart의 이름이며, version은 Chart 자체의 버전을 나타냅니다.

1.2.2 version과 appVersion의 차이#

두 필드는 이름이 비슷하지만 서로 다른 대상을 의미합니다.

version: 1.2.0
appVersion: "3.5.1"
  • version: Helm Chart의 버전
  • appVersion: Chart가 배포하는 애플리케이션의 버전

예를 들어 애플리케이션은 변경하지 않고 Helm 템플릿만 수정했다면 Chart의 version은 변경하지만 appVersion은 그대로 유지할 수 있습니다.

version은 일반적으로 Semantic Versioning을 사용합니다.

MAJOR.MINOR.PATCH

1.0.0
1.1.0
1.1.1

appVersion은 반드시 SemVer 형식일 필요는 없으며 문자열로 작성하는 것이 좋습니다.

1.2.3 type#

Chart의 유형을 지정할 수 있습니다.

일반적인 애플리케이션 Chart는 다음과 같습니다.

type: application

재사용 가능한 템플릿 라이브러리를 제공하는 Chart는 다음과 같이 작성할 수 있습니다.

type: library

일반적인 Kubernetes 애플리케이션 배포에서는 application을 사용하는 경우가 대부분입니다.

1.2.4 keywords, maintainers, icon#

검색과 문서화를 위해 다음과 같은 선택적 필드를 사용할 수 있습니다.

keywords:
  - kubernetes
  - web
  - nginx

maintainers:
  - name: ThinkX
    email: thinkx@example.com

icon: https://example.com/icon.png

keywords는 검색용 키워드, maintainers는 유지보수자 정보, icon은 Chart의 아이콘을 지정합니다.


1.3 Chart 의존성 관리#

하나의 애플리케이션이 여러 구성 요소로 이루어진 경우 다른 Chart를 의존성으로 사용할 수 있습니다.

예를 들어 웹 애플리케이션이 PostgreSQL을 필요로 한다면 PostgreSQL Chart를 의존성으로 선언할 수 있습니다.

1.3.1 dependencies 필드#

Chart.yaml에 다음과 같이 선언합니다.

dependencies:
  - name: postgresql
    version: "16.x.x"
    repository: "https://example.com/charts"

Helm 3에서는 과거 Helm 2에서 사용하던 별도의 requirements.yaml 대신 Chart.yaml의 dependencies 필드를 사용합니다.

1.3.2 의존성 주요 필드#

주요 필드는 다음과 같습니다.

필드 설명
name 의존 Chart 이름
version 의존 Chart 버전 또는 버전 범위
repository Chart Repository 주소
condition 특정 조건에 따른 활성화 여부
tags 의존성 그룹화
alias 의존 Chart의 별칭
import-values 하위 Chart의 값을 부모 Chart로 가져오기

예:

dependencies:
  - name: redis
    version: "20.x.x"
    repository: "https://example.com/charts"
    condition: redis.enabled
    tags:
      - cache

1.3.3 의존성 업데이트#

의존성을 다운로드하고 업데이트하려면 다음 명령을 사용합니다.

helm dependency update

현재 Chart의 의존성 목록을 확인하려면:

helm dependency list

의존 Chart는 일반적으로 charts/ 디렉터리에 저장됩니다.

1.3.4 Chart.lock#

의존성을 업데이트하면 Chart.lock 파일이 생성될 수 있습니다.

Chart.lock은 의존 Chart의 구체적인 버전과 무결성 정보를 기록하여 동일한 의존성 상태를 재현하는 데 도움을 줍니다.

따라서 애플리케이션 배포 환경에서 의존성을 일관되게 유지해야 한다면 Chart.lock의 역할을 이해하는 것이 중요합니다.


1.4 values.yaml 작성법#

values.yaml은 Helm Chart의 기본 설정값을 정의합니다.

1.4.1 설정값 정의와 구조#

Values는 YAML 형식으로 작성합니다.

replicaCount: 2

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

service:
  type: ClusterIP
  port: 80
  targetPort: 80

문자열, 숫자, Boolean, 배열, 객체 등의 값을 사용할 수 있습니다.

1.4.2 계층적 Values#

Values는 계층적으로 구성할 수 있습니다.

image:
  repository: nginx
  tag: "1.29"

템플릿에서는 다음과 같이 접근합니다.

{{ .Values.image.repository }}
{{ .Values.image.tag }}

복잡한 Chart일수록 관련 설정을 그룹화하여 관리하는 것이 좋습니다.

1.4.3 데이터 타입#

YAML에서는 값의 타입에 주의해야 합니다.

replicaCount: 3
enabled: true
port: 8080
name: "my-app"

특히 버전이나 식별자처럼 문자열로 취급해야 하는 값은 따옴표를 사용하는 것이 안전합니다.

tag: "1.29"
appVersion: "1.2.3"

또한 values.yaml에 데이터베이스 비밀번호나 API Key 등의 민감한 정보를 평문으로 저장하는 것은 피하는 것이 좋습니다.


1.5 사용자 정의 Values 전달#

values.yaml은 기본값을 제공하지만 실제 배포 환경에서는 개발, 테스트, 운영 환경 등에 따라 값을 변경해야 합니다.

1.5.1 Values 파일 사용#

예를 들어 production.yaml을 작성할 수 있습니다.

replicaCount: 5

image:
  tag: "1.29"

service:
  type: LoadBalancer

다음과 같이 적용합니다.

helm install my-app ./my-chart -f production.yaml

여러 Values 파일을 사용할 수도 있습니다.

helm install my-app ./my-chart \
  -f values.yaml \
  -f production.yaml

동일한 값이 여러 파일에 존재하면 일반적으로 나중에 지정한 파일의 값이 우선합니다.

1.5.2 --set#

간단한 설정은 명령줄에서 --set으로 지정할 수 있습니다.

helm install my-app ./my-chart \
  --set replicaCount=5 \
  --set image.tag=1.29

계층적인 값도 지정할 수 있습니다.

helm install my-app ./my-chart \
  --set image.repository=nginx \
  --set image.tag=1.29

1.5.3 --set-string#

값을 문자열로 명확하게 처리해야 한다면 --set-string을 사용할 수 있습니다.

helm install my-app ./my-chart \
  --set-string image.tag=1.29

1.5.4 --set-file#

파일의 내용을 하나의 값으로 전달할 때 사용합니다.

helm install my-app ./my-chart \
  --set-file config=my-config.txt

템플릿에서는 다음과 같이 사용할 수 있습니다.

{{ .Values.config }}

1.5.5 --set-json#

JSON 형식의 값을 전달할 수 있습니다.

helm install my-app ./my-chart \
  --set-json 'podLabels={"environment":"production","team":"backend"}'

복잡한 배열이나 객체를 명령줄에서 지정해야 할 때 유용합니다.

1.5.6 Values 우선순위#

사용자 지정 값은 기본 values.yaml보다 높은 우선순위를 가집니다.

개념적으로 다음과 같이 이해할 수 있습니다.

values.yaml
    ↓
-f / --values
    ↓
더 나중에 지정한 Values 파일
    ↓
--set / --set-string / --set-file / --set-json

예:

helm install my-app ./my-chart \
  -f values.yaml \
  -f production.yaml \
  --set replicaCount=10

이 경우 replicaCount는 10이 됩니다.

Chart.yaml은 기본 설정값을 정의하는 파일이 아닙니다. Chart의 메타데이터와 의존성을 정의하는 파일입니다. 따라서 Values의 우선순위를 설명할 때 Chart.yaml을 기본값 계층에 포함해서는 안 됩니다.


1.6 Kubernetes 매니페스트 템플릿#

templates/ 디렉터리에서는 Go 템플릿 문법을 사용하여 Kubernetes 매니페스트를 동적으로 생성합니다.

1.6.1 Go 템플릿 기본 문법#

가장 기본적인 표현은 다음과 같습니다.

{{ .Values.replicaCount }}

Helm은 {{ }} 내부의 표현식을 평가하여 최종 YAML을 생성합니다.

1.6.2 변수와 Values 참조#

예:

image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"

다음과 같은 Values가 있다면:

image:
  repository: nginx
  tag: "1.29"

최종 결과는 다음과 같습니다.

image: "nginx:1.29"

1.6.3 조건문#

if, else, end를 사용하여 조건에 따라 출력할 내용을 제어할 수 있습니다.

{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
...
{{- end }}

enabled가 true일 때만 해당 Kubernetes 리소스가 생성됩니다.

1.6.4 반복문#

range를 사용하면 배열이나 Map을 반복할 수 있습니다.

배열:

{{- range .Values.env }}
- name: {{ .name }}
  value: {{ .value | quote }}
{{- end }}

Map:

{{- range $key, $value := .Values.labels }}
{{ $key }}: {{ $value | quote }}
{{- end }}

1.6.5 파이프라인#

Helm에서는 함수의 결과를 다른 함수에 전달할 수 있습니다.

{{ .Values.name | quote }}

예를 들어 다음과 같이 문자열을 따옴표로 감쌀 수 있습니다.

name: {{ .Values.appName | quote }}

1.6.6 공백 제어#

Helm 템플릿에서는 {{-와 -}}를 사용하여 템플릿 주변의 공백과 줄바꿈을 제어할 수 있습니다.

{{- if .Values.enabled }}

왼쪽 공백을 제거합니다.

{{ if .Values.enabled -}}

오른쪽 공백을 제거합니다.

양쪽을 제거하려면:

{{- if .Values.enabled -}}

를 사용할 수 있습니다.

YAML은 들여쓰기가 중요하기 때문에 공백 제어를 잘못 사용하면 의도하지 않은 매니페스트가 생성될 수 있습니다.


1.7 Helm Built-in Objects#

Helm은 템플릿에서 사용할 수 있는 여러 Built-in Object를 제공합니다.

1.7.1 .Values#

values.yaml 및 사용자가 전달한 설정값에 접근합니다.

{{ .Values.replicaCount }}
{{ .Values.image.repository }}

1.7.2 .Chart#

Chart.yaml의 정보를 참조합니다.

{{ .Chart.Name }}
{{ .Chart.Version }}
{{ .Chart.AppVersion }}

1.7.3 .Release#

현재 Helm Release에 대한 정보를 제공합니다.

대표적으로 다음 값을 사용할 수 있습니다.

{{ .Release.Name }}
{{ .Release.Namespace }}
{{ .Release.Revision }}
{{ .Release.IsInstall }}
{{ .Release.IsUpgrade }}

예:

metadata:
  name: {{ .Release.Name }}

1.7.4 .Capabilities#

현재 Kubernetes 클러스터와 Helm 환경에서 사용할 수 있는 기능 정보를 제공합니다.

예:

{{ .Capabilities.KubeVersion.Version }}

또는:

{{ .Capabilities.HelmVersion.Version }}

특정 Kubernetes API가 지원되는지 확인하는 데도 활용할 수 있습니다.

1.7.5 .Files#

Chart에 포함된 일반 파일의 내용을 읽을 수 있습니다.

{{ .Files.Get "config/app.conf" }}

다만 templates/ 디렉터리 내부의 템플릿 파일은 .Files를 통해 읽을 수 없습니다.

1.7.6 .Template#

현재 실행 중인 템플릿에 대한 정보를 제공합니다.

예:

{{ .Template.Name }}

템플릿 파일 이름 등을 확인하거나 디버깅하는 데 활용할 수 있습니다.


1.8 Helm 템플릿 함수#

Helm은 템플릿 작성에 사용할 수 있는 다양한 함수를 제공합니다.

1.8.1 quote#

문자열을 따옴표로 감쌉니다.

{{ .Values.image.tag | quote }}

1.8.2 default#

값이 비어 있을 경우 기본값을 사용할 수 있습니다.

{{ .Values.service.type | default "ClusterIP" }}

1.8.3 required#

필수 값을 검증할 수 있습니다.

{{ required "image.repository is required" .Values.image.repository }}

값이 제공되지 않으면 Helm의 템플릿 렌더링 과정에서 오류가 발생합니다.

1.8.4 toYaml과 nindent#

복잡한 YAML 구조를 템플릿에 삽입할 때 자주 사용하는 조합입니다.

resources:
  {{- toYaml .Values.resources | nindent 2 }}

예를 들어 Deployment 내부에서는 다음과 같이 사용할 수 있습니다.

resources:
  {{- toYaml .Values.resources | nindent 12 }}

nindent는 지정한 공백을 추가하면서 앞에 줄바꿈도 추가한다는 점에서 indent와 차이가 있습니다.

1.8.5 include와 define#

define으로 재사용 가능한 Named Template을 정의할 수 있습니다.

_helpers.tpl:

{{- define "mychart.fullname" -}}
{{ .Release.Name }}-{{ .Chart.Name }}
{{- end }}

다른 템플릿에서는 include를 사용합니다.

metadata:
  name: {{ include "mychart.fullname" . }}

1.8.6 tpl#

문자열에 포함된 Helm 템플릿 표현식을 다시 평가해야 할 때 사용합니다.

예를 들어:

message: "Hello {{ .Release.Name }}"

이라는 값이 있다면 다음과 같이 처리할 수 있습니다.

{{ tpl .Values.message . }}

1.8.7 lookup#

lookup은 Kubernetes API를 통해 기존 리소스를 조회할 수 있는 함수입니다.

예:

{{ lookup "v1" "ConfigMap" .Release.Namespace "my-config" }}

일반적인 정적 템플릿 함수와 달리 실제 Kubernetes 클러스터의 리소스 조회와 관련되므로 권한과 실행 환경을 고려해야 합니다.


1.9 Deployment 템플릿 작성#

Deployment는 Kubernetes에서 애플리케이션 Pod의 배포와 업데이트를 관리하는 대표적인 리소스입니다.

1.9.1 Deployment 기본 구조#

templates/deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "mychart.fullname" . }}
  labels:
    app.kubernetes.io/name: {{ include "mychart.name" . }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ include "mychart.name" . }}
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ include "mychart.name" . }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: {{ .Values.service.targetPort }}
              protocol: TCP
          resources:
            {{- toYaml .Values.resources | nindent 12 }}

1.9.2 values.yaml 연동#

위 Deployment는 다음과 같은 Values를 사용합니다.

replicaCount: 3

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

service:
  targetPort: 80

따라서 Helm은 설정값에 따라 Deployment의 replicas, 이미지, 포트 등을 동적으로 생성합니다.

1.9.3 Resources 설정#

Kubernetes의 리소스 요청과 제한도 Values로 관리할 수 있습니다.

resources:
  requests:
    cpu: 100m
    memory: 128Mi
  limits:
    cpu: 500m
    memory: 512Mi

템플릿:

resources:
  {{- toYaml .Values.resources | nindent 12 }}

이 방식은 개발, 테스트, 운영 환경에서 서로 다른 리소스 설정을 적용할 때 유용합니다.


1.10 Service 템플릿 작성#

Service는 Pod에 네트워크 접근 경로를 제공하는 Kubernetes 리소스입니다.

1.10.1 Service 기본 구조#

templates/service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: {{ include "mychart.fullname" . }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - name: http
      port: {{ .Values.service.port }}
      targetPort: {{ .Values.service.targetPort }}
      protocol: TCP
  selector:
    app.kubernetes.io/name: {{ include "mychart.name" . }}

1.10.2 Service Values 연동#

values.yaml:

service:
  type: ClusterIP
  port: 80
  targetPort: 8080

이 설정을 적용하면 Service는 다음과 같은 구조로 생성됩니다.

spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: 8080

여기서 port는 Service가 노출하는 포트이고 targetPort는 실제 Pod의 대상 포트입니다.


1.11 Helm Chart 검증과 디버깅#

Helm Chart를 실제 Kubernetes 클러스터에 설치하기 전에 템플릿과 설정을 검증하는 것이 좋습니다.

1.11.1 helm lint#

Chart의 구조와 기본적인 문제를 검사합니다.

helm lint ./my-chart

1.11.2 helm template#

Kubernetes 클러스터에 설치하지 않고 최종 렌더링 결과를 확인할 수 있습니다.

helm template my-app ./my-chart

Values 파일을 적용할 수도 있습니다.

helm template my-app ./my-chart \
  -f production.yaml

Helm을 학습하거나 Chart를 개발할 때 매우 유용한 명령입니다.

1.11.3 --debug#

더 자세한 디버깅 정보를 확인하려면 다음과 같이 사용할 수 있습니다.

helm template my-app ./my-chart \
  --debug

실제 배포 전에 다음과 같은 순서로 확인하는 것도 좋습니다.

helm lint ./my-chart

helm template my-app ./my-chart

helm install my-app ./my-chart --dry-run

1.12 Helm Chart 보안#

Helm Chart는 Kubernetes 애플리케이션의 배포 설정을 관리하기 때문에 민감정보 관리에도 주의해야 합니다.

1.12.1 민감정보 관리#

다음과 같이 비밀번호를 values.yaml에 직접 저장하는 것은 피하는 것이 좋습니다.

database:
  username: admin
  password: my-secret-password

Chart가 Git 저장소나 패키지 저장소에 저장될 경우 민감정보가 그대로 노출될 수 있기 때문입니다.

1.12.2 Kubernetes Secret#

민감한 설정은 Kubernetes Secret을 사용하는 방법을 고려할 수 있습니다.

예:

apiVersion: v1
kind: Secret
metadata:
  name: database-secret
type: Opaque

다만 Kubernetes Secret 역시 무조건 안전한 저장소를 의미하는 것은 아닙니다. 클러스터의 RBAC, 저장소 암호화, 접근 권한 등을 함께 고려해야 합니다.

1.12.3 외부 Secret 관리#

운영 환경에서는 외부 Secret 관리 시스템과 연계하는 방법도 고려할 수 있습니다.

예를 들어 조직의 보안 정책에 따라 외부 Secret Manager, External Secrets 등의 방식을 사용할 수 있습니다.

중요한 것은 민감정보를 Chart 소스 코드에 평문으로 포함하지 않는 것입니다.


1.13 핵심 정리#

Helm Chart의 기본 구조는 다음과 같이 이해할 수 있습니다.

Chart.yaml
    │
    ├── Chart 메타데이터
    └── dependencies
            │
            ▼
        charts/
            │
            ▼
values.yaml ─────────┐
                     │
values.schema.json   │
                     ▼
                 templates/
                     │
                     ▼
            Helm Template Engine
                     │
                     ▼
          Kubernetes Manifest YAML
                     │
                     ▼
                Kubernetes

각 구성 요소의 역할을 정리하면 다음과 같습니다.

구성 요소 역할
Chart.yaml Chart의 메타데이터와 의존성 정의
values.yaml 기본 설정값 정의
values.schema.json Values 구조와 타입 검증
charts/ 의존 Chart 저장
templates/ Kubernetes 매니페스트 템플릿
_helpers.tpl 재사용 가능한 Named Template
crds/ CustomResourceDefinition 저장
NOTES.txt 설치 후 안내
.helmignore Chart 패키지에서 제외할 파일 지정
Chart.lock 의존성 버전 및 무결성 정보 기록
README.md Chart 사용법 및 설명

Helm Chart의 핵심 관계는 다음 세 가지로 정리할 수 있습니다.

Chart.yaml
   ↓
Chart가 무엇인지 정의

values.yaml
   ↓
어떻게 배포할지 정의

templates/
   ↓
설정값을 Kubernetes 매니페스트로 변환

즉, Helm은 Chart 메타데이터와 설정값을 기반으로 템플릿을 렌더링하여 Kubernetes 리소스를 생성하는 패키징 및 배포 도구라고 이해하면 됩니다.

이 기본 구조를 이해하면 이후에는 Helm의 의존성 관리, Named Template, 조건문과 반복문, 고급 Values 관리, Chart 테스트, Helm Hook, Library Chart 등의 기능으로 확장할 수 있습니다.

이 페이지의 목차