Helm 사용해보기

Helm 사용해보기

1. Helm이란.

w:800 center

비유를 한다면 개발자가 Docker Registry에서 검색하여 쉽게 이미 셋팅된 컨테이너 환경을 실행하듯이
Helm에서 검색하여 이미 셋팅된 쿠버네티스 환경을 실행한다라고 이해하면 되지 않을 듯 싶다.
ex. Dockerhub처럼 ArtifactHub에서 많은 템플릿이 등록되고 공유되고 있다.

컨테이너 환경을 Dockerfile로 구성 하는 것처럼 Helm도 차트로 구성을 한다.

  • 차트 = 쿠버네티스 YAML을 템플릿으로 구성한 파일들

2. Usage. Helm Chart 생성

  • Helm Chart를 생성하기 위해서는 위에서 설명한 구조의 파일들을 생성할 필요가 있음

  • nginx 템플릿을 단계별로 구성하여 따라해보기

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 # 차트 API 버전 (필수)
name: nginx-test # 차트명 (필수)
version: 0.0.1 # SemVer 2 버전 (필수)

현재 파일 구성

1
2
3
4
5
.
├── Chart.yaml
└── templates
├── deployment.yaml
└── service.yaml

2-3. values.yaml 작성

  • values.yaml = /templates 내부에 쿠버네티스 YAML에 있는 값을 동적으로 지정할 때 사용하는 파일
  • 일단은 파일이 비어있는 상태로도 설치가 가능하기 때문에 파일만 생성
1
touch values.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
# helm install nginx-test . -n test

NAME: nginx-test
LAST DEPLOYED: Sun Nov 21 05:41:08 2021
NAMESPACE: test
STATUS: deployed
REVISION: 1 # helm upgrade 반영 횟수
TEST SUITE: None

Helm 조회

1
2
3
# helm ls -n test
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
# k get deploy,svc -n test
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
# helm delete nginx-test -n test

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 수정

1
version: stable

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
# 1. /templates/deployment.yaml 릴리즈 템플릿 적용
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
# 2. /templates/service.yaml 릴리즈 템플릿 적용
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
# helm install nginx-rename-test . -n test
NAME: nginx-rename-test
LAST DEPLOYED: Sun Nov 21 06:48:04 2021
NAMESPACE: test
STATUS: deployed
REVISION: 1
TEST SUITE: None
# helm ls -n test
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
# helm get all nginx-rename-test
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:
---
# Source: nginx-test/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-rename-test
spec:
selector:
app: nginx-rename-test
ports:
- port: 80
targetPort: 80
type: ClusterIP
---
# Source: nginx-test/templates/deployment.yaml
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 자주 사용하는 명령어

  • 릴리스 히스토리를 가져오기, 업그레이드 내역(revision) 확인 등 유용

    1
    helm history <릴리즈_차트명>
  • Helm Chart 문법 검사

    1
    helm lint <차트_경로>
  • Helm /templates + values.yaml 최종 결과를 보여준다.

    1
    helm template <차트명> <차트_경로>
  • Helm 차트 릴리즈 업그레이드

    추후 과정에서 더 자세히 설명

    1
    helm upgrade <릴리즈_차트명> <차트_경로>

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
# k get deploy -n test nginx-set-test -o yaml | grep image
...
- image: nginx:1.21.4

2. -f 옵션으로 파일을 작성

1
helm install -f <파일경로> -n test nginx-file-test .

2-1. override_values.yaml 파일을 아래와 같이 작성

1
version: stable-alpine

차트 파일 구성

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
# k get deploy -n test nginx-file-test -o yaml | grep image
...
- image: nginx:stable-alpine
  • 실제 override 할 때는 각 차트의 configuration 항목을 참조하여 변경 필요한 값만 지정하여 설치
  • 예제. nginx chart

8. Usage. Helm Chart 업그레이드

  • 기존 릴리즈된 차트 내용을 변경 요구시 사용
  • 이력 관리를 위해 사용

1. Helm Chart 기본 설치

1
helm install -n test nginx-test .
  • 결과 확인 (revision)
    1
    helm get all nginx-test

2. Helm Chart 업그레이드

1
helm upgrade --set version=stable-alpine -n test nginx-test .

image

  • REVISION이 올라가고 이미지 배포 버전이 바뀐 것을 알 수 있음
  • values.yaml을 변경하고 업그레이드를 진행하여도 변경이 됨

업그레이드시 주의사항

  • Helm 업그레이드시 Pod가 재기동됨(RollingUpdate)
1
2
3
4
5
# 1
helm upgrade --set version=stable-alpine -n test nginx-test .

# 2
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]# helm rollback -n test nginx-test 1
Rollback was a success! Happy Helming!
[root@acc-master nginx-chart]# helm ls
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]# k get deploy -n test nginx-test -o yaml | grep image
f:image: {}
f:imagePullPolicy: {}
- image: nginx:stable
imagePullPolicy: IfNotPresent
  • 롤백은 한다고 해도 revision은 이력관리를 위해 증가한다.
  • 버전이 최초 설치와 동일한 stable로 변경된 것을 알 수 있다.