애플리케이션 배포시 Deployment, Service, ConfigMap등의 리소스를 개별적으로 생성하는 것이 아닌,
하나의 패키지로 묶어서 배포합니다.
패키지를 묶어서 관리하면 여러 리소스들을 동시에 추가 및 업그레이드하기가 편리해 지지요.
이번엔 쿠버네티스 패키지 매니저 helm에 대해 알아봅시다.
helm이란?
helm은 쿠버네티스 패키지 매니저입니다. apt, yum, pip 툴과 비슷하게 플랫폼의 패키지를 관리합니다..
helm을 이용하여 원하는 소프트웨어를 쿠버네티스에 설치할 수 있지요.
이또한 YAML형식으로 구성되어 있으며, 이를 chart라고 합니다. (helm chart 어디서 많이 들어봤던거 같네요)
helm chart의 구조는 크게 values.yaml과 templates/ 디렉터리로 구성됩니다.
- values.yaml: 사용자가 원하는 값들을 설정하는 파일입니다.
- templates/: 설치할 리소스 파일들이 존재하는 리소스 파일입니다. 여기에 Deployemt, Service같은 리소스가 YAML파일 형태로 들어있습니다. 각 파일들의 설정값은 비워져 있고 values.yaml의 설정값들로 채워집니다.
패키지가 설치되는 시점에 values.yaml파일의 설정값들이 templates 디렉토리의 비워진 부분을 채웁니다.
자주 바뀌거나 사용자마다 달라지는 설정값들을 values.yaml파일에 입력곤 합니다.
templates 디렉터리는 패키지의 뼈대를 이룹니다.

helm을 통해 다른 사람이 만든 애플리케이션도 쉽게 쿠버네티스 클러스터로 가져올 수 있게 됩니다.
도커가 단순 프로세스 레벨에서 외부의 것을 가져다 쓸 수 있게 해준 것이면,
helm은 프로세스(Pod)와 네트워크(Service), 저장소 등 애플리케이션에서 필용한 모든 자원들을 외부에서 가져올 수 있게 합니다.
helm 설치
helm 설치는 매우 간단합니다.
아래 명령을 통해 설치할 수 있지요.
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash -s -- --version v3.2.2

이제 helm chart를 만들어봅시다.
chart 생성
mychart라는 이름을 가진 chart를 생성하고 그 속에 어떤 파일들이 있는지 확인해보겠습니다.
helm create mychart
ls mychart

- Chart.yaml: chart 이름, 버전 정보 등 chart의 전반적인 정보를 담고 있습니다.
- charts: chart 속에 또 다른 여러 chart들을 넣을 수 있습니다. 기본적으로는 비어있지요
- templates/: chart의 뼈대가 되는 쿠버네티스 리소스가 들어있는 폴더입니다.
- values.yaml: 사용자가 정의하는 설정값을 가진 YAML 파일입니다.

templstes 디렉토리 아래 service.yaml을 살펴보면 placeholder({{key}})가 있습니다.


오른쪽 이미지는 values.yaml입니다.
service.type과 service.port도 볼 수 있습니다.
이를 각각 로드밸런서와 8888로 수정합니다.

수정이 완료되면 helm chart를 설치합니다.
chart 설치
helm install foo ./mychart

foo라는 이름으로 mychart 패키지 설치가 완료됐습니다. 간단하죠?
다른 패키지 매니저와 다르게 모든 라이브러리 종속성이 컨테이너 안에서 해결되어 helm에서는 실제 사용할 프로세스만 생성됩니다.
Service리소스를 조회해 보면 values.yaml에서 정의한 것과 같이 로드밸런서 타입에 8888포트를 사용하는 것을 볼 수 있습니다.

template/service.yaml 파일의 {{ .Values.service.type }}과 {{ .Values.service.port }} 부분에 values.yaml 파일과 합쳐져 최종 Service 리소스가 생성된 것이지요.
이제 생성된 chart초 helm 명령들을 살펴봅시다.
chart리스트 조회
# 설치된 chart 리스트 확인하기
helm list
# 다른 네임스페이스에는 설치된 chart가 없습니다.
helm list -n kube-system
설치된 helm chart들을 조회합니다. -n(namespalte) 옵션을 통해 조회가 가능합니다.

chart 랜더링
실제 설치까지 수행되는 것이 아니라 values.yaml 파일과 templates 안의 템플릿 파일들이 합쳐지 YAML 정의서 결과를 확인하고 싶을때 아래 template 명령을 사용할 수 있습니다.
helm에서는 이를 rendering한다고 표현합니다. kubectel 명령툴의 --dry-run 옵션과 유사하다 볼 수 있습니다.
helm template foo ./mychart > foo-output.yaml
cat foo-output.yaml
# 전체 YAML 정의서 출력
foo-output.yaml을 보면 지금껏 봐온 리소스 YAML 정의서와 크게 다르지 않다는 것을 볼 수 있습니다.
이를 통해 helm install 명령은 다음과 같다고 볼 수 있지요.
helm template <NAME> <CHART_PATH> > output.yaml && kubectl apply -f output.yaml
이는 YAML 파일이 어떤 형태로 만들어져 설치가 되는지 디버깅 용도로 종종 사용합니다.
chart 업그레이드
이미 설치한 chart에 대해 values.yaml 값을 수정하고 업데이트할 수 있습니다.
Service 타입을 NodePort로 수정하고 다시 배포해보겠습니다.

