0%

kubernetes helm

쿠버네티스를 운영할때 단일 클러스터만으로 운영하는 경우는 흔치 않습니다.
결국 애플리케이션을 여러 클러스터에 배포해야하는데, 이 과정에서 발생하는 관리 이슈가 생길 수 있습니다.

서비스의 경우는 그렇다 쳐도, 인그레스와 같이 호스트가 지정된 정보들의 경우 클러스터마다 상이하게 설정해야하는데 클러스터마다 매니패스트를 따로관리하는것도 문제입니다.

따라서 환경에 따라 달라지는 값만 정의해두고 이에 따라 배포하는 메커니즘이 필요하며 이를 해결하는것이 바로 “헬름” 입니다.

헬름

헬름이란 쿠버네티스 차트를 관리하기 위한 도구 입니다.
차트 는 사전 구성된 쿠버네티스 리소스 패키지 입니다.

헬름, 차트, 매니페스트, 쿠버네티스의 관계는 다음과 같습니다.

  • 헬름: 차트 관리
  • 차트: 매니페스트 템플릿을 구성하고 패키지로 관리, 차트를 사용하여 매니패스트 파일 생성
  • 매니페스트: 매니페스트 파일에 기초하여 쿠버네티스 리소스(ingress, deployment, replicaset… 등)를 관리

실무에서는 로컬 및 운영 클러스터를 막론하고 여러 환경에 배포해야하는 애플리케이션은 모두 차트로 패키징해 kubectl 대신 헬름으로 배포 및 업데이트를 수행합니다.

kubectl 은 이미 배포된 리소스를 운영중에 수정하는데 주로 사용합니다.

헬름 설치

https://github.com/helm/helm/releases 에서 현재 환경에 맞는 헬름을 설치합니다.

3 버전 받는다면 helm 과 tiller 가 혼합된형태? 가 되는듯하니 2 버전으로 진행하였습니다.

1
2
3
4
5
6
7
8
9
10
11
# 헬름 초기화
$ helm init
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 C:\Users\---\.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/

init 명령어를 실행하면 틸러 라는 서버 애플리케이션이 kube-system 네임스페이스에 배포됩니다.

1
2
3
4
5
6
7
8
9
$ kubectl -n kube-system get service,deployment,pod --selector app=helm
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/tiller-deploy ClusterIP 10.98.66.79 <none> 44134/TCP 2m51s

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/tiller-deploy 1/1 1 1 2m52s

NAME READY STATUS RESTARTS AGE
pod/tiller-deploy-566d8c9b77-t5bd8 1/1 Running 0 2m52s

틸러는 헬름의 명령에 따라 설치등의 작업을 담당합니다.

헬름과 틸러는 여러 클러스터 작업을 진행할때 버젼을 일치시키는것이 좋습니다.

