Provisioning, Heml/Custom Chart

Jeonghak ChoΒ·2025λ…„ 5μ›” 18일

Provisioning

λͺ©λ‘ 보기
28/44

πŸ“— ν”„λ‘œλΉ„μ €λ‹ - custom Helm chart

πŸ³οΈβ€πŸŒˆ [κΆκΈˆν•œμ ]

  • Helm 직접 λ§Œλ“€μ–΄ μ‚¬μš©ν•˜λŠ” 방법

πŸ”—[λͺ©μ°¨]

μ»€μŠ€ν…€ Helm 차트λ₯Ό μ‚¬μš©ν•˜λŠ” 이유

μ»€μŠ€ν…€ Helm 차트λ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” ν‘œμ€€ν™”, μž¬μ‚¬μš©μ„±, 운영 νš¨μœ¨μ„±, 그리고 ν™˜κ²½μ— λ§žλŠ” μ΅œμ ν™” λ•Œλ¬Έ

λͺ©μ /μ΄μœ μ„€λͺ…
ν™˜κ²½ 맞좀 κ΅¬μ„±μ‘°μ§μ˜ 넀이밍 κ·œμΉ™, 라벨, μ–΄λ…Έν…Œμ΄μ…˜, λ¦¬μ†ŒμŠ€ μ œν•œ λ“± λ‚΄λΆ€ 정책에 맞좘 섀정을 λ°˜μ˜ν•  수 있음
반볡 배포 μžλ™ν™”λ™μΌν•œ κ΅¬μ„±μ˜ μ„œλΉ„μŠ€λ₯Ό μ—¬λŸ¬ 번, μ—¬λŸ¬ ν™˜κ²½(dev/stage/prod)에 배포 κ°€λŠ₯
ν‘œμ€€ν™”λœ 배포 방식λͺ¨λ“  νŒ€μ΄ λ™μΌν•œ ν˜•μ‹μœΌλ‘œ 배포λ₯Ό μ§„ν–‰ν•˜λ―€λ‘œ 운영 및 관리가 쉬움
μœ μ§€λ³΄μˆ˜ μš©μ΄ν•œ 번 μž‘μ„±ν•œ 차트λ₯Ό μ—¬λŸ¬ μ„œλΉ„μŠ€μ— κ³΅ν†΅μœΌλ‘œ μ μš©ν•˜κ³ , 버전 관리 및 μ—…λ°μ΄νŠΈκ°€ 쉬움
ν…œν”Œλ¦Ών™” 및 μž¬μ‚¬μš©μ„±YAML 쀑볡 없이 ν…œν”Œλ¦Ώ(_helpers.tpl)을 μ‚¬μš©ν•˜μ—¬ ꡬ쑰λ₯Ό κ°„λ‹¨ν•˜κ²Œ μœ μ§€ κ°€λŠ₯
GitOps 및 CI/CD 톡합ArgoCD, Flux, Jenkins λ“±κ³Ό μ‰½κ²Œ ν†΅ν•©λ˜μ–΄ 배포 μžλ™ν™” κ΅¬ν˜„ κ°€λŠ₯
λ³΄μ•ˆ 및 μ ‘κ·Ό μ œμ–΄Secret, ConfigMap, ServiceAccount 등을 톡합 관리할 수 μžˆμ–΄ λ³΄μ•ˆ ν†΅μ œκ°€ 쉬움
μ„œλ“œνŒŒν‹° 차트 ν™•μž₯곡식 Helm 차트λ₯Ό 포크 ν›„ 일뢀 μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•˜μ—¬ 쑰직에 μ΅œμ ν™”λœ ν˜•νƒœλ‘œ μž¬μ‚¬μš© κ°€λŠ₯

Helm μ»€μŠ€ν…€ 차트 생성

Helm으둜 Custom Chartλ₯Ό λ§Œλ“œλŠ” 과정은 Kubernetes μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ν…œν”Œλ¦Ών™”ν•˜μ—¬ μ†μ‰½κ²Œ λ°°ν¬ν•˜κ³  μž¬μ‚¬μš©ν•  수 있게 ν•΄μ£ΌλŠ” 방법이닀.

1. Helm Chart 생성

helm create mychart

