helm 이란?
- package managing on your kubernetes cluster
- node.js 의 npm, python의 pip 과 비슷한 형태로 쿠버네티스 패키지 배포를 가능하게 하는 tool
- k8s 리소스들을 간편하게 관리할 수 있도록 도와주는 툴
- chart 라는 packaging format을 사용한다.
- 쿠버네티스 클러스터에 애플리케이션을 쉽게 설치, 업그레이드, 롤백 및 삭제할 수 있다.
- 쿠버네티스를 사용하다보면 결국 수많은 템플릿을 관리해야한다. 헬름은 이런 템플릿 파일들의 집합(차트라고 함)을 관리하는 쿠버네티스 패키지 매니저 도구이다.
- 쿠버네티스의 하위 프로젝트로 시작되었다가 2018년 6월 CNCF의 정식 프로젝트로 승격되었다.
helm 구조
helm create <Name>을 통해서 Chart의 기본 구조를 생성할 수 있다.
- Chart.yaml (필수)
- Chart의 정보를 정의하는 파일로 Chart의 이름, 버전 등을 정의
- values.yaml (필수)
- 템플릿에 사용 될 변수들을 모아놓은 파일입니다.
- template (필수)
- k8s 리소스 템플릿이 보관되는 디렉토리
- NOTES.txt: Chart를 설치 후 출력되는 내용을 정의합니다.
- .yaml: 클러스터에 띄울 리소스 템플릿 파일들입니다.
- charts (옵션)
- (다른 Chart에 의존성이 있을 경우) 의존하는 Chart를 모아둔 디렉토리
helm 사용법
# 헬름 설치 (mac os)
$ brew install kubernetes-helm
# 사용할 수 있는 차트들 확인
$ helm search
# 차트를 이용해 MySQL 설치 (--name 옵션은 차트 이름을 지정)
$ helm install stable/mysql --name=my-sql
# 현재 실행중인 차트 상태 확인
$ helm ls
# 실행중인 차트 삭제
$ helm del my-mysql
# 기본 구조의 차트 생성
$ helm create sample
# 디렉터리 구조 확인
$ tree sample
장점
[기존 쿠버네티스]
- 리소스 변경이 언제 적용되었는지 확인하기 힘듬
- 리소스 파일이 많아 설치 과정이 번거롭고 복잡
- 여러 리소스 파일에 변경 사항이 있으면 롤백하기 복잡
- 환경 별 리소스 파일을 분리하며 코드 중복 발생
[헬름]
- 쿠버네티스 리소스를 한 군데로 묶어서 차트로 편하게 배포 (helm install을 통해 간단히 배포)
- value.yaml 에서 변수 정의해서 호출 가능 -> 중복 줄임
- 변경 시 이전 버전으로 돌아가기 쉬움 (롤백 가능)
- history 통해 기록 확인
- repo에 push해두면 docker hub 처럼 필요할 때 당겨서 사용 가능
- A/B 테스트나 Canary 배포가 어렵다는 단점은 있지만, Istio와 같은 Service Mesh와 함께 섞어서 쓰면 다양한 배포 전략을 사용할 수 있다
설치 예제
helm create
▶ helm chart 설치할 폴더 생성 후 이동
snchoi@snchoi:~$ mkdir helm
snchoi@snchoi:~$ cd helm/
▶ helm chart 생성
snchoi@snchoi:~/helm$ helm create snchoi-helm
Creating snchoi-helm
▶ 폴더 및 구조 확인
snchoi@snchoi:~/helm$ ls
snchoi-helm
snchoi@snchoi:~/helm$ tree snchoi-helm/
snchoi-helm/
├── Chart.yaml
├── charts
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── service.yaml
│ ├── serviceaccount.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
helm install
▶ chart 를 통해 배포 (helm 생성)
snchoi@snchoi:~/helm$ helm install snchoi-helm ./snchoi-helm/
▶ 어떤 차트가 릴리즈 되어있는지 확인
snchoi@snchoi:~/helm$ helm ls
▶ helm을 통해 배포된 service 확인 (pod, ingress, deployment… 등도 확인 가능)
snchoi@snchoi:~/helm$ kubectl get svc
helm upgrade
- 기존에 만들어져 있던 happy-panda 라는 이름을 가진 helm을 새로 정의한 panda.yaml 을 반영하여 업그레이드 한다.
helm history & helm rollback
- helm 목록을 확인해보면 happy-panda가 업그레이드 (변경) 된 이후 REVISION이 1에서 2로 변경
- helm history 명령어로 확인해보면 해당 helm의 기록을 볼 수 있다.
- REVISION을 1로 롤백한다.
- history로 확인해보니 롤백이 되고 REVISION은 3으로 변경
helm repo
▶ local에서 chartmuseum을 사용하기 위해 Docker로 chartmuseum:v0.13.1 이미지 띄우기
snchoi@snchoi:~$ sudo docker run --rm -u 0 -it -d -p 8080:8080 -e DEBUG=1 -e STORAGE=local -e STORAGE_LOCAL_ROOTDIR=/charts -v $(pwd)/charts:/charts ghcr.io/helm/chartmuseum:v0.13.1
Unable to find image 'ghcr.io/helm/chartmuseum:v0.13.1' locally
latest: Pulling from ghcr.io/helm/chartmuseum:v0.13.1
596ba82af5aa: Pull complete
97cda76ac4f8: Pull complete
7cd1b4b8c77a: Pull complete
Digest: sha256:7fb4cd65d68978b1280f39cedc8c4db8c96efe6f622160a109b425a95098615f
Status: Downloaded newer image for chartmuseum/chartmuseum:latest
fffd7d3b1ce72e122c13fc3981405c45e4d4ce658bd0d314b4462fabefa51eca
▶ 를 chartmuseum이란 이름으로 repo에 추가
snchoi@snchoi:~$ helm repo add chartmuseum
▶ 변경된 repo 싱크 맞추기 위해 update
snchoi@snchoi:~$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "chartmuseum" chart repository
...Successfully got an update from the "brigade" chart repository
...Successfully got an update from the "stable" chart repository
...Successfully got an update from the "bitnami" chart repository
Update Complete. ⎈Happy Helming!⎈
▶ repo 목록 확인
snchoi@snchoi:~$ helm repo list
NAME URL
bitnami https://charts.bitnami.com/bitnami
stable https://charts.helm.sh/stable
brigade https://brigadecore.github.io/charts
chartmuseum
▶ push를 위한 push plug-in 설치
snchoi@snchoi:~$ helm plugin install https://github.com/chartmuseum/helm-push.git
▶ snchoi-helm 헬름을 chartmuseum repo에 push
snchoi@snchoi:~$ helm cm-push snchoi-helm/ chartmuseum
Pushing snchoi-helm-0.1.0.tgz to chartmuseum...
Done.
▶ repo 업데이트
snchoi@snchoi:~$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "chartmuseum" chart repository
...Successfully got an update from the "bitnami" chart repository
Update Complete. ⎈Happy Helming!⎈
▶ 로컬에서 chartmuseum 이름을 가진 repo가 존재하는지 찾기
snchoi@snchoi:~$ helm search repo chartmuseum/
NAME CHART VERSION APP VERSION DESCRIPTION
chartmuseum/snchoi-helm 0.1.0 1.16.0 A Helm chart for Kubernetes
▶ chartmuseum repo에 있는 snchoi-helm 헬름을 배포하겠다 (자동생성되는 이름으로)
snchoi@snchoi:~$ helm install chartmuseum/snchoi-helm --generate-name
NAME: snchoi-helm-1628834787
LAST DEPLOYED: Fri Aug 13 15:06:37 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=snchoi-helm,app.kubernetes.io/instance=myapp-1628834787" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit to use your application"
kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
▶ 현재 helm 목록 확인
snchoi@snchoi:~$ helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
myapp default 1 2021-08-13 14:10:58.297246313 +0900 KST deployed myapp-0.1.0 1.16.0
snchoi-helm-1628834787 default 1 2021-08-13 15:06:37.729219586 +0900 KST deployed myapp-0.1.0 1.16.0
mysql-1628831758 default 1 2021-08-13 14:16:04.274341853 +0900 KST deployed mysql-8.8.3 8.0.26
'클라우드 > Kubernetes(쿠버네티스)' 카테고리의 다른 글
[kubernetes] Jenkins vs Jenkins X (0) | 2021.07.25 |
---|---|
[kubernetes] Tekton (0) | 2021.07.25 |
[쿠버네티스] 시크릿 (0) | 2021.06.11 |
[쿠버네티스] 컨피그맵 (0) | 2021.06.09 |
[쿠버네티스] 레이블과 애너테이션 (0) | 2021.06.09 |