helm에서의 package 단위는 chart
이다. chart
는 kubernetes application이 설치되어야 할 방법을 보여준다.
chart
는 일련의 file과 directory들로 구성되어있는데 이들은 kubernetes에 설치되어야 할 resource들을 설명하는 chart 사양을 준수한다. 이후에 chart의 구조에 대해서 자세히 알아볼 예정이고, 몇 가지 상위 level concept들을 알아보도록 하자.
chart
는 chart
를 설명하는 Chart.yaml
파일을 가진다. 여기에는 chart
에 대한 chart version, name, description, 저작자 등이 적혀있다.
chart
는 또한 templates
directory를 포함하는데, 여기에는 kubernetes manifests들이 있다. 이 kubernetes manifest들은 golang template문법으로 여러 data들이 annotate되어있다.
chart
는 또한 values.yaml
file을 가질 수 있다. 이 file은 default configuration 값들을 제공하는데, 이 configuration값들을 parameter로 하여 template
directory에 있는 kubernetes manifest들을 설치할 수 있다. 즉, kubernetes manifest에 있는 template문법에서 value를 요구하면 values.yaml
의 값이 거기 들어가게되고, override된다.
정리하자면 helm의 package인 chart
는 하나의 directory로 Chart.yaml
, value.yaml
, file과 templates
directory로 이루어져 있는 것이다. 단지, 이 file과 directory를 tar로 묶고 gzip으로 압축한 것이 전부인 것이다.
chart
들은 chart repositories
에 저장된다. 이는 추후에 다시 알아보도록 하자. helm은 이러한 repository로부터 chart
들을 다운받고 설치하는 방법을 알고 있는 것이다.
helm chart를 이용해 kubernetes object를 설치한다고 할 때, 다음의 과정을 거치게 된다.
즉, helm chart가 kubernetes에 설치되면 kubernetes resource들에 대한 definition이 만들어지고, 이 definition을 kubernetes에 전달하여 kubernetes resource들을 만들어내는 것이다. 동일한 chart
를 매번 다른 이름으로 여러번 설치할 수 있다. 따라서 동일한 kubernetes resource를 여러 개 가질 수 있는 것처럼 동일한 chart에 여러 installation
이 있을 수 있다.
helm
에서 chart를 설치하고 helm upgrade
를 사용하면 이제 해당 installation
에 대해서 두 release가 있게된다. 즉, helm
을 사용하여 installation
을 할 때마다 새로운 installation
release가 생기는 것이다.
한 가지 조심해야할 것은 helm과 helm chart버전은 다르다. 이들은 다르게 버저닝이 되는데, 대부분 helm version3와 helm chart version2로 사용한다.
helm
은 helm
이라는 CLI tool을 통해서 chart
에 대한 추가, 삭제 등의 기본 동작을 수행할 수 있다. 따라서, helm
을 시작하기 전에 먼저 helm
CLI를 설치하는 것이 먼저이다.
https://github.com/helm/helm/releases
다음의 helm release page에 가서 다운로드 후에 실행을 시켜주도록 하자.
tar -zxf ./helm-release.tar.gz
chmod helm +x
위의 명령어를 실행시켜주면 helm
CLI를 설치하여 설정까지 해줄 수 있다.
다음은, script를 통해 설치하는 방법이다.
curl -fsSL -o get_helm.sh \
https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
get_helm.sh
script를 실행하면 가장 최신 helm3 version을 찾아 설치를 진행해준다.
helm
은 kubectl
과 동일한 매커니즘으로 kubernetes cluster와 연결하기 위해 시도한다. $KUBECONFIG
환경변수를 읽어 kubernetes cluster를 찾으려고하고, 만약 설정되어 있지않다면 kubectl
이 확인하는 경로인 $HOME/.kube/config
를 확인하여 cluster에 연결한다. 또한, 환경변수인 HELM_KUBECONTEXT
와 command-line flags인 `--kube-context-를 사용하여 cluster에 연결하려고 한다.
이제 helm
을 본격적으로 시작하기 위해서, 가장 많이 사용되는 workflow를 준비해보도록 하자.
1. chart repository 추가
2. 설치할 chart 찾기
3. helm chart 설치
4. 설치된 것들의 list 보기
5. installation upgrade하기
6. installation 삭제하기
helm
의 chart
는 개별적인 package로 사용자의 kubernetes cluster에 설치된다. 그런데, 누군가 만든 chart
를 공유하는 것은 어떻게할 수 있을까?? helm에서는 helm chart를 공유하고, 인덱싱하기 위한 standard format을 제공하는데, 이것이 바로 helm chart repository
이다. chart repository
는 간단한 file들로 network를 통해 접근이 가능하며 package들을 인덱싱하는 helm 스펙을 따른다. 즉, chart repository
는 여러 chart들을 하나로 묶어 쉽게 제공해주기 위한 하나의 registry와 같다.
수 많은 회사들이 chart repository
를 제공한다. helm chart repository도 docker hub처럼 온라인으로 다양한 사업자들이 제공하는 사이트가 있다. https://artifacthub.io/ 해당 page에서 수천개의 helm chart를 볼 수 있을 것이다. 각 chart들은 적절한 repository에 의해 호스팅되고 있다. 즉, https://artifacthub.io/
사이트에서는 helm chart
들이 제공되어있고, 이 helm chart
들은 잘보면 각 repository에 따라 다르게 제공되고 있는 것을 볼 수 있다.
chart repository에 대해서 알아보기 위해서 drupal content management system
을 사용해보도록 하자. https://www.drupal.org/ 해당 chart에는 여러 kubernetes type들이 존재하여 example로 배우기 좋다. https://artifacthub.io/packages/helm/bitnami/drupal
명확하게 해야할 것은 drupal
은 chart로 bitnami
라는 chart repository에 있는 chart 중 하나인 것이다. 따라서, 해당 drupal
chart를 설치하기 위해서는 bitnami
repository를 먼저 설치해야한다.
helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories
helm repo add
명령어로 bitnami
라는 repository를 https://charts.bitnami.com/bitnami
로 부터 local helm에 끌고 온 것이다.
helm repo list
NAME URL
bitnami https://charts.bitnami.com/bitnami
그런데 어떤 chart가 어떤 chart repository에 있는 지 알 수 있을까??
artifacthub
에서 chart를 검색해봐서 어떤 repository에 있는 지 볼 수 있지만, cli를 통해 검색할 수도 있다.
drupal
이라는 chart가 있는 repository
찾기helm search repo drupal
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/drupal 18.21.12 10.3.0 Drupal is one of the most versatile open source...
솔직히 cli문법이 이상하긴하다.
만약, chart
의 version들을 모두 보고싶다면 --versions
를 붙이면 된다.
helm search repo drupal --versions
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/drupal 18.21.12 10.3.0 Drupal is one of the most versatile open source...
bitnami/drupal 18.21.11 10.3.0 Drupal is one of the most versatile open source...
bitnami/drupal 18.21.10 10.2.7 Drupal is one of the most versatile open source...
bitnami/drupal 18.21.9 10.2.7 Drupal is one of the most versatile open source...
bitnami/drupal 18.21.8 10.2.7 Drupal is one of the most versatile open source...
...
단, 주의할 것은 chart version
과 app version
은 다르다는 것이다. app version
은 말 그대로 application version이고 chart version
은 application 뿐만 아니라 chart에 대한 업데이트도 있을 수 있다.
helm은 package관리를 chart로 한다고 했다. 따라서, package를 설치하는 것은 helm chart를 설치하는 것과 같다. helm chart를 설치하는 것은 두 가지 정보가 필요한데, 하나는 설치하려는 대상의 이름
, 두번째는 설치하려는 chart
이다.
helm chart
를 설치하는데 '이름'이 필요한 이유가 궁금할 것이다. 일반적으로 host computer에 같은 program을 두 번 설치하지 않는다. 설령 두 번 설치한다해도 두 번 실행하지 않는다. 가령 host에서 mysql
database server 두 개를 따로따로 실행하지 않는다는 것이다. 그러나 kubernetes에서는 이러한 일이 가능하다. 똑같은 설정에, 똑같은 image이고, 똑같은 version이지만 이름만 다르게 하여 서로 다른 두 개의 pod를 만들어낼 수 있다.
따라서, helm chart
역시도 똑같은 chart
이지만 이름을 달리하여, 여러 object들을 생성해낼 수 있는 것이다.
이는 helm에서 같은 chart에서 서로 다른 인스턴스를 가지는 이들 끼리의 구분을 위해 이름을 부여하는 것을 의미한다. 즉, chart 설치는 특정한 chart 인스턴스를 만들어내는 것과 같은 것이고, 하나의 chart는 여러 installation(설치)이 있을 수 있는 것이다. helm install
명령어를 사용하여 chart에 대한 instance를 만들 때, 설치되는 chart 인스턴스에 대한 이름이 필요한 이유도 바로 여기있는 것이다.
helm install mysite bitnami/drupal
NAME: mysite
LAST DEPLOYED: Tue Jul 2 12:30:35 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: drupal
CHART VERSION: 18.21.12
APP VERSION: 10.3.0** Please be patient while the chart is being deployed **
1. Get the Drupal URL:
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
Watch the status with: 'kubectl get svc --namespace default -w mysite-drupal'
export SERVICE_IP=$(kubectl get svc --namespace default mysite-drupal --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}")
echo "Drupal URL: http://$SERVICE_IP/"
2. Get your Drupal login credentials by running:
echo Username: user
echo Password: $(kubectl get secret --namespace default mysite-drupal -o jsonpath="{.data.drupal-password}" | base64 -d)
위의 명령어로 bitnami/drupal
chart에 대한 인스턴스를 생성하고, 인스턴스 이름을 mysite
로 지어놓은 것이다.
kubectl
명령어로 잘 배포되었는 지 확인해보도록 하자.
kubectl get po
...
default mysite-drupal-5b9d968694-v9q6v 0/1 Pending 0 5m47s
default mysite-mariadb-0 0/1 Pending 0 5m47s
Pending
이 되어있는 것은 PV를 엮어주지 않아서 그런 것이다.
helm3부터는 namespace마다 이름을 같게 해주어도 문제가 없도록 되었다.
kubectl create ns first
kubectl create ns second
helm install --namespace first mysite bitnami/drupal
helm install --namespace second mysite bitnami/drupal
다음과 같이 mysite
라는 chart instance이름은 같지만 namespace
가 다르기 때문에 이들은 서로 다른 instance라고 구분이 가능한 것이다. 참고로 --namespace
는 -n
와 같다.
helm에서 약간 헷갈리게 개념을 잡은 것이 있는데, helm chart
를 통해 설치한 인스턴스를 helm에서는 installation
이라고 한다. 따라서, 필자는 일반적인 chart '설치'와 chart 설치 후 배포된 인스턴스를 installation
으로 구분하겠다.
대부분의 chart들은 configuration들을 제공한다. https://artifacthub.io/packages/helm/bitnami/drupal drupal
역시도 parameter들을 제공하여 configuration에 용이함을 제공해준다. 가령 drupal
admin account의 username을 설정하고 싶다면 drupalUsername
값을 설정하면 된다.
configuration을 설정하는 여러 방법들이 있지만, 가장 좋은 방법은 configuration을 설정하는 yaml파일을 만들어 제공하는 것이다.
drupalUsername: admin
drupalEmail: admin@example.com
이전에 chart는 configuration을 담고있는 values.yaml
파일이 함게 있다고 했다. 위의 values.yaml
이 바로 chart에 대한 configuration data를 담고 있는 파일인 것이다. 위의 경우 drupalUsername
와 drupalEmail
을 설정하는 것이다.
해당 values.yaml
파일을 helm install
시에 넘겨주기만 하면 되는 것이다.
helm install mysite bitnami/drupal --values values.yaml
이러한 configuration file은 구조화된 형식을 가질 수 있다. 가령, drupal
에는 mariadb
에 관련된 configuration이 있을 수 있는데, 이것이 drupal
application에 관한 configuration과 섞이면 헷갈릴 수 있다. 따라서, 이들을 구분하도록 나누는 방법으로 구조화된 형식의 설정값을 쓰는 것이다.
drupalUsername: admin
drupalEmail: admin@example.com
mariadb:
db:
name: "my-database"
mariadb.db.name
을 보도록 하자. 해당 data는 mariadb
의 하위 configuration data라는 것이 눈에 들어온다. 이처럼, configuration value yaml파일은 구조화된 data를 가질 수 있는 것이다.
configuration을 설정하는 방법 중, 하나는 --set
flag를 사용하는 방법이다. 이는 보통 values.yaml
파일로 만들기에는 적은 내용의 수정이 필요할 때 사용한다.
helm install mysite bitnami/drupal --set drupalUsername=admin
위의 명령어는 단 하나의 parameter인 drupalUsername
을 설정한 것이다. flag
로 간단하게 key=value
형식을 지키기만하면 된다.
만약 mariadb.db.name
과 같이 구조화된 configuration value에 접근하고 싶다면 --set mariadb.db.name=my-database
에 접근하면 된다.
현재까지 설치한 helm chart 인스턴스(또는 installtions)를 보고 싶다면 helm list
를 확인하면 된다.
helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mysite default 1 2024-07-02 12:30:35.838966423 +0900 KST deployed drupal-18.21.12 10.3.0
조심해야할 것은 helm list
도 namespace에 민감하게 반응한다는 것이다. 따라서 아무것도 안적어주면 default
namespace로 나오게 된다. 만약 모든 namespace가 나오게 하고싶다면 --all-namespaces
flag를 사용하면 된다. 또는 단축어로 -A
를 사용하면 된다.
helm list --all-namespaces
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mysite default 1 2020-06-14... deployed drupal-7.0.0 9.0.0
mysite first 1 2020-06-14... deployed drupal-7.0.0 9.0.0
mysite second 1 2020-06-14... deployed drupal-7.0.0 9.0.0
Installation
을 삭제하는 명령어는 간단하다.
helm uninstall mysite
release "mysite" uninstalled
helm uninstall
시에 installation
이름만 필요하다는 것에 집중하도록 하자. 즉 chart
에 대한 정보는 필요가 없다.
단, helm uninstall
도 namespace
의 영향을 받으므로 --namespace
flag를 적용해야한다.
helm uninstall mysite --namespace first
release "mysite" uninstalled
위에서 helm은 helm chart를 통해서 배포된 인스턴스를 installation
이라고 했다. installation
은 cluster에 배포된 chart의 인스턴스이다. helm install
을 사용하여 chart를 cluster에 설치하여 인스턴스인 installation
을 만들 수 있는데, 만약 수정하고 싶다면 helm upgrade
를 사용하면 된다.
installation
을 업데이트하는 것은 두 가지 기준으로 구분될 수 있다.
1. chart의 version을 upgrade하기
2. installation의 설정을 upgrade하기
이 둘 중 하나라도 변한다면 upgrade된 것이다. 그러나 이 두 가지는 상호 배타적이지 않는데, 이 둘을 동시에 할 수 있다는 것이다. helm chart가 upgrade된 것을 release
라고 한다. release
는 installation의 configuration과 chart version 조합인 것이다.
첫번째 chart에 대한 installation
을 release1
이라고 하고, upgrade를 실행하고 나면 release2
가 되는 것이다. upgrade가 된 사유가 version 때문인지 configuration 때문인지 둘 다 때문인지는 상관없다. upgrade만되면 release
가 올라간다.
이제 upgrade
를 사용해보도록 하자.
먼저 ingress
기능이 꺼진 version으로 설치해보도록 하자.
helm install mysite bitnami/drupal --set ingress.enabled=false
이제 ingress.enabled
을 설정하기 위해서 helm upgrade
를 실행해보도록 하자.
helm upgrade mysite bitnami/drupal --set ingress.enabled=true
위의 upgrade
명령어로 configuration을 바꾼 것 뿐이다.
내부적으로 helm은 helm upgrade 시에 해당하는 configuration을 반영한 chart를 load하고 chart에 대한 kubernetes object를 만든다. 그리고서는 이전 version chart의 kubernetes object와 diff를 비교하고, 변화된 부분만 kubernetes에게 전달하여, 업데이트하도록 한다. 즉, upgrade했다고해서 안바뀐 부분도 또 업데이트하고 그런 것은 아니다.
만약, chart repository에서 특정 chart에 대한 새로운 version이 나온다면, 이를 받아서 upgrade하고 싶을 것이다. 이 두 과정을 cli로 보여준다.
helm repo update
ang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "bitnami" chart repository
Update Complete. ⎈ Happy Helming!⎈
helm upgrade mysite bitnami/drupal
helm repo update
을 통해서 chart repository에서 최신 chart package를 다운받는다. 즉, 새로운 chart version이 추가된다.helm upgrade mysite bitnami/drupal
을 통해서 mysite
chart instance의 release를 최신 version으로 업데이트해준다. 만약 특정 version으로 바꾸고 싶다면, 다음과 같이 --version
을 설정해주어 upgrade
해주면 된다.
helm upgrade mysite bitnami/drupal --version 6.2.22
이 경우 새로운 version이 bitnami/drupal
에 추가되어도 6.2.22
가 설치된다.
upgrade
시에 한 가지 조심해야할 점이 있는데, upgrade
시에도 configuration value를 제공하여 default 설정값을 해치지 않는 것이 좋다.
helm install mysite bitnami/drupal --values values.yaml
helm upgrade mysite bitnami/drupal
처음에 install
할 때 --values
를 통해서 values.yaml
파일을 제공하였다. 이 values.yaml
파일 기준으로 configuration값들이 설정될 것이다. 문제는 helm upgrade
를 실행하면서 새로운 version이 설치되고, 이전에 설정했던 values.yaml
설정이 적용되지 않는다는 것이다. 즉, 이전에 helm install
시에 적용했던 --values values.yaml
이 적용되지 않는다는 것이다.
따라서, helm upgrade
할 때도 --values values.yaml
을 제공하는 것이 좋다.
helm install mysite bitnami/drupal --values values.yaml
helm upgrade mysite bitnami/drupal --values values.yaml
아래와 같은 helm upgrade
에 --values values.yaml
을 적용해도 새로운 version의 chart가 설치되고 values.yaml
도 적용된다.
그런데 만약 --set
으로만 configuration을 바꾸었다고 하자. 어떻게 이전에 적용했던 --set
key-value값들을 다시 입력할 수 있을까?? 매우 귀찮은 일이다. 이를 위해서 helm
에서는 이전 version의 configuration을 새로운 version에 자동 적용 시킬 수 있도록 하는 명령어가 있다.
helm upgrade mysite bitnami/drupal --reuse-values
--reuse-values
flag는 helm에게 현재의 configuration values들에 대한 복사본을 만들어주고 이를 upgrade하는데 사용해달라는 것이다. 단, --reuse-values
flag를 사용할 때는 반드시 --set
이나 --values
처럼 configuration을 바꾸는 명령어를 함께 써서는 안된다. 이는 원치 않은 버그나 configuration 충돌을 만들 수 있기 때문이다.
우리가 helm install mysite bitnami/drupal
을 만들었을 때 helm에서는 release 정보를 담은 특별한 record를 만들어내어 kubernetes secret
에 저장해준다.
kubectl get secret
으로 확인해보면 다음과 같다.
kubectl get secret
NAME TYPE DATA AGE
default-token-vjhx2 kubernetes.io/service-account-token 3 58m
mysite-drupal Opaque 1 13m
mysite-mariadb Opaque 2 13m
sh.helm.release.v1.mysite.v1 helm.sh/release.v1 1 13m
sh.helm.release.v1.mysite.v2 helm.sh/release.v1 1 13m
sh.helm.release.v1.mysite.v3 helm.sh/release.v1 1 7m53s
sh.helm.release.v1.mysite.v4 helm.sh/release.v1 1 5m30s
release
정보가 담긴 secret
들이 생성된 것을 볼 수 있다. 이 release
정보들은 helm install
과 helm upgrade
로 생성된 것들이다.
만약 helm uninstall mysite
명령어를 실행하면, 가장 최근 release
를 받아와서 kubernetes object들을 만들고, 이를 cluster에서 삭제한다. 이 다음 모든 reelase
record들을 삭제한다.
helm uninstall mysite
release "mysite" uninstalled
이후에 helm list
명령어로 mysite
가 더 이상 없는 것을 볼 수 있다.
helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
kubectl get secrets
로 release
를 확인해도 없는 것을 볼 수 있다.
kubectl get secrets
NAME TYPE DATA AGE
default-token-vjhx2 kubernetes.io/service-account-token 3 65m
이후에 helm rollback
을 통해서 이전 release
를 복구하는 것에 대해서 배우게 될 것이다. 그런데 secret
이 모두 삭제되면 release
들이 없으므로 helm rollback
이 불가능하다. 따라서, helm uninstall
시에 relase
를 삭제하지 않도록 --keep-history
flag를 추가할 수 있다.
helm uninstall --keep-history