DevOps/Kubernetes

[Kubernetes] Helm의 개요, 설치 및 사용법

TTOII 2022. 6. 8. 11:40
728x90

🚀 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에 대신 요청해준다.

 

Helm 3 아키텍처

하지만 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
728x90