[17] Helm

2025. 6. 17. 13:20·Kubernetes/Ops

0. 사전지식

쿠버네티스(Kubernetes)에서 애플리케이션을 배포하고 관리할 때, 여러 개의 YAML 파일을 다루다 보면 점점 복잡해지기 마련이다. 당장 우리의 예시를 들면 manifest 디렉토리에 현재 30개 정도의 yaml 파일이 있다. 따라서 이를 보다 효율적으로 도와줄 수 있는 도구를 사용하면 되는데 대표적인 도구가 바로 Helm이다. 해당 글에서는 Helm의 개념과 함께 실제로 Helm을 설치하고, 아트를 검색/설치/수정/삭제하는 일련의 실습을 함께 따라가 보겠다.

 

 


1. Helm

1.1. Helm이란?

Helm은 쿠버네티스 리소스를 패키지처럼 묶어 관리하는 패키지 매니저이다. 리눅스의 apt, yum처럼 쿠버네티스 환경에서 복잡한 리소스 배포를 쉽게 도와주는 도구라고 생각하면 된다.

 

1.2. Helm Chart란?

Helm에서 사용하는 패키지 단위를 Chart라고 부른다. Chart는 쿠버네티스에서 필요한 여러 리소스(Deployment, Service, ConfigMap 등)를 생성하기 위해 정의한 정보(YAML) 묶음이다. 예를들어 웹 서버를 띄우려면 Deployment, Service, ConfigMap, Secret 등 여러 YAML이 필요한데, 이걸 한 덩어리(Chart)로 묶어놓고 필요한 값들만 바꿔서 재사용할 수 있게 해주는것이다.

📁 chart의 구조
wordpress/
├── Chart.yaml # Chart 메타정보
├── values.yaml # 기본 설정값
├── templates/ # 실제 리소스 YAML 템플릿
│      └── NOTES.txt # 사용 설명 안내 (선택)
├── charts/ # 의존성 차트
├── requirements.yaml # 의존성 명시 (v2)
├── LICENSE # 라이선스 정보 (선택)
└── README.md # 설명 파일 (선택)

 

