헬름을 이용한 애플리케이션 패키징 및 관리
헬름이 제공하는 기능
- 헬름 사용 시 여러 개의 YAML 정의 및 스크립트를 하나의 아티팩트로 묶어 공개 또는 비공개 리포지토리에 공유 가능
- 헬름 프로젝트는 CNCF에서 관리함
- Helm3 부터 서버 컴포넌트 필요 없이 사용가능 (kubectl과 동일 접속 정보 사용), 다만 패키지 리포지토리를 따로 설정 해야함
ex)
helm repo add test_repo https://test_repo.net
helm repo update # 로컬 리포지토리 캐시 업데이트
helm search repo web --versions # 애플리케이션 검색
- 헬름에서 애플리케이션의 패키지를
chart라고 함 - 차트는 로컬에서 만들어져서 로컬 컴퓨터에 저장될 수 있고 리포지토리에 배포될 수 있음
- 설치된 차트를
release라고 함. 릴리즈는 이름을 붙일 수 있고 릴리즈 이름을 달리해가며 같은 차트를 여러번 설치 가능
패키지(차트) 구조

- 차트는 압축 파일 형태로 패키징되며 차트 이름과 버전이 부여됨
- 압축 파일에는 디렉토리가 들어있는데 이 디렉토리 이름이 차트 이름이 됨
Chart.yaml- 차트 이름, 버전, 설명 등 메타 데이터가 존재
templates- 쿠버네티스 매니페스트가 들어있는 디렉토리
values.yaml- 쿠버네티스 매니페스트에 쓰인 파라미터 기본 값이 들어있음
- 차트 파라미터 값 확인
helm show values kiamol/vweb --version 1.0.0 # - 파라미터 기본 값 수정하여 설치
helm install --set servicePort=8010 --set replicatCount=1 ch10-vweb kiamol/vweb --version 1.0.0 - 레플리카 수 변경하여 업그레이드
helm upgrade --set replicatCount=3 ch10-vweb kiamol/vweb --version 1.0.0 - 릴리즈 확인
helm ls
헬름으로 애플리케이션 패키징
- 애플리케이션의 매니페스트 (yaml) 파일을 모으고, 파라미터 값을 선정하고, 정의상 실제 설정 값을 템플릿 변수로 수정
apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Release.Name }} # 릴리즈 이름이 들어갈 템플릿 변수 labels: kiamol: {{ .Values.kiamolChapter }} # kiamolChapter 값이 들어갈 템플릿 변수 - 치환되는 값은 여러 출처에서 옴
- Release 객체
- install 혹은 upgrade시 관련 정보를 담아 생성됨
- Values 객체
- 차트에 포함된 기본값에 사용자가 지정한 값을 overwrite한 정보를 담아 생성

helm lint web-ping
lint: 유효성 검증, 차트 설치에 실패할 수 있는 원인을 출력해줌- 대상 차트는 압축 파일이 아니어도 가능, 차트 디렉토리에서 작업 가능
helm install wp1 web-ping
web-ping-deployment.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 }}
quote: 삽입된 값의 앞뒤로 따옴표가 없을 때 따옴표를 붙여주는 역할 수행
helm install --set targetUrl=kiamol.net wp2 web-ping/
- 요청 대상 url을 달리하여 wp2라는 이름으로 릴리즈 추가 배치
- 차트에 포함된 템플릿을 대상으로는 kubectl apply 명령 사용 불가
- 템플릿 변수 때문에 유효하지 못한 yaml 파일로 인식함
- 리포지토리는 웹 서버에 저장된 차트와 버전의 정보가 담긴 index.yaml 파일임
ChartMuseum이라는 오픈소스를 통해 리포지토리 호스팅 가능
차트 리포지토리에 배포
1) 차트 패키징
helm package web-ping
2) 패키징 된 압축 파일 차트 뮤지엄에 업로드
curl --data-binary "@web-ping-0.1.0.tgz" {차트 뮤지엄 url}
3) 리포지토리 인덱스에 새로운 차트 정보 추가 -> 차트 뮤지엄이 대신 해줌
4) 차트가 추가 되었는지 확인 가능
curl {차트 뮤지엄 주소}/index.yaml
설정 값 파일을 사용하여 차트를 설치
helm install -f web-ping-values.yaml wp3 local/web-ping
- 환경 별로 설정 값 따로 저장 가능
- 버전 지정하지 않으면 가장 최신 차트가 설치됨
차트 간 의존 관계 모델링
Chart.yaml
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 # 필요할 때만 설치
- 상위 차트
pi가 하위 차트proxy, vweb을 의존하는 관계 - proxy 차트를 의존 차트로 사용하기 위해서 상의 차트 정의에서 의존 차트 목록에 추가하여 하위 차트로 삼아야 함
- 이후 하위 차트 설정 값을 상위 차트의 정의 에서 지정
values.yaml
# 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: # 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
upstreamToProxy: "{{ .Release.Name }}-web"- pi 애플리케이션 서비스 명과 일치시키기 위해 템플릿 변수 사용
- 하위 차트 설정 값 참조 시 설정 값 이름 앞에 차트 이름 붙임
- ex) proxy.upstreamToProxy
- 현재 proxy에 대한 의존성 condition은
proxy.enabled를 참조하고 있고, enabled 값이 false이므로 하위 차트 정의가 무시됨
- 차트를 설치하거나 패키징 하려면 의존하는 하위 차트를 사용할 수 있어야 함
helm dependency build pi
- 의존 차트 빌드 시 원격 리포지토리의 차트를 내려받거나 로컬 차트가 압축 되어 상위 차트 디렉토리 아래에 복사됨
- pi/charts에
proxy-0.1.0.tgz,vweb-2.0.0.tgz생성됨
- pi/charts에
helm install --set serviceType=ClusterIP --set proxy.enabled=true pi1 ./pi- 상위 차트 설치 시 하위 차트의 압축을 풀어서 함께 설치
헬름 릴리즈의 업그레이드와 롤백
- 현재 vweb 차트 1.0.0 버전이 설치된 상태
- 새 버전의 차트의 설정 값 확인
helm show values kiamol/vweb --version 2.0.0
- 기존 릴리즈 설정 값을 재사용하여 버전 2.0.0 업그레이드
helm upgrade --reuse-values --atomic vweb kiamol/vweb --version 2.0.0--atomic: 모든 리소스의 업그레이드를 기다리다가 일부 실패 시 전부 롤백- 릴리즈 명은 기존과 동일해야 함. 다를 경우 upgrade가 아닌 install 사용
- 버전 2.0.0에는 serviceType이라는 새로운 설정 값이 존재하여 기존 설정 값을 재사용하여 업그레이드 실패
- 업그레이드 실패 시 자동으로 이전 버전으로 롤백
- 릴리즈 히스토리 확인 가능
helm history vweb - 현재 릴리즈의 설정 값 적용
helm get values vweb -o yaml > vweb-valuse.yaml helm upgrade -f vweb-values.yaml --atomic vweb kiamol/vweb --version 2.0.0 - 롤백은 리비전을 지정해서 확인
helm rollback vweb 2
헬름 사용에 대한 고찰
- 매니페스트 파일을 한 번 템플릿 변수로 구성하면 이전으로 돌리기 어려움
- 따라서 팀에서 helm 사용 시 모두가 함께 사용해야 함