Chart
패키지. 템플릿 + 기본값의 묶음.
클러스터 컴포넌트를 설치하는 두 방법
커리큘럼 항목은 “Use Helm and Kustomize to install cluster components” 다.
flowchart LR
subgraph H["Helm — 템플릿 + 값 주입"]
CH["Chart<br/>Go 템플릿"] --> VAL["Values 주입"] --> REL["Release<br/>상태를 추적한다"]
end
subgraph K["Kustomize — 베이스 + 오버레이"]
BASE["base/<br/>평범한 YAML"] --> OVR["overlays/prod<br/>패치를 얹는다"] --> OUT["최종 YAML<br/>상태 추적 없음"]
end
REL -.->|"별도 바이너리"| BIN["helm"]
OUT -.->|"kubectl 에 내장"| KUB["kubectl -k"]
classDef helm fill:#dbeafe,stroke:#2563eb,color:#1e3a8a
classDef kust fill:#dcfce7,stroke:#16a34a,color:#14532d
classDef mute fill:#f1f5f9,stroke:#94a3b8,color:#334155
class CH,VAL,REL helm
class BASE,OVR,OUT kust
class BIN,KUB mute
| Helm | Kustomize | |
|---|---|---|
| 방식 | 템플릿 + 값 주입 | 베이스 YAML + 오버레이 패치 |
| 배포 형태 | 패키지(차트) 저장소 | 그냥 디렉터리 |
| 상태 관리 | 릴리스를 추적한다 | 없음 (kubectl apply와 동일) |
| 설치 | 별도 바이너리 | kubectl에 내장 (-k) |
Chart
패키지. 템플릿 + 기본값의 묶음.
Values
차트에 주입하는 설정값.
Release
클러스터에 설치된 차트의 인스턴스. 이름이 있고, 같은 차트를 여러 번 설치할 수 있다.
Repository
차트를 배포하는 곳.
같은 차트를 다른 이름의 릴리스로 여러 번 설치할 수 있다. 릴리스 정보는 네임스페이스의 Secret에 저장된다 (Helm 3부터. Tiller는 없어졌다).
저장소 등록
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginxhelm repo updatehelm repo listhelm search repo ingresshelm search hub prometheus차트 살펴보기 — ★ 무엇을 바꿀 수 있는지 여기서 찾는다
helm show values ingress-nginx/ingress-nginx # 설정 가능한 값 전부helm show chart ingress-nginx/ingress-nginxhelm pull ingress-nginx/ingress-nginx --untar # 로컬로 받아서 뜯어보기설치
helm install my-ingress ingress-nginx/ingress-nginx \ --namespace ingress-nginx --create-namespace확인
helm list -Ahelm status my-ingress -n ingress-nginxhelm get values my-ingress -n ingress-nginxhelm get manifest my-ingress -n ingress-nginx # 실제로 적용된 YAMLhelm install my-ingress ingress-nginx/ingress-nginx \ --set controller.replicaCount=3 \ --set controller.service.type=NodePort \ --set-string controller.config.use-forwarded-headers="true"값 한두 개만 바꿀 때. 시험에서 가장 자주 쓰는 형태.
helm install my-ingress ingress-nginx/ingress-nginx -f my-values.yaml
# 여러 파일 — 뒤가 앞을 덮는다helm install my-ingress ingress-nginx/ingress-nginx -f base.yaml -f prod.yaml값이 많을 때. 파일로 남으니 재현 가능하다.
# 적용 전에 결과 확인 — 시험·실무 모두 유용하다helm template my-ingress ingress-nginx/ingress-nginx -f my-values.yamlhelm install my-ingress ingress-nginx/ingress-nginx --dry-run --debugflowchart LR
Q["이 차트의 어떤 값을 바꾸시오"] --> S1["helm show values 차트<br/>키 이름을 찾는다"]
S1 --> S2["--set 키=값<br/>또는 -f values.yaml"]
S2 --> S3["helm template 로 결과 확인"]
S3 --> S4["helm install / upgrade"]
classDef key fill:#dbeafe,stroke:#2563eb,color:#1e3a8a
classDef mute fill:#f1f5f9,stroke:#94a3b8,color:#334155
class S1 key
class Q,S2,S3,S4 mute
helm upgrade my-ingress ingress-nginx/ingress-nginx --set controller.replicaCount=5helm upgrade --install my-ingress ingress-nginx/ingress-nginx # 없으면 설치, 있으면 업그레이드
helm history my-ingress -n ingress-nginx# REVISION UPDATED STATUS CHART DESCRIPTION# 1 2026-08-01 superseded ingress-nginx-4.11.0 Install complete# 2 2026-08-05 deployed ingress-nginx-4.11.0 Upgrade complete
helm rollback my-ingress 1 -n ingress-nginxhelm uninstall my-ingress -n ingress-nginxflowchart LR
U["helm upgrade"] --> Q{"-f 또는 --set 을<br/>줬는가"}
Q -->|"줬다"| NEW["그 값이 적용된다"]
Q -->|"안 줬다"| KEEP["이전 값이 유지된다 · Helm 3"]
Q -->|"--reset-values"| RESET["차트 기본값으로 초기화 ⚠️"]
UN["helm uninstall"] -->|"CRD 는 남긴다 ⚠️<br/>의도된 동작 · 데이터 보호"| CRD["CustomResourceDefinition"]
classDef ok fill:#dcfce7,stroke:#16a34a,color:#14532d
classDef warn fill:#fef3c7,stroke:#d97706,color:#78350f
classDef mute fill:#f1f5f9,stroke:#94a3b8,color:#334155
class NEW,KEEP ok
class RESET,CRD warn
class U,Q,UN mute
apiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationresources: - deployment.yaml - service.yamlcommonLabels: app: webkubectl에 내장되어 있다 — 별도 설치가 필요 없다flowchart LR
B["base/<br/>deployment.yaml · service.yaml"] --> D["overlays/dev<br/>replicas 1 · nginx:latest"]
B --> P["overlays/prod<br/>replicas 5 · nginx:1.28 · namePrefix prod-"]
D --> OD["kubectl apply -k overlays/dev"]
P --> OP["kubectl apply -k overlays/prod"]
classDef key fill:#dbeafe,stroke:#2563eb,color:#1e3a8a
classDef ok fill:#dcfce7,stroke:#16a34a,color:#14532d
classDef mute fill:#f1f5f9,stroke:#94a3b8,color:#334155
class B key
class OD,OP ok
class D,P mute
apiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomization
resources: - ../../base # 베이스를 가져온다
namespace: prod # 전부 이 네임스페이스로namePrefix: prod- # 모든 이름 앞에 붙인다commonAnnotations: { owner: platform-team }
images: - { name: nginx, newTag: "1.28" } # 이미지 태그만 교체replicas: - { name: web, count: 5 } # 레플리카 수만 교체images / replicas 는 패치 파일 없이 가장 자주 바꾸는 값을 직접 지정하는 단축이다namePrefix를 쓰면 참조하는 Service·볼륨 이름도 함께 갱신된다configMapGenerator: - name: app-config literals: ["LOG_LEVEL=warn"]secretGenerator: - name: db-secret literals: ["password=prodsecret"]
patches: - path: resource-patch.yaml # 파일로 패치 target: { kind: Deployment, name: web }patches 는 베이스의 임의 필드를 고친다. target으로 대상을 고른다kubectl kustomize overlays/prod # 결과를 출력만 (미리보기)kubectl apply -k overlays/prod # 적용 (delete -k 로 제거)kustomize build overlays/prod | kubectl apply -f - # 독립 바이너리를 쓸 때패치 두 가지 방식
바꿀 부분만 같은 구조로 쓴다. 읽기 쉽다.
apiVersion: apps/v1kind: Deploymentmetadata: { name: web }spec: template: spec: containers: - name: nginx resources: { limits: { memory: 512Mi } }경로를 직접 지정한다. 리스트 항목 교체·삭제에 정확하다.
# kustomization.yaml 안에 인라인patches: - target: { kind: Deployment, name: web } patch: | - op: replace path: /spec/replicas value: 5kubectl kustomize overlays/prod | grep -A2 'kind: ConfigMap'# name: prod-app-config-7g5bd8f2mk이것이 6장의 “ConfigMap을 바꿔도 Pod이 안 바뀐다” 문제를 구조적으로 푼다.
flowchart LR
CM["configMapGenerator<br/>LOG_LEVEL=warn"] --> H1["이름에 내용 해시가 붙는다<br/>app-config-7g5bd8f2mk"]
H1 --> D1["Deployment 의 참조도<br/>자동으로 갱신된다"]
CHG["값을 debug 로 바꾼다"] --> H2["새 해시<br/>app-config-2k9xf4m1qp"]
H2 --> D2["Deployment 템플릿이 바뀐다<br/>→ 자동 롤아웃 ✅"]
classDef key fill:#dbeafe,stroke:#2563eb,color:#1e3a8a
classDef ok fill:#dcfce7,stroke:#16a34a,color:#14532d
classDef mute fill:#f1f5f9,stroke:#94a3b8,color:#334155
class H1,H2 key
class D2 ok
class CM,CHG,D1 mute
configMapGenerator/secretGenerator가 만든 이름에는 내용 해시가 붙는다generatorOptions: disableNameSuffixHash: true # 해시를 끄고 싶다면flowchart TD
Q{"누가 만든 것인가"}
Q -->|"남이 만든 것<br/>Ingress 컨트롤러 · Prometheus · CNI"| H["Helm<br/>설정 표면이 넓고<br/>버전 관리·롤백이 필요하다"]
Q -->|"내가 만든 앱"| K["Kustomize<br/>환경별 변형<br/>YAML 을 그대로 읽고 싶다"]
BOTH["배타적이지 않다"] -.->|"helm template 결과를<br/>Kustomize 로 패치하는 조합도 흔하다"| Q
classDef helm fill:#dbeafe,stroke:#2563eb,color:#1e3a8a
classDef kust fill:#dcfce7,stroke:#16a34a,color:#14532d
classDef mute fill:#f1f5f9,stroke:#94a3b8,color:#334155
class H helm
class K kust
class Q,BOTH mute
helm template prom prometheus/kube-prometheus-stack > base/all.yaml# → 이후 Kustomize 오버레이로 환경별 변형helm show values로 키를 찾고 --set 또는 -f로 덮어쓴다helm template 또는 --dry-run --debughelm uninstall은 CRD를 남긴다kubectl -k에 내장