[Kubernetes in Action] Extending Kubernetes

2022. 3. 26. 20:38DevOps/Docker & Kubernetes

 

 

Platforms built on top of Kubernetes (Helm)

이번 챕터에서는 Kubernetes를 조금 더 Custom 하게 사용할 수 있는 여러 방법들(CustomResourceDefinitions, Kubernetes Service Catalog)도 다루지만, 이번 포스팅에서는 해당 내용들보다는 실제로 현업에서 많이 사용되는 Kubernetes 확장 도구인 Helm을 위주로 가볍게 살펴보려고 합니다.

 

 

Definition

Helm은 공식 홈페이지에도 정의가 나와있는 것처럼 'Kubernetes의 패키지 관리'를 도와주는 도구입니다. Nodejs의 npm과 Python의 pip과 같은 역할을 한다고 생각할 수 있습니다. Helm을 이해하기 위해서는 다음 3가지 개념을 알아야 합니다.

 

Chart

차트는 Helm Package를 의미합니다. 이 차트에는 Kubernetes Cluster에서 애플리케이션이 동작하기 위해 필요한 모든 리소스들이 포함되어 있습니다. 즉, memcached pod와 같은 간단한 Kubernetes 구조의 배포는 물론이고, HTTP 서버, DB, 캐시를 포함한 full web app stack의 복잡한 구조의 배포에도 사용할 수 있다는 것을 의미합니다.

 

이 Chart는 특수한 디렉토리의 파일들로 만들어지며, 배포 시에 이들을 version이 달린 archives로 묶어서 배포합니다. Chart의 특수한 디렉토리 구조는 다음과 같습니다. 이 중 Chart.yaml, templates, values.yaml은 반드시 필요한 구성요소이므로 이들 요소에 대해 가볍게 살펴보도록 하겠습니다.

 

 

 

${YOUR_DIRECTORY}/    # 가장 바깥 디렉토리는 Chart의 이름이 됩니다.
  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

Chart.yaml은 기본적으로 이런 형식을 가집니다. npm의 package.json과 비슷한 역할을 하는 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: The type of the chart (optional)
keywords:
  - A list of keywords about this project (optional)
home: The URL of this projects 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: (optional) The repository URL ("https://example.com/charts") or alias ("@repo-name")
	condition: (optional) A yaml path that resolves to a boolean, used for enabling/disabling charts (e.g. subchart1.enabled )
	tags: # (optional)
	      - Tags can be used to group charts for enabling/disabling together
	import-values: # (optional)
	      - ImportValues holds the mapping of source values to parent key to be imported. Each item can be a string or pair of child/parent sublist items.
	alias: (optional) Alias to be used for the chart. Useful when you have to add the same chart multiple times
maintainers: # (optional)
  -name: The maintainers name (required for each maintainer)
	email: The maintainers 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). Needn't be SemVer. Quotes recommended.
deprecated: Whether this chart is deprecated (optional, boolean)
annotations:
example: A list of annotations keyed by name (optional).

 

templates & values

template 파일들은 templates/ 폴더에 저장됩니다. Helm이 chart를 렌더링할 때 template 엔진을 사용해서 해당 폴더 안의 모든 template 파일들을 넘겨줍니다. template 파일은 chart안의 yaml 파일과 cli에서 helm install로 추가한 yaml 파일(value)을 사용해서 생성됩니다.  template은 go로 작성되었기 때문에 Go Template format을 따릅니다. 

apiVersion: v1
kind: ReplicationController
metadata:
  name: deis-database
  namespace: deis
  labels:
    app.kubernetes.io/managed-by: deis
spec:
  replicas: 1
  selector:
    app.kubernetes.io/name: deis-database
  template:
    metadata:
      labels:
        app.kubernetes.io/name: deis-database
    spec:
      serviceAccount: deis-database
      containers:
        -name: deis-database
         image: {{ .Values.imageRegistry }}/postgres:{{ .Values.dockerTag }}
           imagePullPolicy: {{ .Values.pullPolicy }}
           ports:
             -containerPort: 5432
              env:
                -name: DATABASE_STORAGE
                 value: {{ default "minio" .Values.storage }}

위의 template에서 value로 채워넣을 수 있는 부분은 (imageRegistry, dockerTag, pullPolicy, storage)의 4개이며, 이는 다음과 같은 형식의 values.yaml로 정의해서 채워 넣을 수 있습니다.

imageRegistry: "quay.io/deis"
dockerTag: "latest"
pullPolicy: "Always"
storage: "s3"

 

 

Repository

Repository(저장소)는 차트들을 모아두고 공유하는 장소를 의미합니다.

 

 

Release

Release는 쿠버네티스 클러스터에서 구동되는 차트의 인스턴스를 의미합니다. 일반적으로 하나의 차트(헬름 패키지)는 동일한 클러스터 내에 여러 번 설치될 수 있으며, 설치될 때마다 새로운 Release가 생성됩니다. 공식문서에는 MySQL Chart에 대한 예시를 실어두고 있는데, 클러스터 내에 2대의 데이터베이스를 구동하려고 하면 차트(헬름 패키지)를 2번 설치하면 되고, 서로 다른 release name을 가지는 각각의 release가 생성되게 됩니다.

 

 

Architecture

 

 

 

https://helm.sh/ko/

 

헬름

헬름 - 쿠버네티스 패키지 매니저

helm.sh

 

반응형