helm을 배워보자 1일차 - tutorial

0

helm

목록 보기
1/8

helm

helm에 대해서 알아보도록 하자. 모든 정보들은 공식 docs를 기반으로한다.
https://helm.sh/ko/docs/intro/quickstart/

helm을 설치하기 이전에 kubernetes cluster가 구축되어있고 kubernetes에 대한 기본적인 지식이 있음을 가정으로 한다.

helm 설치하기

helm은 기본적으로 두 가지 설치 방법을 제공하고, 이외에는 각 os별 package manager(apt, snap, homebrew etc)에 따라 다르다.

binary release로 설치하기

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 chart repository 추가하기

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 설치(배포)하기

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를 동일한 클러스터에 여러 번 설치할 수 있다. 또한, 각각을 독립적으로 관리, 업그레이드 할 수 있다.

release list

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

release 삭제

helm uninstall 명령어를 사용하면 해당 release와 관련된 모두를 지운다.

helm uninstall mysql-1687168334
...
release "mysql-1687168334" uninstalled

release가 사라지고 release와 관련된 모든 리소스들이 사라지게 된다. --keep-history 플래그를 제공하면 release 이력은 유지되며 release에 대한 정보를 요청할 수 있다.

helm 주요 개념 3가지

  1. chart: 차트는 헬름 패키지로, kubernetes cluster 내에서 어플리케이션, 도구, 서비스 등을 구동하는데 필요한 모든 리소스 정의가 포함되어 있다.
  2. repository: 저장소는 관련된 chart를 모아두는 장소이다.
  3. release: 릴리스는 kubernetes에서 구동되는 chart의 인스턴스이다. 일반적으로 하나의 chart는 동일한 클러스터 내에서 여러 번 설치될 수 있다. 즉, 새로운 release가 생성된다.

정리하면 다음과 같다.

|----------------------------repository----------------------------|
|                                                                  |
|  |--chart--|      |--chart--|      |--chart--|      |--chart--|  |
|  |         |      |         |      |         |      |         |  | ----helm install repo/chart---> release
|  |---------|      |---------|      |---------|      |---------|  |
|------------------------------------------------------------------|

helm search(chart 찾기)

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가 있는 지 없는 지 검색하기 가장 좋은 방법인 것이다.

helm install(패키지 설치)

chart(패키지)를 설치하여 release를 만드려면 helm install 명령어를 사용하면 된다. 인수는 다음과 같다.

helm install <release-name> <repo/chart>

가령 release-namehappy-panda이고 repostable이며 chartmariadb면 다음가 같다.

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개념이 적용된다는 것이다. 따라서 명령어를 칠 때마다 유념하도록 하자.

helm 설치 전 chart 커스텀 마이징

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

mariadbUsermariadbDatabase를 각각 user0user0db로 설정하도록 하는 config.yaml 파일을 만들고 이를 bitnami/mariadb chart install 시에 적용하도록 하는 것이다.

-f옵션으로 bitnami/mariadb의 values.yaml을 오버라이드하는 것이다.

설정하지 않은 옵션들은 나머지 옵션들로 설정된다.

install 작업에 configuration data를 전달하는 방법에는 두 가지가 있다.

  1. --values ( -f): 오버라이드할 yaml 파일을 지정한다.
  2. --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 명령어를 사용하여 여러 소스에서 설치를 수행할 수 있다. 위는 차트 저장소를 사용한 방법이다.

  1. 로컬 차트 압축 파일(helm install foo foo-0.1.1.tgz)
  2. 압축해제된 차트 디렉터리(helm install foo path/to/foo)
  3. 완전한 URL (helm install foo https://example.com/charts/foo-1.2.3.tgz)

helm upgrade 및 helm rollback( release 업그레이드 및 실패 복구 )

새로운 버전의 chart가 나왔을 때 또는 release의 구성을 변경하고자 할 때 helm upgrade 명령어를 사용할 수 있다.

upgrade는 현존하는 release를 가지고 사용자가 입력한 정보에 따라 업그레이드한다. 최근 것에서 변경된 것들만 업그레이드하는 특징이 있다.

먼저 panda.yaml 파일을 만들어 특정 configuration 값을 변경하도록 하자.

  • panda.yaml
mariadbUser: user1
auth:
  rootPassword: root

mariadbUseruser으로 바꾸고 auth.rootPasswordroot로 변경하는 파일이다.

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

install, upgrade, rollback에 관한 유용한 옵션들

대표적인 cli 옵션들을 나열하면 다음과 같다.

  1. --timeout: kubernetes 명령어가 완료되기를 기다리는 시간으로 기본적으로 5m 0s이다.
  2. --wait: release가 성공적이었다고 기록하기전에, 모든 pod들이 준비 상태가 되고 pvc들이 연결되며 deployment가 최소한의 준비상태 pod 수를 갖추며 service들이 IP를 가질 때까지 기다린다. 타임아웃이 지났는데도 release가 준비되지 못하면 FAILED로 기록된다.
  3. --no-hooks: 명령어에 대한 hook작동을 생략한다.

helm uninstall (release uninstall하기)

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 기록들을 보여준다.

helm repo (저장소)

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

0개의 댓글