Search
Duplicate
📒

[Kubernetes Infra] 12-2. Helm

상태
완료
수업
Kubernetes Infra
주제
4 more properties
참고

HELM 가이드

NOTE
HELM은 쿠버네티스용 패키지 관리자이며 쿠버네티스 애플리케이션을 정의, 설치, 업데이트 하기 위한 도구이다!
Helm Chart 구조
현업에서는 애플리케이션을 실행하기 위해 쿠버네티스 리소스가 여러 개 필요한 경우가 많다. 파드의 노출을 담당하는 서비스 애플리케이션 설정에 관련된 컨피그맵, 기밀 정보를 다루는 시크릿 등을 하나의 애플리케이션에 포함하는것이 대표적이다. 이렇게 다양한 리소스를 하나의 패키지로 관리하는 도구가 헬름이다.
리눅스 환경에서 yum, apt등이 애플리케이션에 필요한 라이브러리를 패키지로 제공하는것과 유사하다.
HELM은 크게 3가지의 개념으로 구성된다.
Chart(패키지): 쿠버네티스용 애플리케이션 패키지
Repository(저장소): 차트를 모아두고 공유하는 장소이다.
Release(인스턴스): HELM 차트를 통해 배포된 애플리케이션

Helm의 장점

관리 복잡성 해소
Helm Chart는 복잡한 애플리케이션을 쉽게 설치 및 반복 설치하도록 패키징
Helm을 통해 여러 오브젝트를 한번에 배포하도록 구성하여 복잡성 해소
업데이트 용이
배포된 애플리케이션에 대한 설정 변경 후 업데이트가 용이
ex) helm upgrade
쉬운 공유
Helm 차트는 개인, 공용의 커스텀 Helm Repository에 패키징해 쉬운 공유가 가능하다.
공식적인 특정 Helm Repository에서 공개 된 차트로 쿠버네티스에 바로 배포할 수 있다.
버전 관리
Helm을 통해서 설치하고 업데이트 할 때마다 Revision으로 버전관리
ex) helm rollout, helm histroy

kubectl vs kustomize vs helm

kubectl
추가 설치없이 바로 사용할 수 있으며, 오브젝트 생성과 이벤트 등의 정보를 확인할 수 있다.
kubectl은 정의된 manifest파일을 그대로 배포하기 때문에 오브젝트 관리/배포에 쓰는것이 좋다.
kustomize
오브젝트를 사용자의 의도에 따라 유동적으로 배포할 수 있다.
별도의 커스터마이즈 실행 파일을 활용해 커스터마이즈 명세를 따르는 yaml파일을 생성할 수 있으며 yaml파일이 이미 존재한다면 Kubectl로 배포할 수 있는 -k옵션도 존재한다.
커스터마이즈는 명세와 관련된 yaml파일에 변수나 템플릿을 사용하지는 않지만, 명령어로 배포 대상 오브젝트의 이미지 태그와 레이블 같은 명세를 변경하거나 일반 파일을 이용해 컨피그맵과 시크릿을 생성하는 기능을 지원한다.
helm
오브젝트 배포에 필요한 사양이 이미 정의된 chart라는 패키지를 활용한다.

HELM 설치

NOTE
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.sh
Bash
복사
shell 설치방법
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null sudo apt-get install apt-transport-https --yes echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list sudo apt-get update sudo apt-get install helm
Bash
복사
패키지 매니저 설치

HELM 구성요소

NOTE
# 헬름 차트 디렉터리 my-chart/ ├── charts/ # 의존하는 Helm 차트들을 포함하는 디렉토리 ├── templates/ # Kubernetes YAML 매니페스트 템플릿을 포함하는 디렉토리 │ ├── deployment.yaml # 배포 매니페스트 템플릿 │ ├── service.yaml # 서비스 매니페스트 템플릿 ├── values.yaml # Helm 차트의 기본값을 정의하는 파일 ├── Chart.yaml # Helm 차트의 메타데이터를 정의하는 파일 └── README.md # Helm 차트에 대한 설명을 포함하는 파일
Bash
복사
HELM 구성요소
헬름은 템플릿을 사용해 설치와 관련된 파일을 관ㄹ리하며, 템플릿파일에서 공통으로 사용하는 변수를 단일 vaules.yaml파일에서 관리한다. 해당 파일만 수정하면 전체 템플릿에서 사용하는 변수를 한꺼번에 수정할 수 있다!

vaules.yaml 예제