이 λͺ…령을 μ‹€ν–‰ν•˜λ©΄ mychart/ 디렉터리가 μƒμ„±λ˜κ³ , Helm 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

2. Chart.yaml μˆ˜μ •

이 νŒŒμΌμ€ Chart의 메타데이터λ₯Ό μ •μ˜ν•œλ‹€.

apiVersion: v2
name: mychart
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0"
속성섀λͺ…
apiVersionHelm 차트의 API 버전 (예: v2)
ν˜„μž¬ Helm 3μ—μ„œλŠ” v2 μ‚¬μš©
name차트의 이름
디렉토리 이름과 λ™μΌν•˜κ²Œ 생성됨
descriptionμ°¨νŠΈμ— λŒ€ν•œ κ°„λ‹¨ν•œ μ„€λͺ…
type차트의 μœ ν˜• (선택사항)
일반적으둜 μƒλž΅λ˜λ©° application λ˜λŠ” library μ‚¬μš© κ°€λŠ₯
version차트의 버전
차트 자체의 λ²„μ „μœΌλ‘œ, νŒ¨ν‚€μ§• μ‹œ μ‚¬μš©λ¨ (helm package)
appVersionλ°°ν¬λ˜λŠ” μ‹€μ œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 버전
예: μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€μ˜ 버전
keywords(선택사항) Helm Hub λ“±μ—μ„œ 검색 μ‹œ μ‚¬μš©ν•  ν‚€μ›Œλ“œ 리슀트
home(선택사항) ν”„λ‘œμ νŠΈ ν™ˆνŽ˜μ΄μ§€ URL
sources(선택사항) μ†ŒμŠ€μ½”λ“œ μ €μž₯μ†Œ URL λͺ©λ‘
maintainers(선택사항) 차트 μœ μ§€λ³΄μˆ˜μž λͺ©λ‘
이름, 이메일 λ“± 포함 κ°€λŠ₯
icon(선택사항) μ°¨νŠΈμ— μ‚¬μš©λ  μ•„μ΄μ½˜ 이미지 URL
annotations(선택사항) ν‚€-κ°’ 쌍의 주석 μ •λ³΄λ‘œ, CI/CD μžλ™ν™” λ“±μ—μ„œ μ‚¬μš©λ¨
dependencies(선택사항) λ‹€λ₯Έ μ°¨νŠΈμ— λŒ€ν•œ μ˜μ‘΄μ„± μ •μ˜ (requirements.yaml λŒ€μ‹  μ‚¬μš©)

ν•„μš” μ‹œ dependencies ν•„λ“œλ„ 여기에 μΆ”κ°€ν•˜μ—¬ λ‹€λ₯Έ 차트λ₯Ό μ˜μ‘΄μ„±μœΌλ‘œ 포함할 수 μžˆλ‹€.

3. values.yaml μ„€μ •

이 νŒŒμΌμ€ ν…œν”Œλ¦Ώμ— λ„˜κ²¨μ€„ κΈ°λ³Έ λ³€μˆ˜ 값을 μ •μ˜ν•œλ‹€.

replicaCount: 2

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

service:
  type: ClusterIP
  port: 80

이 값듀은 templates/ λ‚΄μ˜ yaml νŒŒμΌλ“€μ—μ„œ {{ .Values.xxx }} ν˜•νƒœλ‘œ μ°Έμ‘°λœλ‹€.

4. templates/ 디렉토리 μˆ˜μ •

Helm의 핡심은 이 ν…œν”Œλ¦Ώ νŒŒμΌλ“€μ΄λ‹€. Kubernetes λ¦¬μ†ŒμŠ€λ₯Ό Go ν…œν”Œλ¦Ώ λ¬Έλ²•μœΌλ‘œ μž‘μ„±ν•˜λ©°, values.yamlμ—μ„œ μ •μ˜ν•œ 값듀을 μ°Έμ‘°ν•œλ‹€.