helm upgrade foo ./mychart

위 명령으로 업그레이드를 진행합니다.
이후 서비스를 확인해봅시다.

Service 타입이 기존 로드밸런서에서 NodePort로 변경됐습니다.
chart를 조회하면 REVISION 숫자가 2로 올랐는데 업데이트 마다 REVISION값이 올라갑니다.
chart 배포상태 확인
배포된 chart의 상태를 확인하기 위해 다음과 같은 명령을 사용합니다.
helm status foo

chart 삭제
생성한 helm chart를 삭제하고 싶다면 delete 명령을 사용해 삭제합니다.
helm delete foo

원격 레포지토리
helm사용시 가장 큰 장점은 외부에 잘 구축된 애플리케이션을 손쉽게 가져올 수 있게 해준다는 점입니다.
이만 잘 사용해도 쿠버네티스 생태계에서 지원하는 다양한 애플리케이션을 활용할 수 있지요.
helm엔 chart 원격 저장소인 레포지토리가 있습니다.
여려 chart를 한 곳에 묶어 보관해놓은 저장소이지요.
사용자가 온라인상에 제공되는 레포지토리를 추가하여 원격 저장소로부터 chart를 로컬 클러스테어 설치할 수 있습니다.
레포지토리 추가
stable이라는 레포지토리를 추가해보겠습니다.
# stable repo 추가
helm repo add stable https://charts.helm.sh/stable

레포지토리 업데이트
추가한 레포지토리의 인덱스 정보를 최신으로 업데이트합니다.
helm은 레포지토리 정보를 기본적으로 캐싱하여, 신규 chart를 설치하기 위해 업데이트를 수행하겠습니다.
helm repo update

레포지토리 조회
현재 등록된 레포지토리의 리스트를 확인합니다.
현재 stable 레포지토리만 등록했으니 1개만 보입니다.
앞으로 몇 가지를 더 추가할 예정입니다.
helm repo list

레포지토리내 chart 조회
stable 레포지토리에 저장된 chart 리스트를 확인합니다.
helm search repo stable


아래 주소에서 stable 레포지토리 외에 다양한 원격 저장소를 조회해볼 수 있습니다.
Artifact 허브: https://artifacthub.io/
Artifact Hub
Find, install and publish Cloud Native packages
artifacthub.io
외부 chart 설치(WordPress)
stable 레포지토리에 있는 WordPress chart를 설치해보겠습니다.
로컬 디렉토리에 chart가 없어도 원격 레포에 있는 chart를 바로 설치할 수 있습니다.
이때 몇 가지 옵션을 지정할 수 있습니다.
- --version: chart의 버전을 지정합니다. Chart의 버전을 지정합니다. Chart.yaml안에 version 정보를 참조합니다.
- --set: 해당 옵션으로 values.yaml 값을 동적으로 설정할 수 있습니다.
- --namespace: chart가 설치될 네임스페이스를 지정합니다.
helm install wp stable/wordpress \
--version 9.0.3 \
--set service.port=8080 \
--namespace default


wordpress의 values.yaml이 다음과 같을 때 --set 명령을 이용하여 서비스 포트를 80에서 8080으로 변경한 것입니다.
wordpress Pod와 Service가 정상적으로 설치되고 curl 혹은 공인 IP:80으로 접속하면 사이트가 잘 보이게 됩니다.
chart fetch
chart를 원격에서 바로 설치할 수도 있지만 로컬 디렉토리로 다운받아 설치할 수도 있습니다.
세부적으로 설정값들을 수정한 후에 애플리케이션을 설치하고 싶을 때 fetch를 사용하지요.
먼저 fetch 명령을 이용해 chart를 다우로드 합니다. chart는 기본적으로 tar로 묶인 상태로 저장됩니다.
--untar 옵션을 이용해 폴더로 풀어진 상태로 저장 가능합니다.
helm fetch --untar stable/wordpress --version 9.0.3
ls wordpress/
# Chart.yaml README.md charts requirements.lock
# requirements.yaml templates values.schema.json values.yaml
# 사용자 입맛에 따라 세부 설정값 변경
vim wordpress/values.yaml
# ...
helm install wp-fetch ./wordpress
# WARNING: This chart is deprecated
# NAME: wp-fetch
# LAST DEPLOYED: Mon Jul 6 20:44:55 2020
# NAMESPACE: default
# STATUS: deployed
# REVISION: 1
# NOTES:
# ...
마무리
helm 패키지 매니저는 쿠버네티스를 사용하는 데 있어 강력함을 더해주는 툴입니다.
앞으로도 자주 helm을 이용해 새로운 애플리케이션을 추가해보겠습니다.
다음엔 쿠버네티스 애플리케이션 계층 네트워크 설정을 담당하는 Ingress 리소스에 대해 살펴보겠습니다.
'개발 > DevOps' 카테고리의 다른 글
| [Kubenetes] 스토리지 - PersistentVolume, PersistentVolumeClaim, StorageClass (1) | 2025.11.11 |
|---|---|
| [kubernetes] Ingress 리소스 - Basic Auth, cert-manager, Issuer (0) | 2025.11.04 |
| [Kubernetes] 쿠버네티스 컨트롤러 2 - StatefulSet, Job & CronJob (0) | 2025.10.04 |
| [Kubernetes] 쿠버네티스 컨트롤러 1 - ReplicaSet, Deployment (0) | 2025.10.02 |