favoriteDring: coffee
YAML
복사
vaules.yaml
apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: "Hello World" drink: {{ .Vaules.favoriteDrink }} # 해당 값이 coffee로 변경됨!
YAML
복사
Chart.yaml

Helm Chart 명령어

NOTE
# 차트 설치 helm install [helm repo명]/[공식 helm charts 릴리즈명] 옵션 # 레포 참조 helm install [배포될 helm chart 릴리즈명] [helm chart 파일 경로] # 파일 참조 --version chart의 버전을 지정 --set 해당 옵션으로 값 설정 --namespace 네임스페이스 설정 # 설치된 차트 목록 보기 helm list helm ls # 설치된 차트의 상태 확인 helm status [배포된 helm 릴리즈명] # 차트 업그레이드 helm upgrade [배포된 helm chart 릴리즈명] [helm repo명]/[공식 helm chart 릴리즈명] 옵션 helm upgrade [배포된 helm chart 릴리즈명] [helm chart 파일 경로] # 차트의 변경 내역 확인 helm history [배포된 helm chart 릴리즈명] # 차트 롤백 helm rollback [배포된 helm chart 릴리즈명] [롤백할 번호] # 차트 다운로드 helm fetch --untar [helm repo명]/[공식 helm chart 릴리즈명] --version [버전] # 차트 삭제 helm delete [배포된 helm chart 릴리즈명] helm uninstall [배포된 helm chart 릴리즈명] # 리포지토리에서 차트의 특정 버전 정보 보기 helm show chart [REPO_NAME]/[CHART_NAME] --version [VERSION] # 리포지토리에서 차트의 설치 정보(README) 보기 helm show readme [REPO_NAME]/[CHART_NAME] # 리포지토리에서 차트의 값(value) 정보 보기 helm show values [REPO_NAME]/[CHART_NAME] # 차트의 종속성 업데이트 # 이 명령은 차트의 Chart.yaml에 명시된 종속성을 다운로드하고 업데이트합니다. helm dependency update [CHART_PATH]
Bash
복사

Helm Chart 실습

NOTE
helm repo add stable https://charts.helm .sh/stable helm repo add test-repo https://charts.bitnami.com/bitnami helm repo update helm repo list # nginx 검색 helm seach repo nginx helm install nginx test-repo/nginx --version 15.12.2 helm ls helm status nginx # 업그레이드 helm upgrade nginx test-repo/nginx --version [버전] helm ls # 롤백 helm history nginx helm rollback nginx 1 # 파일 가져오기 helm fetch --untar test-repo/nginx --version 15.12.2 # 삭제 helm uninstall nginx
Bash
복사
helm create test # Chart.yaml 설명(버전, 이름, 타입..) # values.yaml 설명(변수값) helm lint . # 문법 검사 helm template . # yaml출력 helm package test # tgz압축 tar xvfz test-0.1.0.tgz
Bash
복사

HELM 차트 문법