예: templates/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app: {{ .Release.Name }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - containerPort: 80

5. λ‘œμ»¬μ—μ„œ λ Œλ”λ§ 확인

ν…œν”Œλ¦Ώμ΄ μ˜λ„λŒ€λ‘œ μƒμ„±λ˜λŠ”μ§€ ν™•μΈν•œλ‹€.

helm template mychart
  • value 파일 μ‚¬μš©
helm template mychart --values myvalues.yaml

6. ν΄λŸ¬μŠ€ν„°μ— 배포

helm install myrelease ./mychart
  • μ„€μΉ˜λœ λ¦¬μ†ŒμŠ€λ₯Ό μ—…λ°μ΄νŠΈ
helm upgrade myrelease ./mychart
``
- μ‚­μ œ
``` bash
helm uninstall my-release-name

7. ν•„μš” μ‹œ Chart νŒ¨ν‚€μ§•

helm package mychart

.tgz ν˜•νƒœμ˜ νŒ¨ν‚€μ§€κ°€ μƒμ„±λ˜μ–΄ Helm repository에 μ—…λ‘œλ“œ

기쑴에 μ‘΄μž¬ν•˜λŠ” chartλ₯Ό λ°›μ•„ μˆ˜μ •ν•œ ν›„ κ΄€λ¦¬ν•˜λŠ” 절차

1. κΈ°μ‘΄ Chart λ‹€μš΄λ‘œλ“œ

Helm Hub λ˜λŠ” νŠΉμ • Helm λ¦¬ν¬μ§€ν† λ¦¬μ—μ„œ μ›ν•˜λŠ” Chartλ₯Ό λ‹€μš΄λ‘œλ“œν•œλ‹€.

helm pull <repo>/<chart-name> --untar
  • nginx의 경우 λ‹€μŒμ²˜λŸΌ λ‹€μš΄λ‘œλ“œ ν•  수 μžˆλ‹€.
helm repo add bitnami https://charts.bitnami.com/bitnami
helm pull bitnami/nginx --untar
  • nginx/ 디렉토리가 μƒμ„±λœλ‹€.

2. Chart 디렉터리 ꡬ쑰 이해 및 μˆ˜μ •

예λ₯Ό λ“€μ–΄ λ‹€μš΄λ‘œλ“œν•œ nginx/ λ””λ ‰ν† λ¦¬λŠ” λ‹€μŒκ³Ό 같은 ꡬ쑰λ₯Ό κ°€μ§ˆ 수 μžˆλ‹€

nginx/
β”œβ”€β”€ Chart.yaml
β”œβ”€β”€ values.yaml
β”œβ”€β”€ templates/
β”‚   β”œβ”€β”€ deployment.yaml
β”‚   β”œβ”€β”€ service.yaml
β”‚   └── ...
└── ...

μˆ˜μ • κ°€λŠ₯ν•œ λΆ€λΆ„

  • values.yaml: κΈ°λ³Έ μ„€μ • κ°’ μˆ˜μ • (포트, 이미지, λ¦¬μ†ŒμŠ€ λ“±)
  • templates/*.yaml: λ¦¬μ†ŒμŠ€ ν…œν”Œλ¦Ώ ꡬ쑰 자체 μˆ˜μ • (env, volumeMounts μΆ”κ°€ λ“±)
  • Chart.yaml: Chart μ΄λ¦„μ΄λ‚˜ 버전 등을 μ»€μŠ€ν„°λ§ˆμ΄μ¦ˆν•  수 있음

3. Git으둜 버전 관리 μ‹œμž‘ (선택사항)

Chartλ₯Ό 자체적으둜 κ΄€λ¦¬ν•˜λ €λ©΄ Git에 λ„£λŠ” 것이 μ’‹λ‹€.

git init
git add .
git commit -m "μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•œ nginx Helm Chart 초기 컀밋"

4. 이름 λ³€κ²½ 및 좩돌 λ°©μ§€ (선택사항)

μ›λž˜ Chart μ΄λ¦„μ΄λ‚˜ Release 이름이 κΈ°μ‘΄κ³Ό κ²ΉμΉ˜μ§€ μ•Šλ„λ‘ λ³€κ²½ν•˜λ©΄ μ•ˆμ „ν•˜λ‹€.

# Chart.yaml
name: mynginx
version: 1.0.0

5. μ»€μŠ€ν„°λ§ˆμ΄μ§•λœ Chart 배포

helm install mynginx ./nginx
  • μˆ˜μ •ν•œ λ‚΄μš©μ„ 반영
helm upgrade mynginx ./nginx

0개의 λŒ“κΈ€