helm에 대해서 알아보도록 하자. 모든 정보들은 공식 docs를 기반으로한다.
https://helm.sh/ko/docs/intro/quickstart/
helm을 설치하기 이전에 kubernetes cluster가 구축되어있고 kubernetes에 대한 기본적인 지식이 있음을 가정으로 한다.
helm은 기본적으로 두 가지 설치 방법을 제공하고, 이외에는 각 os별 package manager(apt, snap, homebrew etc)에 따라 다르다.
https://github.com/helm/helm/releases
해당 페이지에서 원하는 버전을 다운로드 한 뒤에 tar
로 압축을 풀고 원하는 디렉터리에 넣는 것이 끝이다.
1. 원하는 버전 설치
2. 압축 해제(tar -zxvf helm~~~.tar.gz
)
3. 해제된 디렉터리에서 helm
바이너리를 찾아 원하는 목적지로 이동시킨다. (mv linux-amd64/helm /usr/local/bin/helm
)
이후 helm client를 구동하고 저장소를 추가할 수 있어야 한다.
최신 버전을 자동으로 가져와 로컬에 설치하는 인스톨러 스크립트를 사용하는 방법이다.
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이 설치되었다면 repository를 추가할 수 있다.
https://artifacthub.io/packages/search?kind=0
해당 페이지에서 helm chart repository를 볼 수 있다.
bitnami
chart를 가져와보자.
helm repo add bitnami https://charts.bitnami.com/bitnami
잘 가져와졌는 지 확인해보도록 하자.
helm repo list
NAME URL
bitnami https://charts.bitnami.com/bitnami
local helm에 repo가 추가된 것을 볼 수 있다. 다음으로, 해당 repo안에 있는 chart들을 보도록 하자.
helm search repo bitnami
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/airflow 14.2.5 2.6.1 Apache Airflow is a tool to express and execute...
bitnami/apache 9.6.3 2.4.57 Apache HTTP Server is an open-source HTTP serve...
bitnami/apisix 1.0.1 3.3.0 Apache APISIX is high-performance, real-time AP...
...
chart를 설치하기 위해서는 helm install
명령어를 사용한다.
bitnami
repo의 mysql
chart를 설치하고자 하면 다음과 같이하면 된다.
helm repo update
helm install bitnami/mysql --generate-name
...
NAME: mysql-1687168334
LAST DEPLOYED: Mon Jun 19 18:52:15 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: mysql
CHART VERSION: 9.10.4
APP VERSION: 8.0.33
...
chart를 통해서 release를 만들게 되었고, 이름은 mysql-1687168334
이다.
해당 chart에 대한 자세한 정보를 보기위해서는 helm show chart
를 사용하면 된다. 또는 모든 정보를 보려면 helm show all bitnami/mysql
를 실행하면 된다. 아마 README 페이지가 나오게 된다.
chart를 설치할 때마다 새로운 release가 생성된다. 따라서 하나의 chart를 동일한 클러스터에 여러 번 설치할 수 있다. 또한, 각각을 독립적으로 관리, 업그레이드 할 수 있다.
repo는 chart를 담고, chart는 하나의 거푸집으로 release를 만들어낸다. 이 release는 kubernetes object들로 이루어져 있다. helm list
, helm ls
는 배포된 모든 release 목록을 보여준다. 단, namespace가 기본적으로 default이기 때문에 namespace와 관련없이 모든 release를 가져오고 싶다면 -A
옵션을 붙이면 된다.
helm list -A
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mysql-1687168334 default 1 2023-06-19 18:52:15.905483641 +0900 KST deployed mysql-9.10.4 8.0.33
또한, helm chart는 kubernetes object들로 이루어져 있기 때문에 kubectl get po나 kubectl get svc에 보인다.
kubectl get svc -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 111d
default mysql-1687168334 ClusterIP 10.108.114.134 <none> 3306/TCP 13m
default mysql-1687168334-headless ClusterIP None <none> 3306/TCP 13m
mysql
과 관련된 svc
가 보인다.
kubectl get pod -A
로 helm chart의 release pod를 가져올 수 있다.
kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
default mysql-1687168334-0 0/1 Pending 0 14m
helm uninstall
명령어를 사용하면 해당 release와 관련된 모두를 지운다.
helm uninstall mysql-1687168334
...
release "mysql-1687168334" uninstalled
release가 사라지고 release와 관련된 모든 리소스들이 사라지게 된다. --keep-history
플래그를 제공하면 release 이력은 유지되며 release에 대한 정보를 요청할 수 있다.
정리하면 다음과 같다.
|----------------------------repository----------------------------|
| |
| |--chart--| |--chart--| |--chart--| |--chart--| |
| | | | | | | | | | ----helm install repo/chart---> release
| |---------| |---------| |---------| |---------| |
|------------------------------------------------------------------|
helm search
는 특정 chart를 검색할 수 있는데, 여러 repo들이 있는 hub에서 검색하는 기능과 repo안에 있는 chart를 검색하는 기능이 있다.
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
https://artifacthub.io/packages/helm/bitnami-ak... 15.2.13 6.1.0 WordPress is the world's most popular bloggin
...
helm search hub
는 여러 repo들이 있는 hub에서 chart를 검색하므로 서로 다른 repository에 있는 chart들이 나온다.
helm search repo wordpress
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/wordpress 16.1.15 6.2.2 WordPress is the world's most popular blogging ...
bitnami/wordpress-intel 2.1.31 6.1.1 DEPRECATED WordPress for Intel is the most popu...
helm search repo
는 local repo에서 해당 chart가 있는 지 검색한다.
참고로 helm search
는 문자열 매칭 알고리즘을 사용하기 때문에 일부만 입력해도 검색된다. 가령, 위의 예제에서 wordpress
만 입력했는데도 wordpress-intel
이 나왔다.
helm install
로 chart(패키지)를 설치하기 이전에 해당 chart가 있는 지 없는 지 검색하기 가장 좋은 방법인 것이다.
chart(패키지)를 설치하여 release를 만드려면 helm install
명령어를 사용하면 된다. 인수는 다음과 같다.
helm install <release-name> <repo/chart>
가령 release-name
은 happy-panda
이고 repo
는 stable
이며 chart
는 mariadb
면 다음가 같다.
helm install happy-panda bitnami/mariadb
mariadb
차트가 설치되어 release 오브젝트가 생성되었다. 만약, 헬름이 자동으로 부여해주는 이름을 사용하려면 release에 이름을 넣지말고 --generate-name
을 사용하면 된다.
helm
은 해당 chart가 설치될 때까지 기다리지 않는다. 따라서 만약 release의 상태 추적을 계속하거나 구성 정보를 확인하고 싶다면 helm status
를 사용하도록 하자.
helm status happy-panda
NAME: happy-panda
LAST DEPLOYED: Mon Jun 19 19:36:19 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: mariadb
CHART VERSION: 12.2.5
APP VERSION: 10.11.4
조심해야할 것은 helm도 namespace개념이 적용된다는 것이다. 따라서 명령어를 칠 때마다 유념하도록 하자.
chart의 configuration value들을 수정하여 원하는대로 배포할 수 있다.
차트에 어떤 옵션이 configuration 가능한 지 보려면 helm show values
를 사용하면 된다. 해당 명령어는 chart의 values.yaml 파일을 값들을 보여준다.
helm show values bitnami/mariadb
...
## @param networkPolicy.egressRules.denyConnectionsToExternal Enable egress rule that denies outgoing traffic outside the cluster, except for DNS (port 53).
## @param networkPolicy.egressRules.customRules Custom network policy rule
##
egressRules:
# Deny connections to external. This is not compatible with an external database.
denyConnectionsToExternal: false
## Additional custom egress rules
## e.g:
## customRules:
## - to:
## - namespaceSelector:
## matchLabels:
## label: example
##
customRules: {}
수많은 configuration들이 나오게 된다.
yaml 형식으로 만들어진 해당 설정 파일을 오버라이드하여 설치 시에 반영시킬 수 있다.
echo '{mariadbUser: user0, mariadbDatabase: user0db}' > config.yaml
helm install -f config.yaml bitnami/mariadb --generate-name
mariadbUser
와 mariadbDatabase
를 각각 user0
와 user0db
로 설정하도록 하는 config.yaml
파일을 만들고 이를 bitnami/mariadb
chart install 시에 적용하도록 하는 것이다.
-f
옵션으로 bitnami/mariadb
의 values.yaml을 오버라이드하는 것이다.
설정하지 않은 옵션들은 나머지 옵션들로 설정된다.
install 작업에 configuration data를 전달하는 방법에는 두 가지가 있다.
--values ( -f)
: 오버라이드할 yaml 파일을 지정한다.--set
: 바로 해당 configuration value를 오버라이드한다.둘 다 사용하면 --set
이 더 우선순위를 갖게된다. helm get values <release-name>
로 해당 release에 대한 --set
설정값들을 조회할 수 있다. --set
설정 값들은 helm upgrade
를 실행할 때 --reset-values
를 명시하여 제거할 수 있다.
set
의 사용법은 다음과 같다.
name: value
위의 yaml 표현은 --set name=value
와 같다.
여러 개의 값들은 ,
문자로 구분된다.
a: b
c: d
--set a=b,c=d
가 된다.
내부에 중첩된 경우는 다음과 같다.
outer:
inner: value
--set outer.inner=value
가 된다.
리스트는 {,}
를 사용하여 표현한다.
name:
- a
- b
- c
--set name={a,b,c}
과 같다.
배열 인덱스 문법으로 특정 인덱스의 값을 설정할 수 있다.
servers:
- port: 80
--set servers[0].port=80
이 된다.
특수문자를 써야할 때는 백슬래시(\
)를 사용하면 된다.
name: "value1,value2"
--set name=value1\,value2
가 된다.
사실 복잡한 경우는 values.yaml
을 사용하는 것이 좋다.
helm install
명령어를 사용하여 여러 소스에서 설치를 수행할 수 있다. 위는 차트 저장소를 사용한 방법이다.
helm install foo foo-0.1.1.tgz
)helm install foo path/to/foo
)helm install foo https://example.com/charts/foo-1.2.3.tgz
)새로운 버전의 chart가 나왔을 때 또는 release의 구성을 변경하고자 할 때 helm upgrade
명령어를 사용할 수 있다.
upgrade는 현존하는 release를 가지고 사용자가 입력한 정보에 따라 업그레이드한다. 최근 것에서 변경된 것들만 업그레이드하는 특징이 있다.
먼저 panda.yaml
파일을 만들어 특정 configuration 값을 변경하도록 하자.
mariadbUser: user1
auth:
rootPassword: root
mariadbUser
를 user
으로 바꾸고 auth.rootPassword
를 root
로 변경하는 파일이다.
helm upgrade -f panda.yaml happy-panda bitnami/mariadb
...
Release "happy-panda" has been upgraded. Happy Helming!
NAME: happy-panda
LAST DEPLOYED: Mon Jun 19 20:02:52 2023
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
CHART NAME: mariadb
CHART VERSION: 12.2.5
APP VERSION: 10.11.4
해당 설정이 잘 적용되었는 지 보기위해서 helm get values <release-name>
을 사용해보도록 하자.
helm get values happy-panda
USER-SUPPLIED VALUES:
auth:
rootPassword: root
mariadbUser: user1
잘 적용되었다. 참고로 get values
는 기존의 값에서 달라진 부분만 보여준다. 즉, user가 설정한 value만 보인다. 나머지 부분들은 기본 default 값으로 설정된다는 것이다.
만약 적용한 release가 생각 외로 너무 배포가 안된다면 rollback할 수 있다.
helm rollback [release-name] [revision]
revision은 맨 처음에는 1이고, upgrade할 때마다 1씩 올라간다. 특정 release의 revision 번호를 확인하기위해서 helm history [release-name]
을 사용할 수 있다.
happy-panda
의 revision을 확인하면 다음과 같다.
helm history happy-panda
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Mon Jun 19 20:08:25 2023 superseded mariadb-12.2.5 10.11.4 Install complete
2 Mon Jun 19 20:08:30 2023 deployed mariadb-12.2.5 10.11.4 Upgrade complete
만약 revision 1으로 다시 돌아가고 싶다면 다음과 같이하면 된다.
helm rollback happy-panda 1
대표적인 cli 옵션들을 나열하면 다음과 같다.
--timeout
: kubernetes 명령어가 완료되기를 기다리는 시간으로 기본적으로 5m 0s
이다.--wait
: release가 성공적이었다고 기록하기전에, 모든 pod들이 준비 상태가 되고 pvc들이 연결되며 deployment가 최소한의 준비상태 pod 수를 갖추며 service들이 IP를 가질 때까지 기다린다. 타임아웃이 지났는데도 release가 준비되지 못하면 FAILED
로 기록된다.--no-hooks
: 명령어에 대한 hook작동을 생략한다.cluster 내에서 release를 uninstall하고자 할 때 helm uninstall <release-name>
을 사용한다.
happy-panda
를 uninstall하고 싶다면 다음과 같다.
helm uninstall happy-panda
helm3 이전에는 삭제시 release 기록이 남았지만, 이제는 남지않는다. 만약 삭제 release 기록을 보고 싶다면 helm unstall --keep-history
명령어로 삭제하도록 하자. 이후 helm list --uninstalled
를 사용하면 --keep-history
로 삭제된 release들의 기록을 볼 수 있다.
helm list --all
는 실패하거나 삭제(--keep-history
로 지정된 경우만)된 기록을 포함하여 헬름이 가지고 있는 모든 release 기록들을 보여준다.
helm3는 더 이상 기본 chart 저장소를 제공하지 않는다. helm repo
명령어는 저장소(repo)를 추가, 목록 조회, 제거하는 기능을 제공한다.
helm repo list
를 사용하여 어떤 저장소들이 있는 지 확인할 수 있다.
helm repo list
NAME URL
bitnami https://charts.bitnami.com/bitnami
helm repo add <repo-name> <repo-URL>
로 새 저장소들을 추가할 수 있다.
helm repo add dev https://example.com/dev-charts
chart repo는 자주 바뀌므로 helm repo update
를 실행하여 언제든 헬름 클라이언트를 업데이트하도록 하자.
helm repo remove
로 저장소들을 삭제할 수 있다.
https://helm.sh/docs/topics/charts/
해당 페이지에서 자세하게 chart를 만드는 방법을 제공하지만 helm create
명령러로 빠르게 만들어볼 수 있다.
가령 my-workflow
repo를 만들어보도록하자
helm create my-workflow
해당 path에서 ./my-workflow
디렉터리가 생겼을 것이다. 여기서 생성된 차트를 편집하거나 템플릿을 생성할 수 있다.
helm init
을 통해 형식을 검증할 수 있다.
배포용 차트로 패키징(tgz)로 만들고 싶다면 helm package
를 사용한다.
helm package my-workflow
my-workflow-0.1.0.tgz
이후에 해당 패키지로 설치가 가능하다.
helm install my-workflow ./my-workflow-0.1.0.tgz