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 updateHelm은 필요한 의존 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: 3Helm은 최종적으로 다음과 같은 Kubernetes 매니페스트를 생성합니다.
spec:
replicas: 31.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.yamlCRD는 일반적인 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.1appVersion은 반드시 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.pngkeywords는 검색용 키워드, 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:
- cache1.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.291.5.3 --set-string#
값을 문자열로 명확하게 처리해야 한다면 --set-string을 사용할 수 있습니다.
helm install my-app ./my-chart \
--set-string image.tag=1.291.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-chart1.11.2 helm template#
Kubernetes 클러스터에 설치하지 않고 최종 렌더링 결과를 확인할 수 있습니다.
helm template my-app ./my-chartValues 파일을 적용할 수도 있습니다.
helm template my-app ./my-chart \
-f production.yamlHelm을 학습하거나 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-run1.12 Helm Chart 보안#
Helm Chart는 Kubernetes 애플리케이션의 배포 설정을 관리하기 때문에 민감정보 관리에도 주의해야 합니다.
1.12.1 민감정보 관리#
다음과 같이 비밀번호를 values.yaml에 직접 저장하는 것은 피하는 것이 좋습니다.
database:
username: admin
password: my-secret-passwordChart가 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 등의 기능으로 확장할 수 있습니다.