Helm 사용해보기
1. Helm이란.
비유를 한다면 개발자가 Docker Registry에서 검색하여 쉽게 이미 셋팅된 컨테이너 환경을 실행하듯이 Helm에서 검색하여 이미 셋팅된 쿠버네티스 환경을 실행한다라고 이해하면 되지 않을 듯 싶다. ex. Dockerhub
처럼 ArtifactHub
에서 많은 템플릿이 등록되고 공유되고 있다.
컨테이너 환경을 Dockerfile
로 구성 하는 것처럼 Helm도 차트
로 구성을 한다.
차트
= 쿠버네티스 YAML을 템플릿으로 구성한 파일들
2. Usage. Helm Chart 생성
2-1. /templates
폴더 생성하여 배포할 쿠버네티스 YAML 작성
deployment, service YAML은 뒤에 작성
1 2 3 4 . └── templates ├── deployment.yaml └── service.yaml
deployment.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-test labels: app: nginx-test spec: replicas: 1 selector: matchLabels: app: nginx-test template: metadata: labels: app: nginx-test spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
service.yaml
1 2 3 4 5 6 7 8 9 10 11 apiVersion: v1 kind: Service metadata: name: nginx-test spec: selector: app: nginx-test ports: - port: 80 targetPort: 80 type: ClusterIP
2-2. Chart.yaml
작성
Chart.yaml
= Helm 차트의 이름, 버전 등 메타데이터를 입력하는 파일
1 2 3 apiVersion: v2 name: nginx-test version: 0.0 .1
현재 파일 구성
1 2 3 4 5 . ├── Chart.yaml └── templates ├── deployment.yaml └── service.yaml
2-3. values.yaml
작성
values.yaml
= /templates
내부에 쿠버네티스 YAML에 있는 값을 동적으로 지정할 때 사용하는 파일
일단은 파일이 비어있는 상태로도 설치가 가능하기 때문에 파일만 생성
1 2 3 4 5 6 . ├── Chart.yaml ├── templates │ ├── deployment.yaml │ └── service.yaml └── values.yaml
2-4. Helm Chart 설치 1 helm install <이름> <차트_경로> -n <네임스페이스>
실행 결과
1 2 3 4 5 6 7 8 NAME: nginx-test LAST DEPLOYED: Sun Nov 21 05:41:08 2021 NAMESPACE: test STATUS: deployed REVISION: 1 TEST SUITE: None
Helm 조회
1 2 3 NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION nginx-test test 1 2021-11-21 05:41:08.564944731 +0900 KST deployed nginx-test-0.0.1
2-5. 실제 쿠버네티스 배포현황 확인 1 2 3 4 5 6 NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-test 1/1 1 1 4m3s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/nginx-test ClusterIP 10.100.29.142 <none> 80/TCP 4m3s
3. Usage. Helm Chart 삭제 1 helm delete <릴리즈된_차트명> -n <네임스페이스>
실행 결과
1 2 3 release "nginx-test" uninstalled
이후, helm ls -n test
명령어 실행시 차트가 삭제된 것을 확인할 수 있음
4. Usage. values.yaml으로 템플릿 문법 사용
“values.yaml = /templates 내부에 쿠버네티스 YAML에 있는 값을 동적으로 지정할 때 사용하는 파일” 라고 이야기된 단계에 관한 설명
위 과정을 하기 위해서는 템플릿 문법 을 사용해야함
예시로 /templates
내에 deployment.yaml
에서 이미지 버전이 현재 latest
로 되어있는 것을 외부에서 바꿀 수 있게 변경을 진행
4-1. /templates/*.yaml
수정 1 2 3 4 5 6 7 ... spec: containers: - name: nginx image: nginx:{{ .Values.version }} ports: - containerPort: 80
4-2. values.yaml
수정
3. Helm Chart 설치 1 helm install nginx-values-test .
실행 결과
1 2 3 4 5 6 NAME: nginx-values-test LAST DEPLOYED: Sun Nov 21 06:11:26 2021 NAMESPACE: test STATUS: deployed REVISION: 1 TEST SUITE: None
배포 확인: 아래처럼 image version tag가 바뀐 것을 확인할 수 있다.
1 k get deploy nginx-test -o yaml
1 2 ... - image: nginx:stable
Helm Chart로 공개된 오픈소스 문법 참고
5. Usage. Release 템플릿 문법 사용 기존 .Values
템플릿 문법으로는 helm install <차트명>
에서 입력되는 차트명
까지는 가져오지 못한다. 이러한 문제를 해결해주기 위한 템플릿 문법으로 .Release
가 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Release.Name }} labels: app: {{ .Release.Name }}spec: replicas: 1 selector: matchLabels: app: {{ .Release.Name }} template: metadata: labels: app: {{ .Release.Name }}...
1 2 3 4 5 6 7 8 9 10 11 12 apiVersion: v1 kind: Service metadata: name: {{ .Release.Name }}spec: selector: app: {{ .Release.Name }} ports: - port: 80 targetPort: 80 type: ClusterIP
Helm Chart 설치 (.Release
문법 적용)
1 helm install nginx-rename-test . -n test
실행 결과
1 2 3 4 5 6 7 8 9 10 11 NAME: nginx-rename-test LAST DEPLOYED: Sun Nov 21 06:48:04 2021 NAMESPACE: test STATUS: deployed REVISION: 1 TEST SUITE: None NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION nginx-rename-test test 1 2021-11-21 06:48:04.719317331 +0900 KST deployed nginx-test-0.0.1 nginx-values-test test 1 2021-11-21 06:11:26.928779655 +0900 KST deployed nginx-test-0.0.1
아래 명령을 실행하면, Helm이 최종적으로 어떤 정보로 릴리즈를 했는지 알 수 있다.
Helm 명명된 릴리스에 대한 모든 정보 조회
1 helm get all <RELEASE_NAME>
실행 결과
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 NAME: nginx-rename-test LAST DEPLOYED: Sun Nov 21 06:48:04 2021 NAMESPACE: test STATUS: deployed REVISION: 1 TEST SUITE: None USER-SUPPLIED VALUES: null COMPUTED VALUES: version: stable HOOKS: MANIFEST: --- apiVersion: v1 kind: Service metadata: name: nginx-rename-test spec: selector: app: nginx-rename-test ports: - port: 80 targetPort: 80 type : ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx-rename-test labels: app: nginx-rename-test spec: replicas: 1 selector: matchLabels: app: nginx-rename-test template: metadata: labels: app: nginx-rename-test spec: containers: - name: nginx image: nginx:stable ports: - containerPort: 80
6. Usage. 그 외 Helm 자주 사용하는 명령어
7. Usage. values.yaml override
보통의 경우에는 values.yaml
을 직접 작성하지 않고, 남이 작성한 파일을 가져오기 때문에 override(덮어쓰기)하여 사용이 된다.
아래의 2가지 방법이 있다.
--set
인자 사용
-f
옵션으로 파일을 작성
1. --set
인자 사용 1 helm install --set version=1.21.4 -n test nginx-set-test .
실행 결과
1 2 3 4 5 6 NAME: nginx-set-test LAST DEPLOYED: Sun Nov 21 07:09:41 2021 NAMESPACE: test STATUS: deployed REVISION: 1 TEST SUITE: None
배포 결과 (values.yaml
version
값이 stable
이지만 1.21.4로 된 것을 알 수 있음)
1 2 3 ... - image: nginx:1.21.4
2. -f
옵션으로 파일을 작성 1 helm install -f <파일경로> -n test nginx-file-test .
2-1. override_values.yaml
파일을 아래와 같이 작성
차트 파일 구성
1 2 3 4 5 6 7 8 9 . ├── Chart.yaml ├── override_values.yaml ├── templates │ ├── deployment.yaml │ └── service.yaml └── values.yaml 1 directory, 5 files
2-2. -f
옵션으로 Helm Chart 설치 1 helm install -f override_values.yaml -n test nginx-file-test .
실행 결과
1 2 3 4 5 6 NAME: nginx-file-test LAST DEPLOYED: Sun Nov 21 07:16:31 2021 NAMESPACE: test STATUS: deployed REVISION: 1 TEST SUITE: None
배포 결과
1 2 3 ... - image: nginx:stable-alpine
실제 override 할 때는 각 차트의 configuration
항목을 참조하여 변경 필요한 값만 지정하여 설치
예제. nginx chart
8. Usage. Helm Chart 업그레이드
기존 릴리즈된 차트 내용을 변경 요구시 사용
이력 관리를 위해 사용
1. Helm Chart 기본 설치 1 helm install -n test nginx-test .
2. Helm Chart 업그레이드 1 helm upgrade --set version=stable-alpine -n test nginx-test .
REVISION
이 올라가고 이미지 배포 버전이 바뀐 것을 알 수 있음
values.yaml
을 변경하고 업그레이드를 진행하여도 변경이 됨
업그레이드시 주의사항
Helm 업그레이드시 Pod가 재기동됨(RollingUpdate)
1 2 3 4 5 helm upgrade --set version=stable-alpine -n test nginx-test . helm upgrade -n test nginx-test .
위 과정을 진행하면, helm 버전에 따라 values.yaml
참고가 다르다.
version3: 이전 revision
을 그대로 따라 버전을 유지
version2: 이전 revision
버전을 유지하지 않는다. (첫 설치 values.yaml
)
9. Helm Rollback 1 helm rollback <릴리즈_차트명> <REVISION>
실행 결과
1 2 3 4 5 6 7 8 9 10 [root@acc-master nginx-chart] Rollback was a success! Happy Helming! [root@acc-master nginx-chart] NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION nginx-test test 3 2021-11-21 07:47:41.211560477 +0900 KST deployed nginx-test-0.0.1 [root@acc-master nginx-chart] f:image: {} f:imagePullPolicy: {} - image: nginx:stable imagePullPolicy: IfNotPresent
롤백은 한다고 해도 revision
은 이력관리를 위해 증가한다.
버전이 최초 설치와 동일한 stable
로 변경된 것을 알 수 있다.