NOTE
helm 차트는 values.yaml, Chart.yaml, template으로 구성되며 template 폴더에는 k8s 배포에 필요한 다양한 리소스가 정의되어 있습니다.
helm배포에는 Values, Releaset, Chart와 같은 다양한 데이터를 사용할 수 있습니다. 아래의 예시 코드를 살펴봅시다.
apiVersion: v1 kind: ConfigMap metadata: name: built-in-object data: # Release 정보 .Release: ______________________________________ .Release.Name: {{ .Release.Name }} .Release.Namespace: {{ .Release.Namespace }} .Release.IsUpgrade: "{{ .Release.IsUpgrade }}" .Release.IsInstall: "{{ .Release.IsInstall }}" .Release.Revision: "{{ .Release.Revision }}" .Release.Service: {{ .Release.Service }} # Values 정보 .Values: ______________________________________ .Values.replicaCount: "{{ .Values.replicaCount }}" .Values.image.repository: {{ .Values.image.repository }} .Values.image.pullPolicy: {{ .Values.image.pullPolicy }} .Values.service.type: {{ .Values.service.type }} .Values.service.port: "{{ .Values.service.port }}" # Chart 정보 .Chart: ______________________________________ .Chart.Name: {{ .Chart.Name }} .Chart.Description: {{ .Chart.Description }} .Chart.Type: {{ .Chart.Type }} .Chart.Version: {{ .Chart.Version }} .Chart.AppVersion: {{ .Chart.AppVersion }} # Template 정보 .Template: ______________________________________ .Template.BasePath: {{ .Template.BasePath }} .Template.Name: {{ .Template.Name }}
YAML
복사
Release: 인스턴스의 정보를 가지고 있습니다.
Name: 릴리스 이름
NameSpace: 릴리스될 네임스페이스
IsUpgrade: 현재 작업이 업그레이드 또는 롤백인 경우 true
IsInstall: 현재 작업이 설치일 경우 true
Revision: 이 릴리스의 리비전 번호, 설치에는 이 값이 1이며 업그레이드나 롤백을 수행할 때마다 증가한다.
Service: 현재 템플릿을 렌더링하는 서비스. Helm에서는 항상 Helm
Values: 사용자가 values.yaml 혹은 --set 옵션을 통해 제공한 값들을 포함합니다.
Chart: 차트 자체에 대한 메타데이터(Chart.yaml)를 제공합니다.
Template: 현재 템플릿에 대한 정보를 포함합니다.
BasePath: 현재 템플릿의 경로
Name: 현재 처리 중인 템플릿 파일의 이름
# Source: mychart/templates/cm-object.yaml apiVersion: v1 kind: ConfigMap metadata: name: built-in-object data: .Release: ______________________________________ .Release.Name: mychart .Release.Namespace: default .Release.IsUpgrade: "false" .Release.IsInstall: "true" .Release.Revision: "1" .Release.Service: Helm .Values: ______________________________________ .Values.replicaCount: "1" .Values.image.repository: nginx .Values.image.pullPolicy: IfNotPresent .Values.service.type: ClusterIP .Values.service.port: "80" .Chart: ______________________________________ .Chart.Name: mychart .Chart.Description: A Helm chart for Kubernetes .Chart.Type: application .Chart.Version: 0.1.0 .Chart.AppVersion: 1.16.0 .Template: ______________________________________ .Template.BasePath: mychart/templates .Template.Name: mychart/templates/cm-object.yaml
YAML
복사
실제 코드

function & pipeline

NOTE
Helm에는 Go 템플릿 언어의 함수와 파이프라인을 활용하여 템플릿의 유연성과 표현력을 증대시킬 수 있습니다.
func: enabled: true replicaCount: 3 image: repository: nginx pullPolicy: Always service: type: LoadBalancer port: 80
YAML
복사
values.yaml
apiVersion: v1 kind: ConfigMap metadata: name: example-configmap data: # 1. quote: 값을 문자열로 인용하여 저장합니다. enabledQuote: '{{ .Values.func.enabled | quote }}' # "true" # 2. upper: 값을 대문자로 변환한 후 인용합니다. enabledUpper: '{{ .Values.func.enabled | quote | upper }}' # "TRUE" # 3. lower: 값의 소문자 변환 후 인용합니다. repositoryLower: '{{ .Values.image.repository | lower | quote }}' # "nginx" # 5. trim: 값을 자르고 공백을 제거합니다. trimmedPullPolicy: '{{ .Values.image.pullPolicy | trim | quote }}' # "Always" # 6. toJson: JSON 문자열로 변환합니다. serviceToJson: '{{ .Values.service | toJson }}' # {"type":"LoadBalancer","port":80} # 7. toYaml: YAML 문자열로 변환합니다. # nindent: 2칸 들여쓰기를 적용 serviceToYaml: | {{- .Values.service | toYaml | nindent 2 }} # type: LoadBalancer # port: 80 # 8. required: 필수 값 검증 (필드가 없을 경우 에러 발생) requiredServiceType: '{{ required "The .Values.service.type field is required" .Values.service.type }}'
YAML
복사
파이프라인(’|’)은 함수의 결과를 다른 함수로 전달할 때 사용합니다. 이를 통해 여러 함수를 연쇄적으로 적용할 수 있습니다.

typeIs

NOTE
typeIs 함수는 값의 타입을 확인하는데 사용되며, 특정 타입에 따라 다른 동작을 수행하고 싶을 때 사용됩니다.
configData: stringExample: "Hello, Helm!" listExample: ["item1", "item2", "item3"] mapExample: key1: "value1" key2: "value2"
YAML
복사
apiVersion: v1 kind: ConfigMap metadata: name: example-configmap data: # typeIs를 사용하여 데이터 타입 확인 {{- if typeIs "string" .Values.configData.stringExample }} stringData: "{{ .Values.configData.stringExample }}" {{- end }} {{- if typeIs "list" .Values.configData.listExample }} listData: | {{- range .Values.configData.listExample }} - {{ . }} {{- end }} {{- end }} {{- if typeIs "map" .Values.configData.mapExample }} mapData: | {{- range $key, $value := .Values.configData.mapExample }} {{ $key }}: {{ $value }} {{- end }} {{- end }}
YAML
복사

