본문 바로가기

Kubernetes

Helm 3.0

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삭제이슈 있음)
    • 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