helm chart 만들기
0. Helm이란?
헬름은 쿠버네티스 차트를 관리하기 위한 도구이며 차트는 사전 구성된 쿠버네티스 리소스의 패키지다.
헬름은 쿠버네티스 애플리케이션을 패키지 형태로 손쉽게 관리할 수 있도록 도와주는 도구로 디플로이먼트(Deployment), 스테이트풀셋(Statefulset)과 같은 컴퓨팅 자원, 서비스(Service)나 인그레스(Ingress)와 같은 디스커버리/로드밸런싱 자원에 대한 정의를 템플릿 기반의 YAML로 작성하여 배포할 수 있다.
1. chart 기본구조 생성
헬름 차트를 만들어줄 폴더 생성하고
헬름 create 명령어를 통해 차트 기본 디렉토리 생성
mkdir charts
cd charts
helm create 폴더명
생성된 기본 구조는 아래와 같다
폴더명
|-- Chart.yaml
|-- charts
|-- templates
| |-- NOTES.txt
| |-- _helpers.tpl
| |-- hpa.yaml
| |-- deployment.yaml
| |-- ingress.yaml
| |-- service.yaml
| `-- serviceaccount.yaml
`-- values.yaml
이름 | 설명 | |
Chart.yaml | 파일 | Chart에 대한 이름, 버전, 설명 등이 정의된 파일 |
requirements.yaml | 파일 | Chart에 대한 종속 Chart 정보를 정의한 파일 |
values.yaml | 파일 | Chart설치시 사용할 환경변수를 정의한 파일 |
charts/ | 폴더 | Chart에서 사용하는 종속 Chart들이 압축파일(tgz)로 존재함. helm dep up 명령 수행하면 requirements.yaml 참조하여 repository에서 다운받아 생성함 |
templates/ | 폴더 | 설치할 resource 들의 기본 틀을 정의한 manifest yaml파일 |
_helpers.tpl | 파일 | template manifest파일들에서 공유하는 변수 정의 |
2. Yaml파일 작성
2-1. chart.yaml 작성
항목 | 설명 |
apiVersion | Helm자체의 api version으로 항상 "v1"임 (required) |
name | Chart명 (required) |
version | Chart버전으로 SemVer(Semantic versioning)규칙을 준수해야함. 쉽게말해 숫자로 된 X.X.X형식이면 됨. (required) SemVer 규칙은 아래 링크 참조 https://semver.org/lang/ko/ |
kubeVersion | Chart설치와 실행을 보장하는 최소 k8s버전으로 SemVer형식 범위로 정의. ex) ">=1.15.3" (optional) |
description | Chart에 대한 요약 설명 (optional) |
keywords | Chart에 대한 keyword이며, 여러개면 대시(-)로 구분된 새로운 라인으로 정의함. helm search 시 keyword도 같이 검색됨 (optional) |
home | Chart프로젝트의 홈페이지 URL임 (optional) |
sources | Chart소스를 볼 수 있는 URL임. 대시로 구분된 새로운 라인으로 여러개 등록 가능함. Chart repository주소는 아님. (optional) |
maintainers | - name: 저작자 이름 (required for each maintainer) email: 저작자 email (optional for each maintainer) url: 저작자의 개인 페이지 URL (optional for each maintainer) |
engine | gotpl # yaml파일을 생성하는 template엔진명이며 기본값은 gotpl임. (optional, defaults to gotpl) |
icon | SVG 또는 PNG 포맷의 아이콘 URL이며, 카탈로그에서 차트 표시시 사용됨.(optional) |
appVersion | Chart를 이용해 서비스되는 앱의 버전이며 SemVer형식을 따르지 않아도 됨. (optional) |
deprecated | deprecated된 차트인지 여부를 true/false로 명시. (optional, boolean) |
tillerVersion | 보장하는 tiller버전의 SemVer범위. ex) ">2.0.0" (optional) |
2-2. values.yaml
template에서 사용은 {{ .Values.image.tag }} 와 같이 사용 인덴테이션에 유의하여 작성할것.
2-3. templates폴더에 배포할 resource 정의
기본적으로 deployment, service, serviceaccount,ingress 가 존재
필요에 따라 persistentvolume, configmap 등을 정의
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.name }}
labels:
app: {{ .Values.name }}
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
name: {{ .Values.name }}
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
name: {{ .Values.name }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: {{ .Values.container.port }}
protocol: TCP
envFrom:
- configMapRef:
name: {{ .Values.config.name }}
volumeMounts:
- mountPath: {{ .Values.container.mountpath }}
name: {{ .Values.container.volumename }}
volumes:
- name: {{ .Values.container.volumename }}
persistentVolumeClaim:
claimName: {{ .Values.PVC.name }}
* helm의 template문법
{{ }} 로 변수를 사용한다.
- .Values -> values.yaml 파일에서 정의된 변수
- .Charts -> Charts.yaml 파일에서 정의 된 변수
- .Release -> 배포할 때에 할당한 정보들을 사용
(예: --namespeace test 로 install 시 .Release.Namespace 에 test로 할당) - include … -> _helpers.tpl 파일에서 정의된 변수
- -with ~ end -> 변수에 대한 scope을 정하는 문법으로 해당 구간은 . 가 설정한 변수에 속함을 정의
(예: 아래 코드를 보면 .drink 는 .Values.favorite.drink를 의미한다.
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}
food: {{ .food | upper | quote }}
{{- end }}
- - toYaml -> 해당 변수를 yaml형식으로 변경
- quote-> string타입으로 변경
3. Chart 검사하기
정의한 chart가 문법적으로 이상이 없는지 확인
문법적 오류만 점검할 뿐 문제없이 설치된다는 의미가 아님을 유의
helm lint <Chart.yaml 경로>
templates을 기반으로 변수들 참조하여 리소스 배포시 결과 미리보기
해당 과정을 통해 배포하고자하는 형태가 맞나 확인 가능.
helm template <Chart.yaml 경로>
chart를 시험설치하여 오류 확인
helm install <release name> <Chart.yaml경로> --debug --dry-run
--dry-run : 실제 클러스터에 설치 하지 않고 chart를 시험 설치하는 옵션
--debug: 배포를 위한 manifest 파일 내용을 보여줌
4. chart 생성하고 repo에 등록하기
helm repository는 차트 저장소의 각 차트의 대한 정보를 담고 있는 index.yaml파일이 있어야한다.
index.yaml 이 존재하는 폴더에서 아래와 같은 명령어를 통해 패키징하여 chart생성
helm package <Chart.yaml 경로>
Chart.yaml에 정의한 <name>-<version>.tgz 로 압축파일이 생성
* 저장소에 등록하지않고 생성한 압축파일로 로컬에서 사용할거라면 helm install <name> 가능하다.
chart를 생성하였으니 차트정보를 담고있는 index파일 업데이트
helm repo index <index파일 경로>
깃헙repository인경우 git push를 진행한 후,
helm repo update
chart목록을 repository에서 다시 가져와 업데이트를 진행.
업데이트되었는지 검색하여 확인을 진행.
helm search repo 차트명
검색단어는 키워드 정도로 해당단어가 포함돠는 차트와 차트의 repository 목록이 출력된다.
5. 생성한 Chart를 이용해 설치하기
생성한 차트를 아래 명령어로 설치한다.
helm install 배포할이름 레포지토리명/chart명 -n 네임스페이스
참고
https://velog.io/@koseungbin/Helm-Template
Helm Template
eq, ne, lt, gt, and, or, not 조건 오퍼레이션 제공{{- : 줄바꿈 포함한 왼쪽 공백 모두 제거\-}} : 줄바꿈 포함한 오른쪽 공백 모두 제거위 템플릿은 아래와 같이 공백을 포함해 렌더링됨.공백을 제거하
velog.io
https://happycloud-lee.tistory.com/5
2. Helm chart 생성, 테스트, 패키징, Helm Repository에 배포하기
이전 장에서는 기존에 미리 만들어진 chart를 설치/업그레이드/배포하는 방법을 설명했습니다. 이제 직접 helm chart를 만들어 Repository에 배포까지 하는 방법을 배워 보겠습니다. 각 단계별 사용하
happycloud-lee.tistory.com