HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
📖
공부한 책
/쿠버네티스 교과서/
10장. 헬름을 이용한 애플리케이션 패키징 및 관리

10장. 헬름을 이용한 애플리케이션 패키징 및 관리

헬름이 제공하는 기능헬름 통해 애플리케이션 설치개념헬름으로 애플리케이션 패키징하기템플릿 변수로 YAML 파일 작성 & 애플리케이션 여러벌 배치헬름 차트 파일 구조헬름 차트를 리포지토리에 공유배포를 위한 단계리포지토리에서 설치 후 설정값 이용하여 차트 설치차트 간 의존관계 모델링하기헬름으로 설치한 릴리스의 업그레이드와 롤백헬름은 어떤 상황에 적합한가

헬름이 제공하는 기능

헬름 통해 애플리케이션 설치

# 원격 서버를 가리키는 이름으로 리포지토리를 추가 # helm repo add [NAME] [URL] [flags] helm repo add kiamol https://kiamol.net # 로컬 리포지토리 캐시를 업데이트 helm repo update Usage: helm repo [command] Available Commands: add add a chart repository index generate an index file given a directory containing packaged charts list list chart repositories remove remove one or more chart repositories update update information of available charts locally from chart repositories # 인덱스 캐시로부터 애플리케이션을 검색 # -versions : show the long listing, with each version of each chart # on its own line, for repositories you have added helm search repo web --versions NAME CHART VERSION APP VERSION DESCRIPTION kiamol/vweb 2.0.0 2.0.0 Simple versioned web app kiamol/vweb 1.0.0 1.0.0 Simple versioned web app Usage: helm search [command] Available Commands: hub search for charts in the Artifact Hub or your own hub instance repo search repositories for a keyword in charts # 차트에 포함된 파라미터 값의 기본값을 확인 리포지터리이름/차트이름 helm show values kiamol/vweb --version 1.0.0 # 파라미터 값의 기본값을 수정하여 차트를 설치 # Usage: helm install [NAME] [CHART] [flags] helm install --set servicePort=8010 --set replicaCount=1 ch10-vweb kiamol/vweb --version 1.0.0 # 설치된 릴리스를 확인 helm ls NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION ch10-vweb default 1 2024-11-19 15:51:46.637873 +0900 KST deployed vweb-2.0.0 2.0.0 # 파라미터 값의 기본값을 수정하여 릴리스를 업데이트 helm upgrade --set servicePort=8010 --set replicaCount=3 ch10-web kiamol/vweb --version 1.0.0
  • 기능
    • 명령행 도구의 형태로 리포지토리 서버와 상호작용하며, 애플리케이션 패키지를 찾아 내려받고 쿠버네티스 클러스터에 이를 설치하고 관리하는 기능
    • 쿠버네티스에서 동작하도록 만들어진 애플리케이션을 위한 패키지 관리자
  • 헬름에서 사용되는 패키징 포맷은 쿠버네티스 YAML 파일을 확장한 것으로, 헬름 패키지는 말하자면 여러 개의 쿠버네티스 매니페스트를 모아 놓은 것과 같음

개념

  • 차트 : 애플리케이션의 패키지. 로컬 컴퓨터에서 만들어져 로컬 컴퓨터에 설치될 수도 있고 리포지토리 로 배포될 수도 있다.
  • 릴리즈 : 설치한 차트. 릴리스에는 이름을 붙일 수 있어 릴리스 이름을 달리해 가며 하나의 클러스터에 같은 차트를 여러 벌 설치 가능함
  • 차트에는 쿠버네티스 YAML 매니페스트가 있고 이 정의에는 파라미터 값이 있어 사용자가 동일한 차트를 레플리카 수나 로그 수준 등 설정을 바꾸어 가며 설치할 수 있음
notion image
kubectl get deploy --show-labels NAME READY UP-TO-DATE AVAILABLE AGE LABELS ch10-vweb 1/1 1 1 61s app.kubernetes.io/instance=ch10-vweb, app.kubernetes.io/managed-by=Helm, app.kubernetes.io/name=vweb,kiamol=ch10
  • 공개 리포지토리의 공개 차트를 설치하여, 레이블이 쿠버네티스 설정의 베스트 프랙티스 가이드를 따라 한것이라 좀 길어짐

헬름으로 애플리케이션 패키징하기

템플릿 변수로 YAML 파일 작성 & 애플리케이션 여러벌 배치

apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Release.Name }} labels: kiamol: {{ .Values.kiamolChapter }} spec: selector: matchLabels: app: web-ping instance: {{ .Release.Name }} template: metadata: labels: app: web-ping instance: {{ .Release.Name }} spec: containers: - name: app image: kiamol/ch10-web-ping env: - name: TARGET value: {{ .Values.targetUrl }} - name: METHOD value: {{ .Values.httpMethod }} - name: INTERVAL value: {{ .Values.pingIntervalMilliseconds | quote }}
  • .Release.Name : Release 객체에서 릴리스 이름. Release 객체는 install 또는 upgrade 명령을 실행할 때 관련 정보를 담아 생성되는 객체
  • .Values.kiamolChapter : Values 객체는 차트에 포함된 기본값에 사용자가 지정한 값을 오버라이드한 정보를 담아 생성되는 객체
  • quote 함수는 삽입된 값에 앞뒤로 따옴표가 없을 때 따옴표를 붙여 주는 역할을 함
  • 같은 YAML 파일로 여러 번 애플리케이션을 배치하면 kubectl로는 리소스 이름이 같아서 업데이트만 되지만 헬름으로 하면 여러 벌의 애플리케이션 실행이 가능함
 
# 차트에 들어갈 파일의 유효성을 검증 # helm lint <chart.yaml 이 존재하는 폴더 이름> helm lint web-ping helm install wp1 web-ping/ # 동일한 차트로 애플리케이션 여러 벌 만들기 helm show values web-ping/ # 릴리즈 추가 배치 helm install --set targeturl=kiamol.net wp2 web-ping/
  • lint 명령은 로컬에서 작업중인 차트에서만 사용할 수 있음
  • install 명령은 로컬에서 작업 중인 차트와 리포지터리에서 내려받은 차트 모두에서 사용 가능
    • 로컬에 위치한 차트는 디렉터리여도 되고 압축파일이여도 됨
  • 헬름과 kubectl apply 는 호환될 수 없다. 왜냐면 헬름 사용시, yaml 파일에 템플릿 변수 때문에 유효한 YAML 파일이 될 수 없다.

헬름 차트 파일 구조

  • 최상위 디렉터리 이름이 차트 이름
  • 이 디렉터리에는 최소한 아래 세가지 요소가 있어야 함
    • chart.yaml : 차트의 이름이나 버전 등 메타데이터를 기록한 파일
    • values.yaml : 파라미터 값의 기본값을 기록한 파일
    • templates 디렉터리 : 템플릿 변수가 포함된 쿠버네티스 매니페스트 파일을 담은 디렉터리

헬름 차트를 리포지토리에 공유

# 공식 헬름 리포지토리를 추가 helm repo add stable https://charts.helm.sh/stable # 차트뮤지엄 설치 - repo 옵션을 사용하면 리포지터리의 상세정보를 받아오므로 로컬 캐시 업데이트하지 않아도 됨 helm install --set service.type=LoadBalancer --set service.externalPort=8008 --set env.open.DISABLE_API=false repo stable/chartmuseum --version 2.13.0 --wait # 차트 뮤지엄을 local 이라는 이름으로 리포지토리로 등록 helm repo add local http://localhost:8008 helm repo list NAME URL kiamol https://kiamol.net stable https://charts.helm.sh/stable local http://localhost:8008
 

배포를 위한 단계

  1. 차트를 zip 파일로 압축 후,
  1. 서버에 압축 파일 업로드,
  1. 리포지터리 인덱스에 새로운 차트 정보 추가
# 로컬에 위치한 차트를 패키징 helm package web-ping Successfully packaged chart and saved it to: /Users/gilgeun-o/Desktop/Projects/kiamol/ch10/web-ping-0.1.0.tgz # 리포지토리에 압축파일 업로드 curl --data-binary "@web-ping-0.1.0.tgz" http://localhost:8008/api/charts # 차트뮤지엄의 인덱스에서 새로운 차트 확인 curl http://localhost:8008/index.yaml apiVersion: v1 entries: web-ping: - apiVersion: v2 appVersion: 1.0.0 created: "2024-11-19T08:47:36.168409007Z" description: A simple web pinger digest: 0de8b8177c312f27cbcca1d0a0d2501ae4d0b9c612462c2d2b244e4d24dcf4b0 name: web-ping type: application urls: - charts/web-ping-0.1.0.tgz version: 0.1.0 generated: "2024-11-19T08:48:11Z" serverInfo: {}

리포지토리에서 설치 후 설정값 이용하여 차트 설치

# 리포지터리 캐시를 업데이트. 업데이트를 해주어야 최근에 업로드한 이력을 확인할 수 있음 helm repo update # 기본적으로 로컬 캐시에서 검색함. helm search repo web-ping NAME CHART VERSION APP VERSION DESCRIPTION local/web-ping 0.1.0 1.0.0 A simple web pinger cat web-ping-values.yaml pingIntervalMilliseconds: 15000 # 설정값 파일을 이용하여 차트를 설치 helm install -f web-ping-values.yaml wp3 local/web-ping
  • 버전을 명시하지 않고 helm install 을 하는건 좋지 않음. 버전 명시하기. 명시하지 않으면 최신 버전이 설치됨

