비유를 한다면 개발자가 Docker Registry에서 검색하여 쉽게 이미 셋팅된 컨테이너 환경을 실행하듯이 Helm에서 검색하여 이미 셋팅된 쿠버네티스 환경을 실행한다라고 이해하면 되지 않을 듯 싶다. ex. Dockerhub처럼 ArtifactHub에서 많은 템플릿이 등록되고 공유되고 있다.
Dockerhub
ArtifactHub
컨테이너 환경을 Dockerfile로 구성 하는 것처럼 Helm도 차트로 구성을 한다.
Dockerfile
차트
Helm Chart를 생성하기 위해서는 위에서 설명한 구조의 파일들을 생성할 필요가 있음
nginx 템플릿을 단계별로 구성하여 따라해보기
/templates
deployment, service YAML은 뒤에 작성
. └── templates ├── deployment.yaml └── service.yaml
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
service.yaml
apiVersion: v1 kind: Service metadata: name: nginx-test spec: selector: app: nginx-test ports: - port: 80 targetPort: 80 type: ClusterIP
Chart.yaml
apiVersion: v2 # 차트 API 버전 (필수) name: nginx-test # 차트명 (필수) version: 0.0.1 # SemVer 2 버전 (필수)
현재 파일 구성
. ├── Chart.yaml └── templates ├── deployment.yaml └── service.yaml
values.yaml
touch values.yaml
. ├── Chart.yaml ├── templates │ ├── deployment.yaml │ └── service.yaml └── values.yaml
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
실제 쿠버네티스 배포현황 확인
# 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
helm delete <릴리즈된_차트명> -n <네임스페이스>
# helm delete nginx-test -n test release "nginx-test" uninstalled
이후, helm ls -n test 명령어 실행시 차트가 삭제된 것을 확인할 수 있음
helm ls -n test
p13.에서 "values.yaml = /templates 내부에 쿠버네티스 YAML에 있는 값을 동적으로 지정할 때 사용하는 파일" 라고 이야기된 단계에 관한 설명
latest
/templates/*.yaml
... spec: containers: - name: nginx image: nginx:{{ .Values.version }} ports: - containerPort: 80
version: stable
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
기존 .Values 템플릿 문법으로는 helm install <차트명>에서 입력되는 차트명까지는 가져오지 못한다. 이러한 문제를 해결해주기 위한 템플릿 문법으로 .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 }} ...
# 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 문법 적용)
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
아래 명령을 실행하면, Helm이 최종적으로 어떤 정보로 릴리즈를 했는지 알 수 있다.
Helm 명명된 릴리스에 대한 모든 정보 조회
helm get all <RELEASE_NAME>
# 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
helm history <릴리즈_차트명>
helm lint <차트_경로>
helm template <차트명> <차트_경로>
추후 과정에서 더 자세히 설명
helm upgrade <릴리즈_차트명> <차트_경로>
--set
-f
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로 된 것을 알 수 있음)
version
stable
# k get deploy -n test nginx-set-test -o yaml | grep image ... - image: nginx:1.21.4
helm install -f <파일경로> -n test nginx-file-test .
2-1. override_values.yaml 파일을 아래와 같이 작성
override_values.yaml
version: stable-alpine
차트 파일 구성
. ├── Chart.yaml ├── override_values.yaml # 추가됨 ├── templates │ ├── deployment.yaml │ └── service.yaml └── values.yaml 1 directory, 5 files
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
configuration
helm install -n test nginx-test .
helm get all nginx-test
helm upgrade --set version=stable-alpine -n test nginx-test .
REVISION
# 1 helm upgrade --set version=stable-alpine -n test nginx-test . # 2 helm upgrade -n test nginx-test .
위 과정을 진행하면, helm 버전에 따라 values.yaml참고가 다르다.
revision
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