Helm Chart
Chart의 기본 구조
# helm chart를 로컬에 다운로드
$ helm pull [Chart name]
# 새로운 helm chart 기본 구조를 생성
$ helm create [Chart name]
$ helm create yang
# 디렉터리 및 파일 확인
$ tree yang
Demo (Chart.yaml과 values.yaml, templates 폴더는 고정 포멧)
├── Chart.yaml ------------------------------ chart 정보를 정의한 yaml (EX, # helm show chart bitnami/Demo를 쳤을 때 나오는 정보들이 저장되는 yaml
├── charts ---------------------------------- dependency chart 파일들을 저장하는 디렉터리
├── templates ------------------------------- kubernetes 리소스 템플릿이 보관되는 디렉터리 (templates 폴더 안의 기타 yaml 파일들은 고정적이지 않음)
│ ├── NOTES.txt --------------------------- chart를 설치한 후 출력할 메세지를 정의한 txt 파일(chart의 도움말 helm install 시 사용자에게 표시)
│ ├── _helpers.tpl ------------------------ chart 전체에서 다시 사용할 수 있는 템플릿 헬퍼를 지정
│ ├── deployment.yaml --------------------- kubernetes cluster에 실행할 리소스 템플릿
│ ├── ingress.yaml
│ ├── service.yaml
└── values.yaml ---------------------------------- kubernetes templates file에 적용하는 변수 정의
helm chart 구성하기
nginx chart 만들기
- 클러스터에 실행할 templates yaml 생성하기
$ mkdir chart; cd chart
$ kubectl create deployment yang --image nginx:1.25.2 --port 80 -o yaml > deployment.yaml
$ kubectl expose deployment yang --port 80 --target-port 80 --type NodePort -o yaml > service.yaml
- nginx chart templates 생성하기
## Chart.yaml & values.yaml & templates 생성
# 나만의 helm chart 생성
$ helm create yangnginx
# chart 디렉터리에 구성한 deployment.yaml & service.yaml 복사
$ cp chart/* yangnginx/templates/
## 생성된 yangnginx Chart.yaml
$ vi Chart.yaml
apiVersion: v2
name: yangnginx
description: yang seunghyun chart
type: application
version: 0.1.0
appVersion: "1.16.0"
# 실행 오류 점검
$ helm lint yangnginx/
# yang 이름을 가진 yangnginx helm chart install
$ helm install yang ./yangnginx
NAME: yang
LAST DEPLOYED: Thu Sep 5 22:23:33 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
# kubernetes 상 정상 동작 하는지 확인
$ kubernetes get all
$ helm list
$ kubectl get all
# nignx 호출
$ curl localhost:nodeport # service.yaml을 통해 배포된 nodeport를 입력 (kubectl get svc yang)
# helm chart로 배포한 kubernete 리소스 삭제
$ helm uninstall yang
변수를 설정한 helm chart 구성하기
value.yaml 구성 살펴보기
- yangnginx/value.yaml 설정하기
# cat value.yaml
replicaCount: 1
image:
repository: nginx
tag: 1.25.2
pullPolicy: IfNotPresent
pullSecret:
service:
type: NodePort
- value.yaml 설정 후 templates 디렉터리 안의 yaml 파일 value 설정하기
$ cd /yangnginx/templates
$ vi deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: yang
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: yang
template:
metadata:
labels:
app: yang
spec:
containers:
- image: nginx:1.25.2
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 80
## 아래와 같이 value 설정 변경하기
## 아래와 같이 변경한 value 값은 변수가 정의되어 있는 value.yaml과 매칭된다.
$ vi deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: "deploy-{{ .Release.Name }}"
namespace: default
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: "{{ .Chart.Name }}"
template:
metadata:
labels:
app: "{{ .Chart.Name }}"
spec:
containers:
- image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: "{{ .Values.image.pullPolicy }}"
name: "{{ .Chart.Name }}"
ports:
- containerPort: 80
$ vi service.yaml
apiVersion: v1
kind: Service
metadata:
name: "svc-{{ .Release.Name }}"
namespace: default
spec:
type: "{{ .Values.service.type }}"
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: {{ .Chart.Name }}
# 실행 오류 점검
$ helm lint yangnginx/
# yang 이름을 가진 yangnginx helm chart install
$ helm install yang ./yangnginx ## {{ .Release.Name }}의 값은 install시 정의한 이름인yang으로 값이 들어가게 된다.
NAME: yang
LAST DEPLOYED: Thu Sep 5 22:23:33 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
# kubernetes 상 정상 동작 하는지 확인
$ kubernetes get all
$ helm list
REVISION 1
$ kubectl get all
# nignx 호출
$ curl localhost:nodeport # service.yaml을 통해 배포된 nodeport를 입력 (kubectl get svc yang)
# helm chart로 배포한 kubernete 리소스 삭제
$ helm uninstall yang
helm chart rolling update & rollback
- helm으로 실행한 chart 수정해서 재배포하기
# image nginx -> httpd, tag 1.25.2 -> 2.2.34-alpine으로 변경하기
$ helm upgrade --set image.repository=httpd --set image.tag=2.2.34-alpine yang yangnginx
# 이력 조회, upgrade를 했기때문에 REVISION은 1 -> 2 로 변경됨
$ helm list
REVISION 2
- helm을 이용하여 이전에 배포한 nginx로 다시 rollback하여 재배포
# image httpd -> nginx, tag 2.2.34-alpine -> 1.25.2으로 rollback
# 맨 뒤 1은 helm list로 조회한 REVISION이며 1로 입력시 변경 전 버전으로 돌아가며 이후 REVISION은 3으로 변경됨
$ helm rollback yang 1
$ helm list
REVISION 3
helm chart file 만들기
- 지금까지 만든 helm chart를 tgz 패키지로 압축
$ helm package yangnginx
$ ls yangnginx-0.1.0.tgz ## 0.1.0은 chart.yaml에 정의된 version으로 정의된다.