차트 간 의존관계 모델링하기

 
apiVersion: v2 name: pi description: A Pi calculator type: application version: 0.1.0 dependencies: - name: vweb version: 2.0.0 repository: https://kiamol.net condition: vweb.enabled - name: proxy version: 0.1.0 repository: file://../proxy condition: proxy.enabled
  • 원주율 계산 애플리케이션의 차트 정의. 위 애플리케이션은 두 개의 의존 차트가 있음
  • 상위 차트가 하위 차트(프록시와 vweb)을 필요로 하는 관계이며, 하위 차트는 독립된 차트여야 함
    • 하위 차트의 정의는 최대한 일반적으로 활용할 수 있도록 템플릿 변수를 사용해야 함
    • 또한 특정한 애플리케이션에만 쓸모가 있는 요소라면 해당 요소는 하위 차트가 아니라 애플리케이션 차트에 직접 포함되는 것이 맞음
 
proxy 차트를 의존 차트로 사용하려면 상위 차트의 정의에서 해당 차트를 의존 차트 목록에 추가하여 하위 차트로 삼아야 한다. 그다음 하위 차트의 설정값을 상위 차트의 정의에서 지정. 이때 하위 차트의 설정값 참조 시, 설정값 이름앞에 차트 이름 붙이기. <차트이름>.<설정값> → proxy.upstreamToProxy
# number of app Pods to run replicaCount: 2 # type of the app Service: serviceType: LoadBalancer # settings for vweb vweb: # whether to deploy vweb enabled: false # settings for the reverse proxy proxy: # whether to deploy the proxy enabled: false # name of the app Service to proxy upstreamToProxy: "{{ .Release.Name }}-web" # port of the proxy Service servicePort: 8030 # number of proxy Pods to run replicaCount: 2
values.yaml
차트를 설치하거나 패키징하려면 자신이 의존하는 하위 차트를 사용할 수 있어야 함
  • 로컬 디렉터리를 압축하거나, 리포지터리에서 내려받은 압축 파일을 차트 디렉터리에 넣으면 됨
# pi 차트의 하위 차트를 빌드 -> repository 에서 압축 파일 내려받아 charts 폴더 아래로 다운받음 helm dependency build pi # 설정 기본값을 적용해서 오류 여부 검증. YAML 파일 생성됨 helm install pi1 ./pi --dry-run helm install --set serviceType=ClusterIP --set proxy.enabled=true pi2 ./pi
notion image

헬름으로 설치한 릴리스의 업그레이드와 롤백

# 릴리즈 목록 확인 helm ls -q helm show values kiamol/web --version 2.0.0 # internal 타입의 서비스로 새 릴리스를 설치 helm install --set servicePort=8020 --set replicaCount=1 --set serviceType=ClusterIP ch10-vweb-v2 kiamol/web --version 2.0.0 # 임시로 설치한 릴리스 제거 helm uninstall ch10-vweb-v2 helm get values ch10-vweb # 기존 릴리스를 설정값을 재사용하여 버전 2로 업그레이드 - 실패 helm upgrade --reuse-values --atomic ch10-vweb kiamol/vweb --version 2.0.0 # vweb 릴리스의 릴리스 히스토리 확인 helm history ch10-vweb helm get values ch10-vweb -o yaml > vweb-values.yaml # --atomic 플래그와 저장된 설정값 파일을 사용해서 버전 2로 업그레이드 helm upgrade -f vweb-values.yaml --atomic ch10-vweb kiamol/vweb --version 2.0.0 # 리비전 2에 적용된 설정값 확인 helm get values ch10-vweb --revision 2 # 리비전 2로 롤백 helm rollback ch10-vweb 2 # 최근 두 리비전의 정보를 확인 helm history ch10-vweb --max 2 -o yaml
  • —reuse-values : 현재 릴리스에 사용된 설정값을 그대로 새 릴리스에도 사용하라
    • 그런데 2.0.0 에는 원래 릴리스에 없었던 설정값이 있음
  • —atomic : 리소스 하나에서 문제가 생기면 다른 모든 리소스들도 다 롤백을 진행해줌. kubectl 에서는 지원하지 않는 기능

헬름은 어떤 상황에 적합한가

  • 애플리케이션의 매니페스트에 한번 템플릿 변수를 추가하고 나면, 이전으로 돌아가기가 어렵다. 헬름을 사용하기로 했다면 모두가 함께 사용해야 하고, 억지로 혼자 남아 있으려면 매니페스트를 여러 벌 유지해야 함
  • 헬름이 적합한지 아닌지는 개발해서 패키징하는 애플리케이션이 어떤 것인지
    • 개발팀이 저마다 담당 마이크로서비스를 다루고 네이티브 또는 도커나 도커 컴포즈 환경에서 애플리케이션을 실행하는 경우, 헬름 도입하면 수백개 YAML 파일을 훨씬 적은 수의 차트로 합쳐 중앙화된 관리 가능
  • 완전 자동화된 지속적 배치 절차를 갖추었는지
    • CICD 는 헬름을 도입하면 훨씬 간편해짐. 환경별 설정값 파일을 사용하여 테스트 환경에서 동일한 버전의 차트를 테스트할 수 있고, 애플리케이션을 배치할 때마다 검증을 위한 잡을 둘 수도 있음