Helm Hands On

on under devops
7 minute read

Install Helm CLI

# for Mac
$ brew install helm

# other linux
$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
$ chmod 700 get_helm.sh     (== chmod +x get_helm.sh)
$ ./get_helm.sh

$ helm version

Install Helm Chart

# add repo
$ helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories
$ helm repo list
NAME    URL
bitnami https://charts.bitnami.com/bitnami

## remove repo
$ helm repo remove [repo-name]

# search repo
$ helm search repo bitnami
...

# helm install [name] [chart] [flags]
$ helm install my-release bitnami/wordpress
NAME: my-release
LAST DEPLOYED: Tue Jan 16 22:11:03 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: wordpress
CHART VERSION: 19.1.0
APP VERSION: 6.4.2

** Please be patient while the chart is being deployed **
...

# helm 조회
$ helm ls
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART             APP VERSION
my-release      default         1               2024-01-16 22:11:03.908208464 +0900 KST deployed        wordpress-19.1.0  6.4.2

$ kubectl get po
NAME                                     READY   STATUS    RESTARTS   AGE
my-release-mariadb-0                     0/1     Pending   0          8m35s
my-release-wordpress-bd87c998b-p7lz9     0/1     Pending   0          8m36s

$ kubectl get cm
NAME                 DATA   AGE
kube-root-ca.crt     1      22d
my-release-mariadb   1      9m46s

$ kubectl get svc
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
kubernetes             ClusterIP      10.96.0.1       <none>        443/TCP                      22d
my-release-mariadb     ClusterIP      10.104.108.96   <none>        3306/TCP                     10m
my-release-wordpress   LoadBalancer   10.104.88.7     <pending>     80:31380/TCP,443:31234/TCP   10m

$ kubectl get pvc
NAME                        STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
data-my-release-mariadb-0   Pending                                                     10m
my-release-wordpress        Pending                                                     10m

$ kubectl get secret
NAME                               TYPE                 DATA   AGE
my-release-mariadb                 Opaque               2      11m
my-release-wordpress               Opaque               1      11m
sh.helm.release.v1.my-release.v1   helm.sh/release.v1   1      11m

## minikube로 실행시 tunnel을 통해 external ip를 생성할 수 있다.
$ minikube tunnel
$ kubectl get svc

Upgrade Helm Chart

# helm upgrade [release] [chart] [flags]
# ex) helm upgrade -f myvalues.yaml -f override.yaml redis ./redis
# ex) helm upgrade --set foo=bar --set foo=newbar redis ./redis
$ cat myvalues.yaml
replicaCount: 3

$ helm ls
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART             APP VERSION
my-release      default         1               2024-01-16 22:11:03.908208464 +0900 KST deployed        wordpress-19.1.0  6.4.2

$ helm upgrade my-release bitnami/wordpress -f myvalues.yaml
Release "my-release" has been upgraded. Happy Helming!
NAME: my-release
LAST DEPLOYED: Tue Jan 16 22:39:49 2024
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
CHART NAME: wordpress
CHART VERSION: 19.1.0
APP VERSION: 6.4.2

** Please be patient while the chart is being deployed **
...

$ kubectl get po
NAME                                     READY   STATUS    RESTARTS   AGE
my-release-mariadb-0                     0/1     Pending   0          29m
my-release-wordpress-bd87c998b-6hmbf     0/1     Pending   0          22s
my-release-wordpress-bd87c998b-mj9gc     0/1     Pending   0          22s
my-release-wordpress-bd87c998b-p7lz9     0/1     Pending   0          29m

$ helm ls
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART             APP VERSION
my-release      default         2               2024-01-16 22:39:49.207040692 +0900 KST deployed        wordpress-19.1.0  6.4.2

$ kubectl get deploy
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
my-release-wordpress     0/3     3            0           31m

## revision을 secret으로 따로 관리한다.
## rollback시 이를 사용하여 복구한다.
$ kubectl get secret
NAME                               TYPE                 DATA   AGE
my-release-mariadb                 Opaque               2      32m
my-release-wordpress               Opaque               1      32m
sh.helm.release.v1.my-release.v1   helm.sh/release.v1   1      32m
sh.helm.release.v1.my-release.v2   helm.sh/release.v1   1      3m37s

# release가 가지고 있는 값 조회
# helm get [command]
## command: all, hooks, manifest, notes, values
$ helm get values my-release
USER-SUPPLIED VALUES:    # user가 추가한 값. 기본과 다르다는 것을 알 수 있음
replicaCount: 3

## revision을 명시하여 바뀐 점을 알 수 있다.
$ helm get values my-release --revision 1
USER-SUPPLIED VALUES:
null

# revision의 다른 점을 조회하는 diff 플러그인이 있다.
## diff 플러그인 설치
$ helm plugin install https://github.com/databus23/helm-diff
# helm diff [command]
## command: release, revision, rollback, upgrade, version
$ helm diff revision my-release 1 2
default, my-release-wordpress, Deployment (apps) has changed:
...
    strategy:
      type: RollingUpdate
-   replicas: 1
+   replicas: 3
    template:
...

RollBack Helm Chart

$ helm ls
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART             APP VERSION
my-release      default         2               2024-01-16 22:39:49.207040692 +0900 KST deployed        wordpress-19.1.0  6.4.2

