Kubernetes

Helm이란?

JAEJUNG 2021. 10. 1. 19:26

Helm은 쿠버네티스 패키지 매니저이다.

 

Helm Chart

흔히 Helm 차트를 작성한다고 하는데 여기서 '차트' 란 Helm의 패키지 포맷이다.

하나의 애플리케이션을 설치하기 위한 파일들로 구성돼있는데,

예를 들어 tomcat 서버를 설치하기 위한 쿠버네티스의 Pod, Service, Deployment를 위한 YAML 파일 등을 포함한다.

 

Template, Value

Helm은 기본적으로 템플릿의 개념을 사용한다.

아래 예제처럼 AWS에서 VPC, S3 등의 리소스들을 빠르게 구성하고 싶을 때

yaml 파일 내에 관련된 리소스들을 정의해서 CloudFormation 서비스를 통해 한 번에 구성하곤 하는데,

이 때 사용하는 yaml 파일이 템플릿과 같다.

< CloudFormation 템플릿 예제 >

 

Helm 또한 템플릿 파일을 만들어놓고, Value 값을 채워 넣어서 쿠버네티스 리소스를 정의한 YAML 파일을 생성한다.

 

Helm 설치

 

v2 기준

Helm은 Client - Server로 구성된다.

Client는 다운로드 받은 후 압축을 풀어 바로 사용이 가능하며,

Server는 Tiller라고 불리며 Kubernetes 상에서 작동된다.

 

#Client 설치

wget https://get.helm.sh/helm-v2.16.6-linux-amd64.tar.gz
tar xvzf helm-v2.16.6-linux-amd64.tar.gz
sudo cp linux-amd64/tiller /usr/local/bin
sudo cp linux-amd64/helm /usr/local/bin
sudo chown root:docker /usr/local/bin/tiller
sudo chown root:docker /usr/local/bin/helm

위 순서로 설치를 진행한 후 helm version 명령어를 통해 Client 버전을 확인한다.

[root@ip-192-168-1-145 ~]# helm version
Client: &version.Version{SemVer:"v2.16.6", GitCommit:"dd2e5695da88625b190e6b22e9542550ab503a47", GitTreeState:"clean"}

 

#Server 설치

Tiller를 설치하기 위해서 먼저 서비스 계정을 생성하고 cluster-admin Role을 생성해준다.

아래 YAML 파일을 이용해 생성한다.

mzmz01:~/environment $ cat tiller.yaml 
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system
$ kubectl create -f tiller.yaml
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created
$ helm init --service-account tiller
Creating /home/systemv/.helm
Creating /home/systemv/.helm/repository
Creating /home/systemv/.helm/repository/cache
Creating /home/systemv/.helm/repository/local
Creating /home/systemv/.helm/plugins
Creating /home/systemv/.helm/starters
Creating /home/systemv/.helm/cache/archive
Creating /home/systemv/.helm/repository/repositories.yaml
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com
Adding local repo with URL: http://127.0.0.1:8879/charts
$HELM_HOME has been configured at /home/systemv/.helm.
Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://v2.helm.sh/docs/securing_installation/
$ helm version
Client: &version.Version{SemVer:"v2.16.6", GitCommit:"dd2e5695da88625b190e6b22e9542550ab503a47", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.16.6", GitCommit:"dd2e5695da88625b190e6b22e9542550ab503a47", GitTreeState:"clean"}

 

v3 기준

 

Linux

$ 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

 

Windows

버전 3로 업데이트 되면서, Tiller 구성 요소가 제거되어 작업이 간소화되고 보안이 향상됨.

C:> helm version
version.BuildInfo{Version:"v3.7.0", GitCommit:"eeac83883cb4014fe60267ec6373570374ce770b", GitTreeState:"clean", GoVersion:"go1.16.8"}

 

helm create 명령어를 통해 기본 코드를 생성한다.

C:\Users\이재정\Desktop\EKS Cluster\k8s-aws-book\eks-env\temp\windows-amd64>helm create tks-contract

 

디렉토리의 구조를 확인한다.

$ tree tks-contract    
tks-contract
├── Chart.yaml
├── charts
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── service.yaml
│   ├── serviceaccount.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

3 directories, 10 files

 

Chart.yaml
-> 차트에 대한 기본 정보 ( Chart 명, Chart 버전, Chart 설명 등)

Charts
-> 의존성 관리

templats
-> Kubernetes 리소스와 관련된 yaml 파일

values
-> 변수를 정의한 파일 ( templates의 yaml 파일 내 특정 변수 값을 치환하고 싶을 때)

 

Value를 이용한 변수 치환

 

- values.yaml

 

- service.yaml

 

정의된 템플릿 호출

 

/templates/service.yaml

- : {{ }} 영역의 줄바꿈과 공백을 없앤다.

. : values.yaml 파일 내 모든 변수들을 Argument로 넘긴다.

nindent 4 : 결과를 프린트 할 때 4개를 멀티라인으로 계속 들여쓴다.

  selector:
    {{- include "tks-contract.selectorLabels" . | nindent 4 }}

 

/templates/_helpers.tpl

 

++++ 결과

  selector:
    app.kubernetes.io/service: tks
    app.kubernetes.io/name: tks-contract

 

NOTES.txt -> chart가 배포되고 나서 터미널에 프린트된다.