조건문

NOTE
Helm에는 Go 템플릿 언어의 함수와 파이프라인을 활용하여 템플릿의 유연성과 표현력을 증대시킬 수 있습니다.
replicaCount: 2 image: repository: nginx tag: stable pullPolicy: IfNotPresent useCustomImage: false customImage: repository: mycustom/nginx tag: latest environment: useSpecialFeature: true featureName: "SPECIAL_FEATURE"
YAML
복사
values.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: example-deployment spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app: example template: metadata: labels: app: example spec: containers: - name: nginx # if-else 조건문을 사용하여 이미지를 동적으로 선택 image: {{ if .Values.useCustomImage }}{{ .Values.customImage.repository }}:{{ .Values.customImage.tag }}{{ else }}{{ .Values.image.repository }}:{{ .Values.image.tag }}{{ end }} imagePullPolicy: {{ .Values.image.pullPolicy }} # if 조건문을 사용하여 특정 환경 변수 추가 {{- if .Values.environment.useSpecialFeature }} env: - name: {{ .Values.environment.featureName }} value: "true" {{- end }}
YAML
복사
구문 시작시 - 가 들어가는 이유는 구문이 있는 부분에 공백, 개행이 들어가기 때문이다.
dev: env: "dev" # 환경 설정 (예: "dev", "staging", "prod") log: "info" # 로그 레벨 설정 (예: "debug", "info", "error") prod: env: "prod" performance: "high
YAML
복사
apiVersion: v1 kind: ConfigMap metadata: name: example-configmap data: # eq를 사용하여 환경이 "dev"인지 확인 {{- if eq .Values.dev.env "dev" }} log: "debug" {{- else if eq .Values.dev.env "staging" }} log: "info" {{- else if eq .Values.dev.env "prod" }} log: "error" {{- end }} # gt, lt를 사용하여 성능 설정을 비교 {{- if eq .Values.prod.env "prod" }} {{- if gt (len .Values.prod.performance) 4 }} performance: "high" {{- else }} performance: "standard" {{- end }} {{- end }}
YAML
복사

with, range

NOTE
with의 경우 현재 컨텍스트를 변경하는데 사용되며, 중첩된 객체 속성에 더 쉽게 접근하기 위해 사용합니다. range의 경우에는 반복문을 만드는데 사용합니다.
appConfig: settings: color: "blue" size: "large" features: - name: "feature1" enabled: true - name: "feature2" enabled: false people: Alice: age: 30 city: "New York" Bob: age: 25 city: "San Francisco"
YAML
복사
values.yaml
apiVersion: v1 kind: ConfigMap metadata: name: example-configmap data: # with를 사용하여 appConfig.settings의 값을 local scope로 설정 {{- with .Values.appConfig.settings }} settings: | color: {{ .color }} # .color는 appConfig.settings.color를 참조 size: {{ .size }} # .size는 appConfig.settings.size를 참조 {{- end }} # range를 사용하여 appConfig.features를 반복 처리 features: | {{- range .Values.appConfig.features }} - name: {{ .name }} # .name은 각 feature의 name을 참조 enabled: {{ .enabled }} # .enabled는 각 feature의 enabled 상태를 참조 {{- end }} # range를 사용하여 .Values.appConfig.people 맵의 각 키-값 쌍을 반복 처리 people: | {{- range $name, $info := .Values.appConfig.people }} - Name: {{ $name }} # $name은 각 사람의 이름을 참조 Age: {{ $info.age }} # $info.age는 각 사람의 나이를 참조 City: {{ $info.city }} # $info.city는 각 사람의 도시를 참조 {{- end }}
YAML
복사
|으로 시작하는 이유는 멀티 라인 스트링을 시작하기 위해서입니다. 다수의 설정 값이 여러 줄에 걸쳐 나타나야 할 때 유용합니다.
Helm 템플릿에서 생성된 각 줄은 올바르게 들여쓰기가 되어야만 합니다. 파이프 기호 뒤에 오는 텍스트는 파이프 기호 자체에 의해 정의된 들여쓰기 수준을 유지합니다.