center

Helm 사용해보기

목차
  1. Helm이란
  2. Usage. Helm Chart 생성
  3. Usage. Helm Chart 삭제
  4. Usage. values.yaml으로 템플릿 문법 사용
  5. Usage. Release 템플릿 문법 사용
  6. Usage. 그 외 Helm 자주 사용하는 명령어
  7. Usage. values.yaml override
  8. Usage. Helm Chart 업그레이드
  9. Usage. Helm Rollback
1. Helm이란

center

1. Helm이란

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

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

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

center

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

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

  1. /templates 폴더 생성하여 배포할 쿠버네티스 YAML 작성

deployment, service YAML은 뒤에 작성

.
└── templates
    ├── deployment.yaml
    └── service.yaml
2. Usage. Helm Chart 생성

deployment.yaml

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
2. Usage. Helm Chart 생성

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-test
spec:
  selector:
    app: nginx-test
  ports:
  - port: 80
    targetPort: 80
  type: ClusterIP
2. Usage. Helm Chart 생성
  1. Chart.yaml 작성
  • Chart.yaml = Helm 차트의 이름, 버전 등 메타데이터를 입력하는 파일
apiVersion: v2 # 차트 API 버전 (필수)
name: nginx-test # 차트명 (필수)
version: 0.0.1 # SemVer 2 버전 (필수)

현재 파일 구성

.
├── Chart.yaml
└── templates
    ├── deployment.yaml
    └── service.yaml
2. Usage. Helm Chart 생성
  1. values.yaml 작성
  • values.yaml = /templates 내부에 쿠버네티스 YAML에 있는 값을 동적으로 지정할 때 사용하는 파일
  • 일단은 파일이 비어있는 상태로도 설치가 가능하기 때문에 파일만 생성
touch values.yaml
.
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   └── service.yaml
└── values.yaml
2. Usage. Helm Chart 생성
  1. Helm Chart 설치
helm install <이름> <차트_경로> -n <네임스페이스>

실행 결과

# 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 조회

# 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. Usage. Helm Chart 생성

실제 쿠버네티스 배포현황 확인

# 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 삭제

차트 삭제

helm delete <릴리즈된_차트명> -n <네임스페이스>

실행 결과

# helm delete nginx-test -n test

release "nginx-test" uninstalled

이후, helm ls -n test 명령어 실행시 차트가 삭제된 것을 확인할 수 있음

4. Usage. values.yaml으로 템플릿 문법 사용

p13.에서 "values.yaml = /templates 내부에 쿠버네티스 YAML에 있는 값을 동적으로 지정할 때 사용하는 파일" 라고 이야기된 단계에 관한 설명

  • 위 과정을 하기 위해서는 템플릿 문법을 사용해야함
  • 예시로 /templates 내에 deployment.yaml에서 이미지 버전이 현재 latest로 되어있는 것을 외부에서 바꿀 수 있게 변경을 진행
4. Usage. values.yaml으로 템플릿 문법 사용
  1. /templates/*.yaml 수정
...
    spec:
      containers:
      - name: nginx
        image: nginx:{{ .Values.version }}
        ports:
        - containerPort: 80
  1. values.yaml 수정
version: stable
4. Usage. values.yaml으로 템플릿 문법 사용
  1. Helm Chart 설치
helm install nginx-values-test .

실행 결과

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가 바뀐 것을 확인할 수 있다.

k get deploy nginx-test -o yaml
...
      - image: nginx:stable
4. Usage. values.yaml으로 템플릿 문법 사용

Helm Chart로 공개된 오픈소스 문법 참고

5. Usage. Release 템플릿 문법 사용

기존 .Values 템플릿 문법으로는 helm install <차트명>에서 입력되는 차트명까지는 가져오지 못한다.
이러한 문제를 해결해주기 위한 템플릿 문법으로 .Release가 있다.

# 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 }}
...
5. Usage. Release 템플릿 문법 사용
# 2. /templates/service.yaml 릴리즈 템플릿 적용
apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}
spec:
  selector:
    app: {{ .Release.Name }}
  ports:
  - port: 80
    targetPort: 80
  type: ClusterIP
5. Usage. Release 템플릿 문법 사용

Helm Chart 설치 (.Release 문법 적용)

helm install nginx-rename-test . -n test

실행 결과

# 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
5. Usage. Release 템플릿 문법 사용

아래 명령을 실행하면, Helm이 최종적으로 어떤 정보로 릴리즈를 했는지 알 수 있다.

Helm 명명된 릴리스에 대한 모든 정보 조회

helm get all <RELEASE_NAME>
5. Usage. Release 템플릿 문법 사용

실행 결과

# 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) 확인 등 유용
helm history <릴리즈_차트명>
  • Helm Chart 문법 검사
helm lint <차트_경로>
  • Helm /templates + values.yaml 최종 결과를 보여준다.
helm template <차트명> <차트_경로>
  • Helm 차트 릴리즈 업그레이드

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

helm upgrade <릴리즈_차트명> <차트_경로>
7. Usage. values.yaml override
  • 보통의 경우에는 values.yaml을 직접 작성하지 않고, 남이 작성한 파일을 가져오기 때문에 override(덮어쓰기)하여 사용이 된다.
  • 아래의 2가지 방법이 있다.
    • --set 인자 사용
    • -f 옵션으로 파일을 작성
7. Usage. values.yaml override
  1. --set 인자 사용
helm install --set version=1.21.4 -n test nginx-set-test .

실행 결과

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로 된 것을 알 수 있음)

# k get deploy -n test nginx-set-test -o yaml | grep image
...
      - image: nginx:1.21.4
7. Usage. values.yaml override
  1. -f 옵션으로 파일을 작성
helm install -f <파일경로> -n test nginx-file-test .

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

version: stable-alpine

차트 파일 구성

.
├── Chart.yaml
├── override_values.yaml # 추가됨
├── templates
│   ├── deployment.yaml
│   └── service.yaml
└── values.yaml

1 directory, 5 files
7. Usage. values.yaml override

2-2. -f 옵션으로 Helm Chart 설치

helm install -f override_values.yaml -n test nginx-file-test .

실행 결과

NAME: nginx-file-test
LAST DEPLOYED: Sun Nov 21 07:16:31 2021
NAMESPACE: test
STATUS: deployed
REVISION: 1
TEST SUITE: None

배포 결과

# k get deploy -n test nginx-file-test -o yaml | grep image
...
      - image: nginx:stable-alpine
7. Usage. values.yaml override
  • 실제 override 할 때는 각 차트의 configuration 항목을 참조하여 변경 필요한 값만 지정하여 설치
  • 예제. nginx chart
8. Usage. Helm Chart 업그레이드
  • 기존 릴리즈된 차트 내용을 변경 요구시 사용
  • 이력 관리를 위해 사용
  1. Helm Chart 기본 설치
helm install -n test nginx-test .
  • 결과 확인 (revision)
helm get all nginx-test
8. Usage. Helm Chart 업그레이드
  1. Helm Chart 업그레이드
helm upgrade --set version=stable-alpine -n test nginx-test .

image

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

업그레이드시 주의사항

  • Helm 업그레이드시 Pod가 재기동됨(RollingUpdate)
# 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
helm rollback <릴리즈_차트명> <REVISION>

실행 결과

[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로 변경된 것을 알 수 있다.