이야기박스

Kubernetes. Helm3 본문

Computer & Data/Orchestration

Kubernetes. Helm3

박스님 2020. 1. 10. 17:36
반응형

# Overview

  • Helm이란
  • Helm2 --> Helm3 바뀐 점
  • Helm3 사용법

# Helm이란

간단한 애플리케이션이라도 Kubernetes로 구성하다 보면 수많은 yaml 파일이 생겨나게 됩니다. helm은 이렇게 많이 생겨나는 yaml 파일을 간편하게 배포할 수 있게 해 줍니다. 또한 Kubernetes의 주 목적인 다양한 환경(클러스터)에서 간단한 설정의 변경만 가지고도 배포할 수 있게 도와줍니다.

이러한 기능을 가진 Helm은 Template, 설정 파일 등의 파일의 모음이라고 생각하시면 됩니다. 이 파일 모음을 Helm Chart라고 부릅니다.

# Change since Helm2

Helm Docs Reference

 

Frequently Asked Questions

Frequently Asked Questions This page provides help with the most common questions about Helm. We’d love your help making this document better. To add, correct, or remove information, file an issue or send us a pull request. Changes since Helm 2 Here’s an e

helm.sh

Helm은 2 버전에서 3 버전으로 넘어가면서 다양한 변화가 생겼습니다. 그중 유의 깊게 보아야 하는 내용이 Tiler가 사라진 것입니다. 자세한 내용은 위에 링크에서 확인하실 수 있습니다.

 

Removal of Tiler

Helm2에서는 Tiler라고 하는 서비스 계정을 통해 배포 사이클을 생성, 관리하였습니다. 하지만 Kubernetes 1.6 버전 이후 RBAC(Role-Based Access Contorls)의 도입으로 Tiler 사용에 메리트가 크게 사라졌고 Helm3에서는 Kubernetes API Server에 직접 연결하는 방법으로 배포 사이클을 동작시키고 있습니다.

 

# Helm3 Guide

Helm의 설치와 차트에 대한 간단한 설명을 다루어 보았습니다.

1. Helm Install

Helm Release

 

helm/helm

The Kubernetes Package Manager. Contribute to helm/helm development by creating an account on GitHub.

github.com

2. Helm Chart

Helm을 사용하기 위하여는 Chart 생성이 필요합니다. Chart는 다음과 같은 파일들의 묶음으로 이루어져 있습니다.

 

The Chart File Structure

wordpress/
  Chart.yaml          # A YAML file containing information about the chart
  LICENSE             # OPTIONAL: A plain text file containing the license for the chart
  README.md           # OPTIONAL: A human-readable README file
  values.yaml         # The default configuration values for this chart
  values.schema.json  # OPTIONAL: A JSON Schema for imposing a structure on the values.yaml file
  charts/             # A directory containing any charts upon which this chart depends.
  crds/               # Custom Resource Definitions
  templates/          # A directory of templates that, when combined with values,
                      # will generate valid Kubernetes manifest files.
  templates/NOTES.txt # OPTIONAL: A plain text file containing short usage notes

## Chart.yaml

apiVersion: The chart API version (required)
name: The name of the chart (required)
version: A SemVer 2 version (required)
kubeVersion: A SemVer range of compatible Kubernetes versions (optional)
description: A single-sentence description of this project (optional)
type: It is the type of chart (optional)
keywords:
  - A list of keywords about this project (optional)
home: The URL of this project's home page (optional)
sources:
  - A list of URLs to source code for this project (optional)
dependencies: # A list of the chart requirements (optional)
  - name: The name of the chart (nginx)
    version: The version of the chart ("1.2.3")
    repository: The repository URL ("https://example.com/charts")
maintainers: # (optional)
  - name: The maintainer's name (required for each maintainer)
    email: The maintainer's email (optional for each maintainer)
    url: A URL for the maintainer (optional for each maintainer)
icon: A URL to an SVG or PNG image to be used as an icon (optional).
appVersion: The version of the app that this contains (optional). This needn't be SemVer.
deprecated: Whether this chart is deprecated (optional, boolean)

Versioning

Sematinc Versioning 2를 따르고 있습니다.

Note. SV2 - {major}.{minor}.{patch}

Chart.yaml에 정의되는 version 필드의 내용을 가져와 Helm의 버전을 명시합니다.

이 버전이 중요한 이유는 히스토리 관리 때문입니다. Helm은 Revision을 가지고 있고 문제 발생 시 이 History를 통하여 롤백을 진행할 수 있습니다. 단, Versioning이 구분되어 있지 않다면 Revision 히스토리 관리에 어려움이 발생하겠죠?

 

apiVersion

Helm3을 사용하기 위해서는 apiVersion 필드에 v2 API를 사용하여야 합니다.

 

## Templates And Values

Helm Chart는 Go Template Language로 작성되어서 파라미터를 {{ .Values.values }} 형식으로 넘겨줄 수 있습니다. 이를 통해 다양한 환경에 특정 설정 값들만 변경하며 배포를 할 수 있습니다.

Kubernetes Resource Template 파일들은 templates/ 경로에 저장되고 사용자 값들은 루트 경로에 있는 values.yaml 파일에 저장됩니다.

 

사용자가 지정하는 Values 이외에 기본적으로 제공되는 값들은 다음과 같습니다.

predefined values

Release.Name: The name of the release (not the chart)
Release.Namespace: The namespace the chart was released to.
Release.Service: The service that conducted the release.
Release.IsUpgrade: This is set to true if the current operation is an upgrade or rollback.
Release.IsInstall: This is set to true if the current operation is an install.
Chart: The contents of the Chart.yaml. Thus, the chart version is obtainable as Chart.Version and the maintainers are in Chart.Maintainers.
Files: A map-like object containing all non-special files in the chart. This will not give you access to templates, but will give you access to additional files that are present (unless they are excluded using .helmignore). Files can be accessed using {{ index .Files "file.name" }} or using the {{ .Files.Get name }} or {{ .Files.GetString name }} functions. You can also access the contents of the file as []byte using {{ .Files.GetBytes }}
Capabilities: A map-like object that contains information about the versions of Kubernetes ({{ .Capabilities.KubeVersion }} and the supported Kubernetes API versions ({{ .Capabilities.APIVersions.Has "batch/v1" }})

## Helm Chart Managing Command 

Helm의 대표 명령어들입니다.

Chart Template Create

$ helm create mychart
Created mychart/

Chart Packaging

$ helm package mychart
Archived mychart-0.1.-.tgz

Find Issues

$ helm lint mychart
No issues found

## Resource Conflict Issue

Namespace, Secret과 같이 여러 번 생성이 되지 않는 리소스를 배포하려고 하면 리소스 충돌이 발생하며 Helm 배포가 실패됩니다.

Error: rendered manifests contain a resource that already exists. Unable to continue with install: existing resource conflict

 

이는 Helm Template if 구문을 통하여 해결할 수 있습니다.

{{- if not .Values.**.** }}
... Kubernetes Resource yaml ...
{{- end }}

values.yaml에 if 구문에 사용될 값들을 정의해두고 이를 통해 해당 리소스의 실행 여부를 결정할 수 있습니다.

# 기타

Repository 연동은 나중에 기회가 닿는다면 다시 작업을 진행해보는 것으로 하겠습니다.

반응형