본문 바로가기
C.W.K.
Stream
Lesson 05 of 08 · published

Helm — Kubernetes 용 templated YAML

~12 min · yaml, helm, kubernetes, templating

Level 0평문
0 XP0/64 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

위에 Go template 깐 YAML

Helm 은 Kubernetes 의 패키지 매니저야. chart 는 YAML template 을 담은 디렉토리고. helm install 이 그 template 에 values.yaml 을 끼워 넣어 렌더한 다음 결과를 클러스터에 적용해. 바닥에 깔린 건 결국 똑같은 K8s manifest 야. 중간에 낀 templating 층 덕분에 chart 하나로 dev, staging, prod 에 서로 다른 값을 넣어 배포할 수 있는 거지.

Chart 레이아웃

  • Chart.yaml — chart 자체의 메타데이터야.
  • values.yaml — 기본값을 모아둔 곳이자 이 chart 의 API 야.
  • templates/{{ .Values.x }} 가 들어간 YAML template 들이 사는 자리고.
  • charts/ — 딸려 오는 sub-chart 들이야.

String quoting 함정

Helm template 이 뱉는 건 그냥 텍스트고, 그걸 YAML 이 다시 읽어서 타입을 매겨. 그래서 template 이 따옴표 없는 값을 찍으면 YAML 이 그 자리에서 타입을 새로 정해버려. port 가 8000 일 때 {{ .Values.port }} 는, K8s 가 문자열을 기대하는 자리에서도 정수 8000 이 돼. 렌더된 출력을 대놓고 따옴표로 감싸. {{ .Values.port | quote }} 를 쓰거나 아예 따옴표로 둘러싸면 돼.

'렌더된 YAML 이 가끔 무효 YAML' 문제: Helm template 은 깨진 YAML 을 만들어낼 수 있어. 줄바꿈이 빠지거나, 파이프가 겹치거나, 블록 들여쓰기가 어긋나는 식으로. CI 에서 helm template ./chart 를 돌린 다음 그 결과를 kubeconform 이나 yq . 로 흘려보내. 배포할 때가 아니라 렌더할 때 잡는 거야.

Code

Chart 레이아웃·text
pippa-chart/
├── Chart.yaml
├── values.yaml
└── templates/
    ├── deployment.yaml
    ├── service.yaml
    ├── configmap.yaml
    └── _helpers.tpl
values.yaml + template·yaml
# values.yaml
image:
  repository: ghcr.io/cwk/pippa
  tag: '1.0'
replicas: 3
port: 8000
logLevel: info

# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}
spec:
  replicas: {{ .Values.replicas }}
  template:
    spec:
      containers:
        - name: api
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          ports:
            - containerPort: {{ .Values.port }}
          env:
            - name: LOG_LEVEL
              value: {{ .Values.logLevel | quote }}
설치 전 렌더 + 검증·bash
# stdout 으로 렌더 (클러스터 접촉 없음)
helm template my-release ./pippa-chart

# values override 로 렌더
helm template my-release ./pippa-chart -f prod-values.yaml

# 렌더 후 K8s schema 로 검증
helm template my-release ./pippa-chart | kubeconform -summary -strict

# Chart lint
helm lint ./pippa-chart
환경별 값 override·yaml
# prod-values.yaml
replicas: 10
logLevel: warn
image:
  tag: '1.0.42'

External links

Exercise

값이 하드코딩된 Kubernetes manifest 를 골라. replica 수나 image tag, env 같은 것들 말이야. 그걸 values.yaml 하나에 template 하나짜리 Helm chart 로 옮겨. values 파일을 dev 용과 prod 용 둘로 만들어서 helm template 을 각각 렌더하고 결과를 diff 해봐. 둘 다 kubeconform 으로 검증도 하고. 'chart 는 하나, 배포는 둘' 이라는 게 이 전부의 요점이야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.