
지난 시간에는 어플리케이션 배포 및 서비스를 위해 사용되는 다양한 쿠버네티스 워크로드 등을 살펴보았다. (StatefulSets, PV, PVC...) 실제 앱을 배포해보면서 이러한 워크로드들이 어떻게 사용되는지 알아보자. 이를 위해서 Helm과 Helm Chart에 대해서 배우게 된다.
Helm은 Kubernetes 애플리케이션을 관리하기 위한 패키지 매니저다.
Helm을 사용하면 애플리케이션을 패키지로 만들고 배포할 수 있다. Helm은 차트(Chart) 라는 디렉토리 구조로 이루어진 패키지를 사용한다.
Helm Chart는 Kubernetes 애플리케이션을 설치, 업그레이드 및 관리하기 위한 정의들을 포함하는 패키지이다.
이 차트는 YAML 파일로 정의되며, Kubernetes 오브젝트들을 설명하고 애플리케이션의 설정, 서비스, 디플로이먼트 등을 정의한다. Helm Chart를 사용하면 애플리케이션을 쉽게 패키지화하고 배포할 수 있으며, 버전 관리 및 롤백과 같은 기능도 제공한다.
여기서 중요한 것은 Helm chart인데, 이때 까지 우리가 어떤 앱을 배포하려면 replica set 및 파드 업데이트를 담당하는 deployment, 외부 네트워크와 통신을 관리하는 service, 클러스터 내 데이터 저장과 관련된 pv, pvc, statefulsets와 같은 yaml 파일을 모두 명세해야했다.
공식문서에 소개된 StatefulSets를 보면
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # has to match .spec.template.metadata.labels
serviceName: "nginx"
replicas: 3 # by default is 1
minReadySeconds: 10 # by default is 0
template:
metadata:
labels:
app: nginx # has to match .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: registry.k8s.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "my-storage-class"
resources:
requests:
storage: 1Gi
이 정도이니... 저런 여러개의 yaml 파일을 작성하는게 얼마나 번거롭고 힘든 일인지 알 것이다.
이렇게 앱 배포에 필요한 yaml파일들을 관리자가 늘 작성하는 것이 아니라 패키징해서 모아놓고 다운받을 수 있게 해놓은 것이 Helm Chart이다.
실습을 해보면 어떤 의미인지 와닿을 수 있다!
Mysql을 정석 방법으로 배포하려면 StatefulSets, PV, PVC, headless service 등을 모두 명세해야한다. 그럴 필요 없이 Helm Chart에서 제공하는 mysql 차트를 사용해보자.
가장 먼저 helm-test 라는 이름의 네임스페이스를 만들어주자
kubectl create ns helm-test
** 네임스페이스: 쿠버네티스 클러스터 내에서 리소스들을 구분해서 사용하기 위한 격리된 공간 (가상 클러스터)
아래 명령어를 통해서 helm-test 네임스페이스에 mysql-helm 이름으로 파드를 배포한다. {}친 부분에는 따로 텍스트를 넣으면 된다.
helm install mysql-helm bitnami/mysql --namespace=helm-test --set mysqlRootPassword={your_password},mysqlUser={your_UserName},mysqlPassword={your_password},mysqlDatabase=test_db
** bitnami는 어플리케이션 솔루션들을 다양한 환경에 쉽게 설치할 수 있게 패키지를 만들어 배포해주는 회사이다. bitnami사에서 만든 mysql helm chart를 사용한다.
mysql-helm: 설치할 Helm 차트의 이름
bitnami/mysql: Helm 차트의 저장소 주소
--namespace=helm-test: MySQL을 설치할 쿠버네티스 네임스페이스 지정 옵션
--set: Helm 차트의 설정 값을 지정하는 옵션
mysqlRootPassword=wkd@465132: MySQL의 root 계정 비밀번호를 지정하는 옵션
mysqlUser=jisujang: MySQL에 접근할 수 있는 사용자 이름을 지정하는 옵션
mysqlPassword=wkd@465132: MySQL에 접근할 수 있는 사용자의 비밀번호를 지정하는 옵션
mysqlDatabase=test_db: MySQL 데이터베이스의 이름을 지정하는 옵션
배포하자마자 네임스페이스에 생기는것을 알 수 있다.

아래 코드를 통해 루트 사용자 비밀번호를 얻는다.
kubectl get secret --namespace helm-test mysql-helm -o jsonpath="{.data.mysql-root-password}" | base64 --decode
zhldSjKJac% 이런형태로 나오는데 %앞에 글자들이 비밀번호이다.

비밀번호를 얻었으면 아래처럼 todo-app의 deployment 파일에서 mysql env 변수들을 수정한다.
host는 helm chart로 배포할 때 사용했던 이름을 사용하고 비밀번호는 방금 얻었던 것, 그리고 접속 db는 helm chart 설치시 기본으로 제공되는 my_database를 사용한다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: todo-app
spec:
replicas: 3
selector:
matchLabels:
app: todo-app
template:
metadata:
labels:
app: todo-app
spec:
containers:
- name: node-app
image: jjrk/docker_tutorial
workingDir: /app
command: ["sh", "-c"]
args:
- "yarn install && yarn run dev"
ports:
- containerPort: 3000
env:
- name: MYSQL_HOST
value: "mysql-helm" # 배포한 MySQL 파드 이름
- name: MYSQL_USER
value: "root"
- name: MYSQL_PASSWORD
value: "OnOJGdH7Lv" # MySQL 루트 사용자 비밀번호
- name: MYSQL_DB
value: "my_database"
apiVersion: v1
kind: Service
metadata:
name: todo-app
spec:
selector:
app: todo-app
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: LoadBalancer
이후에는 이전에 했던 것처럼 변경된 deployment와 service를 배포하자
kubectl apply -f deployment.yaml -n helm-test
kubectl apply -f service.yaml -n helm-test
k9s를 이용해 배포된 파드 내 컨테이너 로그를 조회해본다. mysql-helm에 연결되었다는 것을 볼 수 있다!

그 후 아래 코드로 todo-app에 접속해보자
minikube service todo-app -n helm-test
아래 처럼 접속이 잘되고 데이터도 넣을 수 있다.

다시 mysql에 접속한 다음 my_database 내의 todo_items 테이블을 조회해보자
kubectl exec -it mysql-second-0 -n helm-test -- /bin/bash
mysql -u root -p
use my_databases;
select * from todo_items
** mysql에 접속할 때는 이전에 deployment에 명세했던 비밀번호를 입력하면 된다.

Helm Chart는 app 배포에 필요한 여러 work load resouce yaml 파일들을 포함하는 패키지이다. 이를 통해 쉽게 새로운 앱을 배포할 수 있다.
Helm 공식문서