1.3. Helm Repository란?

 Helm Repository는 위에서 언급한 Chart들의 저장소이다. 우리가 Linux에서 apt를 통해 패키지 저장소(Repository)로부터 프로그램을 다운받는 것처럼, Helm Repository는 Kubernetes의 Chart(패키지)를 저장해 놓은 서버 혹은 서비스이다.

 

 대표적으로 Artifact Hub(https://artifacthub.io/) 같은 곳에서 공개 Helm 차트를 많이 볼 수 있다. 설치 시에는 Repository에서 Chart를 가져와 Release라는 단위로 클러스터에 배포된다.

 

1.4. Helm 사용 전/후 차이

구분  Helm 사용 전 Helm 사용 후
배포 kubectl apply -f 30개 YAML helm install chart-name
수정 YAML 직접 열어서 수정 values.yaml만 수정
롤백 kubectl apply 한거 복구 어려움 helm rollback 가능
버전관리 Git으로 YAML 버전만 Chart 자체에 버전 정보
의존성 수작업 관리 Chart dependencies 지원

 

1.5. 동작원리

[1] Helm은 values.yaml을 변수값으로 읽어들이고
[2]templates/ 의 .yaml 들에서 Go 템플릿 문법으로 된 파일을 렌더링
[3] 완성된 YAML을 Kubernetes에 kubectl apply와 비슷하게 배포
📌 즉, Helm의 역할은 템플릿 엔진 + kubectl 배포 자동화 조합
📌 Helm Repository → Chart 선택 → 클러스터에 설치 → 리소스 생성

 

1.6. 사용 이유

[1] 내가 만든 환경을 팀원에게 공유하고 싶을 때, 리소스 별 YAML로 모두 보내면 파일이 너무 많아질 수 있다. 이럴때 chart라는 단위로 묶으면 쉽게 같은 환경을 구축할 수 있다.
[2] 유명한 오픈소스는 이미 Helm Chart로 패키징되어 공개 저장소(Helm Repository)에 올라가 있기 때문에
`helm repo add bitnami https://charts.bitnami.com/bitnami` 명령어로 Repository를 추가하고,
`helm install my-nginx bitnami/nginx` 명령어로 간단히 설치 가능

 


2. 실습

2.1. Helm 설치 및 확인

https://helm.sh/docs/intro/install/

 

Installing Helm

Learn how to install and get running with Helm.

helm.sh

 

# Helm 설치
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

# 설치 확인
helm version

# 차트 확인
helm list
helm ls

 

2.2. 레파지토리 확인

레파지토리 : https://artifacthub.io/

 

Artifact Hub

Find, install and publish Cloud Native packages

artifacthub.io

 

레파지토리를 따로 등록하지 않는다면 로컬에서는 helm repo list를 하더라도 원격 repo를 가져올 수 없다. 차트를 사용하기 위해서는 반드시 레파지토리가 존재해야 한다.

# 레파지토리 검색
helm search hub nginx

# 레파지토리 설치
helm repo add bitnami https://charts.bitnami.com/bitnami

# 레파지토리 확인
helm repo list

 

2.3. 차트 설치

2.3.1. repo 직접 다운로드

# 차트 설치 방법 1

## 공식 문서
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install my-nginx bitnami/nginx --version 18.3.4

## 상태 확인
helm ls
helm status my-nginx
kubectl get all -n default | grep "nginx"

## 삭제
helm delete my-nginx
kubectl delete all --all

 

2.3.2. pull 및 압축해제

# 차트 설치 방법 2
cd $HOME/helm/nginx

helm pull bitnami/nginx
tar xvfz nginx-18.3.4.tgz
rm -rf nginx-18.3.4.tgz
# 압축해제 한 파일(차트)의 내부 구조

```
templates : kubernetes resources 정의 yaml 파일 묶음 디렉터리
  - _helpers.tpl : 사용자 정의 helm 리소스
values.yaml: template resouces에 들어가는 값 명시
Chart.yaml: chart 정보 명시
  - common : helm 공통 정보 명시 리소스
README.yaml: chart 설명 README.
```

 

2.4. 사용자 정의 설정

2.4.1. values.yaml 커스터마이징

사실상 Helm을 사용하여 손 쉽게 환경을 구성하더라도 내 요구사항에 따라 환경을 커스터마이징 해야한다. 즉, Helm을 사용할 때 가장 많이 하는 작업 중 하나가 values.yaml을 수정하여 내 환경에 맞게 커스터마이징 하는 작업이다.

 

[1] values.yaml 복제

원본 manifest(values.yaml)을 직접 수정하면 원본 보존이 안되고, 버전 업그레이드나 비교가 어려워질 수 있다. 따라서 보통 원본 파일(values.yaml)은 건드리지 않고, my-values.yaml과 같이 values.yaml을 복제하여 해당 manifest로 리소스를 생성하는것이 일반적이다.

cp values.yaml my-values.yaml

 

[2] my-values.yaml 커스터마이징 (replicas 개수 수정)

vi my-values.yaml
```
min : 2
max : 2
```

 

[3] 변경된 manifest 기반으로 리소스 생성

helm install nginx -f my-values.yaml .

 

[4] 리소스 확인

helm ls
helm get manifest nginx
kubectl get pods -o wide
kubectl get deploy,svc,configmap

kubectl describe pod nginx-xxx

 

2.4.2. 🚨 사용자 정의 설정 시 주의점 🚨

# [1] 원본 manifest(values.yaml)의 복제본(my-values.yaml) 생성
cp values.yaml my-values.yaml

# [2] 복제본(my-values.yaml)을 기반으로 리소스 생성
helm install nginx -f my-values.yaml

# [3] 복제본(my-values.yaml)의 리소스 정보 수정
## 예를들어, replicas의 개수를 2에서 3으로 변경
vi my-values.yaml

# [4] 다시 한번 복제본(my-values.yaml)을 기반으로 리소스 생성
helm install nginx -f my-values.yaml

# 🚨오류 발생 !!!
## 같은 이름의 manifest(my-values.yaml)가 이미 설치되어 있다면,
## helm install이 아니라 helm upgrade를 수행해야 적용된다.

# [5] 오류 발생 후, helm install이 아닌, helm upgrade 수행
helm upgrade nginx -f my-values.yaml

✅ 정리하면

시도한 행동 예상 결과 설명
values.yaml 수정 후 install 다시 시도 오류 발생 이미 설치된 release가 있기 때문
values.yaml 수정 후 upgrade 실행 수정 사항 반영됨 -f 옵션 없이 실행 시 values.yaml이 반영됨
my-values.yaml 만들고 수정 후 설치 OK -f my-values.yaml 옵션이 있으면 해당 내용 반영
my-values.yaml로 설치 후 upgrade 때 -f 안 씀 설정이 초기화될 수 있음 values.yaml 내용이 다시 반영됨
 

 


3. 추가 실습 : MySQL 설치 및 접속 확인

명령어 : https://helm.sh/docs/helm/helm/

 

Helm

Helm - The Kubernetes Package Manager.

helm.sh

 

3.1. Helm Repo 추가

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

 

3.2. MySQL 설치

helm install my-mysql bitnami/mysql

 

3.3. 설치 확인

helm ls
kubectl get all

 

3.4. 비밀번호 확인

MySQL root 비밀번호는 Secret에 저장되어 있으므로, 아래 명령어로 확인가능.

kubectl get secret my-mysql -o jsonpath="{.data.mysql-root-password}" | base64 -d

 

3.5. 상태 확인

결과는 아래와 같이 pending 상태를 유지하고 있는데, PV, PVC 설정을 해주지 않았기 때문에 pod와 연결할 수 없어서 발생하는 오류이다.

kubectl get all

ubuntu@k8s-master:~/manifest/helm/mysql$ kubectl get all
NAME                            READY   STATUS    RESTARTS   AGE
pod/mysql-0                     0/1     Pending   0          5m32s
pod/test-nginx-b4d87ffb-j5ksv   1/1     Running   0          37m

NAME                     TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/kubernetes       ClusterIP      10.96.0.1        <none>        443/TCP                      12d
service/mysql            ClusterIP      10.101.88.186    <none>        3306/TCP                     7m20s
service/mysql-headless   ClusterIP      None             <none>        3306/TCP                     7m20s
service/test-nginx       LoadBalancer   10.104.184.188   10.0.2.21     80:31023/TCP,443:30932/TCP   40m

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/test-nginx   1/1     1            1           40m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/test-nginx-b4d87ffb   1         1         1       38m

NAME                     READY   AGE
statefulset.apps/mysql   0/1     7m25s

 

3.6. PV 생성 후 PVC 연결

3.6.1. pv.yaml 생성

# pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  capacity:
    storage: 8Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /mnt/data/mysql
  persistentVolumeReclaimPolicy: Retain

 

3.6.2. pvc.yaml 생성

# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-mysql-0
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
  volumeName: mysql-pv
kubectl apply -f pv.yaml
kubectl apply -f pvc.yaml

 

3.7. 재시작

helm uninstall mysql

# 아래에 작성한 standard에는 실제 존재하는 StorageClass 이름을 넣어줘야 한다.
helm install mysql bitnami/mysql \
  --set primary.persistence.storageClass=standard

 

'Kubernetes > Ops' 카테고리의 다른 글

[16] Kubernetes Autoscailing  (0) 2025.06.17
[15] Kubernetes Deployment Strategy  (0) 2025.06.16
[14] Kubernetes Scheduler  (0) 2025.06.16
[13] Kubernetes Security  (5) 2025.06.14
[2] Kubernetes 환경 구축  (0) 2025.06.12
'Kubernetes/Ops' 카테고리의 다른 글
  • [16] Kubernetes Autoscailing
  • [15] Kubernetes Deployment Strategy
  • [14] Kubernetes Scheduler
  • [13] Kubernetes Security
h6bro
h6bro
백엔드 개발자의 기술 블로그
  • h6bro
    Jun's Tech Blog
    h6bro
  • 전체
    오늘
    어제
    • 분류 전체보기 (241) N
      • Java (18)
        • Core (9)
        • Design Pattern (9)
      • Spring (80)
        • Core (24)
        • MVC (6)
        • DB (10)
        • JPA (26)
        • Monitoring (3)
        • Security (11)
        • WebSocket (0)
      • Database (33)
        • Redis (15)
        • MySQL (18)
      • MSA (16)
        • MSA 기본 (11)
        • MSA 아키텍처 (5)
      • Kafka (30) N
        • Core (18) N
        • Connect (12)
      • ElasticSearch (11)
        • Search (11)
        • Logging (0)
      • Test (4)
        • k6 (4)
      • Docker (9)
      • CI&CD (10)
        • GitHub Actions (6)
        • ArgoCD (4)
      • Kubernetes (18)
        • Core (12)
        • Ops (6)
      • Cloud Engineering (4)
        • AWS Infrastructure (3)
        • AWS EKS (1)
        • Terraform (0)
      • Project (8)
        • LinkFolio (1)
        • Secondhand Market (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • Cloud Engineering 포스팅 정리
  • 인기 글

  • 태그

    ㅈ
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
h6bro
[17] Helm
상단으로

티스토리툴바