[Kubernetes] Helm의 개요, 설치 및 사용법
🚀 Helm이란 ?!
우리가 정상적으로 동작하는 서비스를 구축하기 위해서는 수많은 쿠버네티스 오브젝트들이 필요하다.
이런 모든 것들을 모아서 하나로 패키지로 관리하기위한 것이 Helm
이다.
쉽게 얘기해서 Helm은 yaml 파일의 모음이다. 이것은 곧 쿠버네티스의 패키지이다.
Helm
은 2버전과 3버전이 있다.
2버전은 더이상 개발하지 않으나 많은 책이나 문서에는 2버전으로 되어있다.
명령어도 다르고 아키텍처 구조도 달라서 호환성이 많이 떨어진다. 현재는 3버전만 사용한다.
Helm
저장소는 다양하게 많이 존재한다. 분산 형태의 저장소를 가지고 있다.
Helm을 활용하면 다른 사람이 만든 어플리케이션도 내 쿠버네티스 클러스터로 쉽게 가져올 수 있다.
🚀 Helm 아키텍처 및 구성 요소
(해당 아키텍처는 지금은 사용하지 않는 아키텍처이다. Helm 버전2의 아키텍처이다.)
🔎 Helm Charts : 패키지 - 여러개의 YAML 파일을 tar.gz 아카이브로 묶어놓은 것Chart
와 패키지라는 용어를 혼용한다.
🔎 Release : 쿠버네티스 오브젝트 리소스 (패키지 → 클러스터에 생성한 인스턴스)
차트로 실제 쿠버네티스 리소스를 만든 것
🔎 Helm Client - Helm 명령어
해당 명령어는 Helm Charts에서 패키지를 가져온다.
kubernetes cluster의 핵심은 API server이다.Tiler
는 Helm의 Server이다. Tiler라는 파드를 띄운다.
클라이언트와 Helm Tiler 파드는 기본적으로 HTTP 기반의 grpc
라는 프로토콜로 통신한다.
Helm 저장소에서 특정 YAML 파일 패키지를 가지고 와서 Tiler에게 전송시킨다.
Tiler에 의해서 API server에 요청한다. (ex. 파드를 만들어라, Deployment
를 만들어라, 변경하라, 삭제하라 등)
즉, Tiler가 API server에 대신 요청해준다.
하지만 Tiler는 3버전에서 사용하지 않는다.
리소스를 생성하기 위해 API server에 모든 권한을 가지고 요청해야한다. → 즉, Tiler가 모든 권한을 다 갖고 있어야 한다.
문제점은 Tiler가 외부에 노출되어있어야 한다는 것이다.
막강한 권한을 가진 Tiler가 외부에 노출되어 있다 ? → 보안 사고가 일어나기 쉽다.
이러한 방식은 구조적으로 문제가 있다고 생각해 Tiler를 없앴다.
3버전에서는 클라이언트가 바로 API server에 요청한다. (kubectl
도 직접 권한을 갖고 API server에 접근하는 방식이다.)
🚀 Helm client 설치
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm
다음 명령어를 순차적으로 실행한다.
❯ helm version
version.BuildInfo{Version:"v3.9.0", GitCommit:"7ceeda6c585217a19a1131663d8cd1f7d641b2a7", GitTreeState:"clean", GoVersion:"go1.17.5"}
설치 완료가 되면 버전 정보가 출력된다.
~/.zshrc
plugins=(
helm
)
oh-my-zsh을 사용한다면 helm
플러그인 추가 후 터미널을 재시작한다.
Artifact Hub - Helm Chart를 검색할 수 있다. (저장소의 기능 X)
wordpress Chart를 검색해보자
- ORG : 차트를 만든 회사나 개인
- REPO : 사용하는 레포지토리
- VERSION : 차트의 버전
- APP VERSION : 이미지화 시켜놓은 파드에 들어갈 App의 버전(ex wp의 버전)
Helm 레포지토리는 보통 github을 사용한다.
신뢰할 수 있는 차트인지 확인하기 위해서는 별점, ORG, 업데이트 주기, Verified Publisher 등을 확인하자
🚀 차트 구조
차트는 기본 구조를 가진다.
ansible
에서 역할의 구조가 정해진 것처럼 차트의 구조가 정해져있다.
<Chart Name>/
Chart.yaml
values.yaml
templates/
차트 이름으로 된 디렉토리 하위에는 반드시 필요한 파일 몇가지가 있다.
- Chart.yaml: 차트의 메타데이타
- values.yaml: 패키지를 커스터마이즈/사용자화(벨류)
- k8s chart는 컨트롤러의 이름을 어떻게 할 것인지 복제본은 몇개를 만들 것인지 값을 제공해야 한다.
- YAML 형식으로 변수를 세팅
- ex) 어떤 이미지를 사용할 것인가에 대한 정보를 설정
- 환경 변수 설정
- templates: YAML 오브젝트 파일
의존성 패키지, 패키지의 위치, 검색 키워드, 유지보수 하는 사람, 버전 등이 적혀있다.
🚀 Helm 사용법
aritifacthub 검색
helm search hub <PATTERN>
저장소 검색
helm search repo wordpress
- hub : aritifacthub에서 찾는다.
- repo : 연결한 레포지토리에서 찾는다.
예시
❯ helm search hub wordpress
URL CHART VERSION APP VERSION DESCRIPTION
https://artifacthub.io/packages/helm/kube-wordp... 0.1.0 1.1 this is my wordpress package
❯ helm search repo wordpress
Error: no repositories configured
repo로 찾을 때는 연결된 레포지토리가 있어야 한다.
❯ helm search repo wordpress
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/wordpress 14.3.1 5.9.3 WordPress is the world's most popular blogging ...
bitnami/wordpress-intel 1.3.1 5.9.3 WordPress for Intel is the most popular bloggin...
레포지토리 연결 후 찾을 수 있다. 레지스트리를 어떤 이름으로 등록하느냐에 따라 패키지 이름이 달라진다.
저장소 추가
helm repo add bitnami https://charts.bitnami.com/bitnami
차트 정보 업데이트
helm repo update bitnami https://charts.bitnami.com/bitnami
차트 리스트 출력
helm repo list
차트 삭제
helm repo remove bitnami https://charts.bitnami.com/bitnami
예시
❯ helm repo list
Error: no repositories to show
❯ helm repo add wordpress https://charts.bitnami.com/bitnami
"wordpress" has been added to your repositories
❯ helm repo list
NAME URL
wordpress https://charts.bitnami.com/bitnami
❯ helm repo remove wordpress https://charts.bitnami.com/bitnami
"wordpress" has been removed from your repositories
❯ helm repo list
Error: no repositories to show
차트 설치
helm install mywordpress bitnami/wordpress
❯ helm install mywordpress bitnami/wordpress
NAME: mywordpress
LAST DEPLOYED: Sat May 28 04:01:53 2022
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: wordpress
CHART VERSION: 14.3.1
APP VERSION: 5.9.3
...
❯ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/mywordpress-6b67dfffbb-v6667 1/1 Running 0 5m55s
pod/mywordpress-mariadb-0 1/1 Running 0 5m55s
릴리즈 확인
helm list
❯ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mywordpress kube-system 1 2022-05-28 04:01:53.003579009 +0000 UTC deployed wordpress-14.3.1 5.9.3
릴리즈 상태 확인
helm status RELEASE_NAME [flags]
릴리즈의 버전이나 노트 정보를 볼 수 있다.
릴리즈 삭제
helm uninstall mywordpress
❯ helm uninstall mywordpress
release "mywordpress" uninstalled
❯ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
❯ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/nfs-client-provisioner-758f8cd4d6-wpjbt 1/1 Running 0 3d23h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 4d15h
service/mysql ClusterIP None <none> 3306/TCP 3d1h
service/mysql-read ClusterIP 10.233.11.154 <none> 3306/TCP 3d1h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nfs-client-provisioner 1/1 1 1 3d23h
NAME DESIRED CURRENT READY AGE
replicaset.apps/nfs-client-provisioner-758f8cd4d6 1 1 1 3d23h
helm list에서도 삭제되며 리소스까지 삭제된다.
차트 정보 확인
helm show readme binami/wordpress
helm show chart binami/wordpress
helm show values binami/wordpress
차트 사용자화
helm install mywp bitnami/wordpress --set replicaCount=2
helm install mywp bitnami/wordpress --set replicaCount=2 --set service.type=NodePort
❯ kubectl get po
NAME READY STATUS RESTARTS AGE
mywp-mariadb-0 0/1 CrashLoopBackOff 1 (17s ago) 28s
mywp-wordpress-7f846bbcbb-8kvjk 0/1 Running 0 28s
mywp-wordpress-7f846bbcbb-vlt2c 0/1 Running 0 28s
nfs-client-provisioner-758f8cd4d6-wpjbt 1/1 Running 0 3d23h
❯ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 4d15h
mysql ClusterIP None <none> 3306/TCP 3d1h
mywp-wordpress NodePort 10.233.8.130 <none> 80:32476/TCP,443:31217/TCP 31s
2개의 파드와 NodePort
타입의 서비스도 생성되었다.
릴리즈 업그레이드
파일로 제공하는 방법
helm show value bitnami/wordpress > wp-value.yaml
파일 수정
helm upgrade mywp bitnami/wordpress -f wp-value.yaml
❯ helm show values bitnami/wordpress > wp-value.yaml
❯ vi wp-value.yaml # replicas, 서비스 타입 변경
❯ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mywp default 1 2022-05-28 04:27:26.167267594 +0000 UTC deployed wordpress-14.3.1 5.9.3
❯ helm upgrade mywp bitnami/wordpress -f wp-value.yaml
❯ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mywp default 2 2022-05-28 04:33:51.377158949 +0000 UTC deployed wordpress-14.3.1 5.9.3
REVISION이 2로 변경됨 (Deployment
의 REVISION과 연관 없음 주의 !!)
❯ kubectl get po
NAME READY STATUS RESTARTS AGE
mywp-mariadb-0 0/1 CrashLoopBackOff 6 (48s ago) 6m57s
mywp-wordpress-7f846bbcbb-4mz28 0/1 ContainerCreating 0 33s
mywp-wordpress-7f846bbcbb-8kvjk 0/1 Running 4 (88s ago) 6m57s
mywp-wordpress-7f846bbcbb-vlt2c 0/1 Running 4 (76s ago) 6m57s
nfs-client-provisioner-758f8cd4d6-wpjbt 1/1 Running 0 3d23h
❯ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 4d15h
mysql ClusterIP None <none> 3306/TCP 3d1h
mywp-wordpress ClusterIP 10.233.8.130 <none> 80/TCP,443/TCP 7m1s
릴리즈 업그레이드 히스토리
helm history mywp
❯ helm history mywp
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Sat May 28 04:27:26 2022 superseded wordpress-14.3.1 5.9.3 Install complete
2 Sat May 28 04:33:51 2022 deployed wordpress-14.3.1 5.9.3 Upgrade complete
릴리즈 롤백
helm rollback mywp 1
❯ helm rollback mywp 1
Rollback was a success! Happy Helming!
❯ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mywp default 3 2022-05-28 04:36:39.357599511 +0000 UTC deployed wordpress-14.3.1 5.9.3
❯ helm history mywp
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Sat May 28 04:27:26 2022 superseded wordpress-14.3.1 5.9.3 Install complete
2 Sat May 28 04:33:51 2022 superseded wordpress-14.3.1 5.9.3 Upgrade complete
3 Sat May 28 04:36:39 2022 deployed wordpress-14.3.1 5.9.3 Rollback to 1
❯ kubectl get po
NAME READY STATUS RESTARTS AGE
mywp-mariadb-0 0/1 CrashLoopBackOff 6 (3m44s ago) 9m53s
mywp-wordpress-7f846bbcbb-4mz28 0/1 CrashLoopBackOff 1 (17s ago) 3m29s
mywp-wordpress-7f846bbcbb-vlt2c 0/1 Running 5 (2m9s ago) 9m53s
nfs-client-provisioner-758f8cd4d6-wpjbt 1/1 Running 0 3d23h
❯ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 4d15h
mywp-mariadb ClusterIP 10.233.60.215 <none> 3306/TCP 10m
mywp-wordpress NodePort 10.233.8.130 <none> 80:31514/TCP,443:30490/TCP 10m
wp-value2.yaml
replicaCount: 1
service:
type: LoadBalancer
다음과 같이 필요한 부분만 작성해서
helm upgrade mywp bitnami/wordpress -f wp-value2.yaml
업그레이드 할 수 있다.
❯ vi wp-value2.yaml
❯ helm upgrade mywp bitnami/wordpress -f wp-value2.yaml
❯ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mywp default 4 2022-05-28 04:41:12.431957944 +0000 UTC deployed wordpress-14.3.1 5.9.3
❯ helm history mywp
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Sat May 28 04:27:26 2022 superseded wordpress-14.3.1 5.9.3 Install complete
2 Sat May 28 04:33:51 2022 superseded wordpress-14.3.1 5.9.3 Upgrade complete
3 Sat May 28 04:36:39 2022 superseded wordpress-14.3.1 5.9.3 Rollback to 1
4 Sat May 28 04:41:12 2022 deployed wordpress-14.3.1 5.9.3 Upgrade complete
❯ kubectl get po
NAME READY STATUS RESTARTS AGE
mywp-mariadb-0 0/1 CrashLoopBackOff 7 (3m23s ago) 14m
mywp-wordpress-7f846bbcbb-4mz28 0/1 Running 4 (106s ago) 8m15s
nfs-client-provisioner-758f8cd4d6-wpjbt 1/1 Running 0 3d23h
❯ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 4d15h
mysql ClusterIP None <none> 3306/TCP 3d1h
mywp-wordpress LoadBalancer 10.233.8.130 192.168.100.240 80:31514/TCP,443:30490/TCP 14m
패키지 생성
❯ helm create mypkg
Creating mypkg
❯ ls
mypkg wp-value.yaml wp-value2.yaml
❯ cd mypkg
❯ tree
.
├── Chart.yaml
├── charts
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── service.yaml
│ ├── serviceaccount.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
3 directories, 10 files
차트의 기본 구조를 생성해준다.
패키지화
❯ helm package mypkg
Successfully packaged chart and saved it to: /home/vagrant/helm/wordpress/mypkg-0.1.0.tgz
❯ ls
mypkg mypkg-0.1.0.tgz wp-value.yaml wp-value2.yaml
helm install deis-workflow ./deis-workflow-0.1.0.tgz