1
2
3
$ helm version
Client: &version.Version{SemVer:"v2.16.7", GitCommit:"5f2584fd3d35552c4af26036f0c464191287986b", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.16.7", GitCommit:"5f2584fd3d35552c4af26036f0c464191287986b", GitTreeState:"clean"}

헬름 구성

헬름은 클라이언트(cli)서버(쿠버네티스 클러스터에 설치된 틸러) 로 구성됩니다.
클라이언트는 서버를 대상으로 명령어를 지시합니다.
서버는 전달받은 명령에 따라 쿠버네티스 클러스터에 패키지 설치, 업데이트, 삭제등의 작업을 수행합니다.

쿠버네티스는 서비스나 디플로이먼트, 인그레스와 같은 리소스를 생성하고 매니페스트파일을 적용하는 방식으로 애플리케이션을 배포합니다.
이 매니페스트 파일을 생성하는 템플릿을 여러 개 패키징한 것이 차트입니다.

차트는 헬름 리포지토리에 tgz 파일로 저장되며, 틸러가 매니페스트를 생성하는 데 사용합니다.

리포지토리의 종류는 3가지가 있습니다.

  • local: 헬름 클라이언트가 설치된 로컬 저장소
  • stable: 안정 버전에 이른 차트가 존재하는 저장소
  • incubator: stable 요건을 만족하지 못한 차트 저장소

검색을 해보면 stable 차트가 보입니다.

1
2
3
4
5
6
$ helm search
NAME CHART VERSION APP VERSION DESCRIPTION
stable/acs-engine-autoscaler 2.2.2 2.1.1 DEPRECATED Scales worker nodes within agent pools
stable/aerospike 0.3.2 v4.5.0.5 A Helm chart for Aerospike in Kubernetes
stable/airflow 6.10.4 1.10.4 Airflow is a platform to programmatically author, schedul...
stable/ambassador 5.3.1 0.86.1 A Helm chart for Datawire Ambassador

차트

차트는 구성이 정해져있습니다.
애플리케이션의 동작을 제어하는 설정의 기본값을 values.yaml 파일에 저장합니다.
이 기본값을 변경하려면 기본값 value 파일에서 변경할 값만 수정한 커스텀 value 파일이 있습니다.

차트 설치해보기

stable 에 올라온것중 쉽게 stable/redmine 을 쿠버네티스 환경에 설치해보겠습니다.
https://github.com/helm/charts/tree/master/stable/redmine

차트를 이용해 설치하려면 helm install 명령어를 사용해야 합니다.
업데이트와 삭제를 하려면 release 네임이 필요하므로 --name 옵션을 통해 이름을 붙여줘야합니다.
이 이름은 클러스터안에서 유일해야합니다.

helm install 을 이용하면 차트에 포함된 기본값 value 파일에 정의된 설정값으로 애플리케이션이 설치됩니다.
그러나 실무에서는 커스텀해서 사용해야하므로 커스텀 value 파일을 구성해보겠습니다.

https://github.com/helm/charts/blob/master/stable/redmine/README.md 의 config 를 참고하여 바꾸고자 하는 내용에 대한 별도 yaml 파일을 로컬에 구성합니다.

redmine.yaml

1
2
3
4
5
6
redmineUsername: wook
redminePassword: wook

# 로드벨런서가 아니라 그냥 서비스를 노출하고자 하므로 NodePort 로 정정
service:
type: NodePort
1
2
3
4
5
6
7
# -f 옵션을 통해 커스텀 value 를 포함하여 설치해봅니다.
# --name 옵션을 통해 네임을 필히 지정합니다.
$ helm install -f redmine.yaml --name rmine stable/redmine
NAME: rmine
LAST DEPLOYED: Sun May 17 15:23:37 2020
NAMESPACE: default
STATUS: DEPLOYED

설치가 끝나면 배포된 목록을 확인해볼 수 있습니다.

1
2
3
$ helm ls
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
rmine 1 Sun May 17 15:23:37 2020 DEPLOYED redmine-14.1.12 4.1.0 default

설정한 리소스가 올바르게 반영됬는지 확인해봅니다.

1
2
3
4
5
$ kubectl get service,deployment
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 63m
service/rmine-mariadb ClusterIP 10.109.39.18 <none> 3306/TCP 6m22s
service/rmine-redmine NodePort 10.100.66.7 <none> 80:30912/TCP 6m22s

service.type 을 NodePort 로 바꾸었기때문에 NodePort 로 설정이 된것을 볼 수 있습니다. (기본 Load Balancer)
30912 포트로 연결시 redmine 서비스가 뜨는것을 확인할 수 있습니다.
login 시 id/pw 를 wook/wook 으로 하여 정상적으로 인증이 되는것도 확인할 수 있습니다.

차트 업그레이드

헬름으로 설치한 릴리즈를 업데이트도 가능합니다.

1
$ helm upgrade -f redmine.yaml --name rmine stable/redmine --version 4.1.2

차트 제거

헬름을 통해 설치한 애플리케이션은 지정한 이름을 통해 쉽게 제거 가능합니다.

1
helm delete rmine