Helm 3.0
Helm: 템플릿 파일들의 집합(차트)을 관리하는 쿠버네티스 패키지 매니저 도구
- 차트, 차트압축파일 생성가능
- 차트 저장소와 연결해 k8s 클러스터에 차트를 설치하거나 삭제 가능
- helm 차트들의 배포 주기 관리 가능
개념
- chart: 쿠버네티스에서 실행할 애플리케이션을 만드는데 필요한 정보의 묶음
- config: 패키징한 차트에 넣어서 배포 가능한 오브젝트를 만들 때 사용할 수 있는 설정
- release: 특정 config를 이용해 실행중인 차트의 인스턴스
구성
- helm client
- local에서 차트를 만들고 차트 저장소를 관리할 수 있음
- tiller server와 통신해 k8s 클러스터에 설치하려는 차트를 보내기
- 현재 클러스터에 실행중인 애플리케이션 release정보 요청 or 실행중인 release 업그레이드, 삭제 요청 tiller로 보내기
- tiller server(helm1,2): 쿠버네티스 클러스터 안에서 helm client의 명령을 받아(helm client와 gRPC로 통신) Kubernetes API와 통신
- helm client요청을 처리하려고 대기하거나 요청이 오면 클러스터에 실행할 release 만들기위해 chart와 config 조합/cluster에 chart설치/release관리
Helm3
- Helm2가 런칭됐을 때 Kubernetes는 Role-Based Access Control(RBAC)가 존재하지 않았음
- 따라서 Helm은 chart를 배포하기 위한 Tiller 컴포넌트를 포함시켰음
- Kubernetes 버전업(Kubernetes 1.6부터) 되면서 RBAC가 디폴트로 활성화되어 있고, Tiller를 사용하면 사용자가 Access Control을 우회할 수 있게됨.
- 따라서 Helm3부터 보안에 취약한 Tiller가 삭제됨
- 달라진점
- Helm3에서는 Kubernetes API Server에서 직접 정보를 가져와 Charts 클라이언트 측을 렌더링하고 Kubernetes에 installation 기록을 저장시킴
- Helm의 permission은 kubeconfig 파일로 평가됨 → 사용자 권한 제한 가능
- Helm3는 3way Strategic Merge patch 사용: old manifest, live state, new manifest 고려해서 patch 생성 (기존 pod3, "kubectl scale --replicas=0 디플로이먼트"로 scale down시에도 rollback하면 old manifest=3, live state=0, new manifest=3이므로 3으로 rollback)
- Helm2는 2way Strategic Merge paptch 사용
- helm upgrade업그레이드 중 가장 최신 chart의 메니페스트를 제안된 chart의 메니페스트와 비교, 두 chart를 비교해서 resource에 반영될 것 판단 (사이드카 pod삭제이슈 있음)
- Helm2는 2way Strategic Merge paptch 사용
- Release 이름이 Namespace에 scoped됨
- Tiller가 사라짐에 따라 release 정보를 보관할 곳이 필요해짐. Helm2에서는 틸러와 같은 namespace에 저장되어있었음. 즉, 이름이 같은 release는 다른 namespace에 배포되더라도 동일한 이름을 사용할 수 없음.
- Helm3에서는 특정 release 정보가 release 자체와 동일한 namespace에 저장됨.
- Secrets가 default storage driver로 사용됨
- Helm2는 release 정보 저장에 ConfigMaps를 기본으로 사용했었지만, Helm3는 Secrets를 기본으로 사용.
Charts
mychart/
chart.yaml
values.yaml
charts/
templates/
...
- templates/ 디렉토리는 템플릿 파일들이 위치해 있으며 Helm이 차트를 평가할 때 모든 템플릿파일을 template rendering engine으로 보낸다. 그 결과를 kubernetes로 보낸다.
- values.yaml 파일은 차트의 default values를 포함한다.
- Chart.yaml 파일은 차트의 description을 포함한다. subcharts를 포함할 수도 있다.
helm create [chartName]
helm install [release name] ./[chartName] #install chart
helm get manifest [release name] # template 보기
helm install --dry-run --debug [release name] ./[chartName] #install with 디버깅
Template Functions and Pipelines
{{ }} : 이를 이용해 values.yaml의 value값을 참조할 수 있다.
Template function: functionName arg1 arg2... 로 사용 가능
Pipelines
- 여러 작업을 순서대로 수행하는 효율적인 방법
- " | "를 사용해 function chain을 엮을 수 있음.
default function
- 템플릿 내부에 기본 값 지정 가능
- values.yaml에 지정되야하지만, if 컨디셔널 guard에는 적합함.
lookup function
- running cluster의 리소스를 look up 해야할 때 필요
(lookup "v1" "Namespace" "" "mynamespace").metadata.annotations
- lookup이 list of objects를 반환하면 items 필드로 object 접근
{{ range $index, $service := (lookup "v1" "Service" "mynamespace" "").items }}
{{/* do something with each service */}}
{{ end }}
- object가 없으면 empty value가 반환되니 object가 존재하는지 판단하는데 쓸 수 있음.
- helm template, helm install | update | delete | rollback --dry-run 명령중에는 Kubernetes API Server와 연결되지 않으므로 lookup function이 empty list를 반환할 것
- Template Function List
Flow Control
Control structure ("actions"로도 불림)는 템플릿 작성자에게 템플릿 생성 흐름을 제어할 수 있는 기능을 제공함.
- if / else : conditional block 생성
- with: specify scope
- range: for-each 스타일 루프 제공
- define: 새로운 이름의 template을 내부에 정의
- template: named 템플릿을 import
- block: 특별한 종류의 fillable template 영역 제공
If/Else
{{ if PIPELINE }}
# Do something
{{ else if OTHER PIPELINE }}
# Do something else
{{ else }}
# Default case
{{ end }}
boolean false, numeric zero, empty string, nil(empty or null), empty collection 일때 pipeline 이 false로 판단
Controlling Whitespace
템플릿 엔진이 실행되면 {{ 와 }} 사이의 내용은 삭제하지만 whitespace는 그대로 둠
{{- 는 왼쪽 whitespace를 삭제, -}}는 오른쪽 whitespace 삭제
{{- 3 }} : 왼쪽 빈칸을 trim하고 3을 출력 {{-3 }}: -3 출력 |
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink | default "tea" | quote }}
food: {{ .Values.favorite.food | upper | quote }}
{{- if eq .Values.favorite.drink "coffee" }} # 뉴라인 삭제
mug: "true"
{{- end }} # 뉴라인 삭제
indent function: ({{ indent 2 "mug:true" }}).
삭제될 각 공백을 "*"로 대체가능
Modifying scope using with
".": current scope을 나타냄
{{ with PIPELINE }}
# restricted scope
{{ end }}
with은 current scope(.)을 특별한 object로 셋팅해줌.
ex) . → .Values.favorite
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}
food: {{ .food | upper | quote }}
release: {{ $.Release.Name }} # $는 root scope에 매핑되어 with 구문 안에서 사용가능
{{- end }}
Looping with the range action
#values.yaml
favorite:
drink: coffee
food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
#configmap
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}
food: {{ .food | upper | quote }}
{{- end }}
toppings: |-
{{- range .Values.pizzaToppings }}
- {{ . | title | quote }}
{{- end }}
Variables
- Variables는 $name, :=로 assign 가능
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
{{- $relname := .Release.Name -}} # Variable assign함
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}
food: {{ .food | upper | quote }}
release: {{ $relname }} #참조, with 블럭내에서도 사용가능
{{- end }}
Named Templates
- templates/ 안의 파일들은 Kubernetes manifests를 포함한다고 여겨짐
- NOTES.txt는 예외
- _로 시작하는 파일들은 manifest를 포함하지 않는다고 여겨짐, 하지만 다른 차트 템플릿이 사용할 수 있게 어디서나 available
define, template
define은 템플릿 파일 안에 named 템플릿을 생성할 수 있게 해줌
{{ define "MY.NAME" }}
# body of template here
{{ end }}
예시
#_helpers.tpl
{{/* Generate basic labels */}}
{{- define "mychart.labels" }}
labels:
generator: helm
date: {{ now | htmlDate }}
{{- end }}
#configMap
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
{{- template "mychart.labels" }}
data:
myvalue: "Hello World"
{{- range $key, $val := .Values.favorite }}
{{ $key }}: {{ $val | quote }}
{{- end }}
#final ConfigMap template
apiVersion: v1
kind: ConfigMap
metadata:
name: running-panda-configmap
labels:
generator: helm
date: 2016-11-02
data:
myvalue: "Hello World"
drink: "coffee"
food: "pizza"
'Kubernetes' 카테고리의 다른 글
Kubernetes Operator (0) | 2022.11.24 |
---|---|
Kubernetes In Action 정리 (1) | 2022.09.06 |