$ cat myvalues.yaml
replicaCount: 3

# helm history
$ helm history my-release
REVISION        UPDATED                         STATUS          CHART                   APP VERSION     DESCRIPTION
1               Tue Jan 16 22:11:03 2024        superseded      wordpress-19.1.0        6.4.2           Install complete
2               Tue Jan 16 22:39:49 2024        deployed        wordpress-19.1.0        6.4.2           Upgrade complete

# helm rollback <release> [revision]
## --dry-run : 실제로 수행하지 않고 수행되었을 때의 결과만 알려준다.
$ helm rollback my-release 1 --dry-run
Rollback was a success! Happy Helming!
$ helm rollback my-release 1
Rollback was a success! Happy Helming!
$ helm history my-release
REVISION        UPDATED                         STATUS          CHART                   APP VERSION     DESCRIPTION
1               Tue Jan 16 22:11:03 2024        superseded      wordpress-19.1.0        6.4.2           Install complete
2               Tue Jan 16 22:39:49 2024        superseded      wordpress-19.1.0        6.4.2           Upgrade complete
3               Wed Jan 17 08:12:24 2024        deployed        wordpress-19.1.0        6.4.2           Rollback to 1
## revision 1과 같은 상태인 것을 알 수 있다.
$ helm get values my-release --revision 3
USER-SUPPLIED VALUES:
null
$ kubectl get deploy
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
my-release-wordpress     0/1     1            0           10h
nfs-client-provisioner   1/1     1            1           17d
$ kubectl get po
NAME                                     READY   STATUS    RESTARTS   AGE
my-release-mariadb-0                     0/1     Pending   0          10h
my-release-wordpress-bd87c998b-p7lz9     0/1     Pending   0          10h

Delete Helm Chart

# helm uninstall
## alias: uninstall, del, delete, un
## --key-history : 자원을 모두 지우지만, 지우는 것도 revision으로 관리하여 복구할 수 있다.(secret 유지)
$  helm delete my-release --keep-history
release "my-release" uninstalled
# 관련 자원들이 모두 삭제되었다.
$ helm ls
NAME    NAMESPACE       REVISION        UPDATED STATUS  CHART   APP VERSION
$ kubectl get po
No resources found in default namespace.
$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   22d
$ kubectl get cm
NAME               DATA   AGE
kube-root-ca.crt   1      22d

# history를 조회하면 revision이 secret을 통해 관리되고 있다.
$  helm history my-release
REVISION        UPDATED                         STATUS          CHART                   APP VERSION     DESCRIPTION
1               Tue Jan 16 22:11:03 2024        superseded      wordpress-19.1.0        6.4.2           Install complete
2               Tue Jan 16 22:39:49 2024        superseded      wordpress-19.1.0        6.4.2           Upgrade complete
3               Wed Jan 17 08:12:24 2024        superseded      wordpress-19.1.0        6.4.2           Rollback to 1
4               Wed Jan 17 08:19:16 2024        uninstalled     wordpress-19.1.0        6.4.2           Uninstallation complete
$ kubectl get secret
NAME                               TYPE                 DATA   AGE
sh.helm.release.v1.my-release.v1   helm.sh/release.v1   1      10h
sh.helm.release.v1.my-release.v2   helm.sh/release.v1   1      9h
sh.helm.release.v1.my-release.v3   helm.sh/release.v1   1      14m
sh.helm.release.v1.my-release.v4   helm.sh/release.v1   1      7m23s

## 다시 rollback
$ helm history my-release
REVISION        UPDATED                         STATUS          CHART                   APP VERSION     DESCRIPTION
1               Tue Jan 16 22:11:03 2024        superseded      wordpress-19.1.0        6.4.2           Install complete
2               Tue Jan 16 22:39:49 2024        superseded      wordpress-19.1.0        6.4.2           Upgrade complete
3               Wed Jan 17 08:12:24 2024        superseded      wordpress-19.1.0        6.4.2           Rollback to 1
4               Wed Jan 17 08:19:16 2024        uninstalled     wordpress-19.1.0        6.4.2           Uninstallation complete
5               Wed Jan 17 08:29:18 2024        deployed        wordpress-19.1.0        6.4.2           Rollback to 4
$ kubectl get po
NAME                                     READY   STATUS    RESTARTS   AGE
my-release-mariadb-0                     0/1     Pending   0          23s
my-release-wordpress-bd87c998b-5lbqz     0/1     Pending   0          23s
my-release-wordpress-bd87c998b-fmsbq     0/1     Pending   0          23s
my-release-wordpress-bd87c998b-gj26p     0/1     Pending   0          23s

## namespace를 지우면 해당 secret 및 revision도 삭제된다.
# 완전 삭제
## 복구 불가
$ helm ls
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
my-release      default         5               2024-01-17 08:29:18.617890062 +0900 KST deployed        wordpress-19.1.0        6.4.2
$ helm delete my-release
release "my-release" uninstalled
$ helm ls
NAME    NAMESPACE       REVISION        UPDATED STATUS  CHART   APP VERSION
$ helm history my-release
Error: release: not found
$ kubectl get secret
No resources found in default namespace.
k8s, helm
comments powered by Disqus