Engineering/Container&Kubernetes

[Helm] Helm 소개 및 Helm3를 통한 Prometheus 설치

5=0 2020. 1. 3. 17:15

Contents

1. Helm 소개
2. Helm 설치
3. Helm을 통한 Prometheus 설치


 

Helm이 무엇인지 알아보고 Prometheus를 Helm 이용해 설치해보면서 사용법을 직접 익혀봅니다.


 

1. Helm 소개 

 

Helm '쿠버네티스 패키지 매니저' 입니다.

쿠버네티스 자원들을 묶어 하나의 패키지로 배포/다운로드 있게끔 돕습니다.

따라서 쿠버네티스 클러스터 위에 자신이 배포한 서비스를 Helm 통해 패키지화하여 배포하면,

다른 사용자들이 Helm 통해 그들의 쿠버네티스 클러스터에 패키지를 다운받아 사용할 있습니다.

 

 

Helm 이러한 패키지를 'Helm Chart'라는 포맷으로 정의하여 관리합니다.

Helm Chart 하나의 패키지를 설치하기 위한 파일들의 구성을 정의하며,

쿠버네티스 자원들의 yaml 파일들을 포함 합니다.

 

 

따라서  Helm Chart 형식(아래 그림의 Chart.yml)으로 쿠버네티스 패키지들이 배포/다운로드 됩니다.

 

Helm Chart (https://itnext.io/drastically-improve-your-kubernetes-deployments-with-helm-5323e7f11ef8)

 

 

 

Helm Chart 구조 작성 방법은 다룰 내용이 조금 많습니다.

따라서 이에 대한 자세한 내용은 다음 기회로 미루어 두겠습니다.

미리 읽어보고자 하시는 분들은 아래 링크의 조대협님의 블로그를 한번 읽어보시면 도움이 같습니다!

https://bcho.tistory.com/1337

 

쿠버네티스 패키지 매니저 Helm #2-1. Chart

쿠버네티스 패키지 매니저 HELM #2-1 .Chart 조대협 http://bcho.tistory.com Helm Chart 차트는 helm의 패키지 포맷으로, 하나의 애플리케이션을 설치하기 위한 파일들로 구성되어 있다. 예를 들어 tomcat을 설치..

bcho.tistory.com

 

 

추가로, Helm Chart 패키지들을 저장하는 'Helm 레지스트리'가 있습니다.

마치 도커 레지스트리 처럼 말이죠.

그리고 도커 레지스트리에 Docker Hub 라는 공용 레지스트리가 있는 것처럼,

Helm 'Helm Hub (https://hub.helm.sh/)' 라는 공용 레지스트리가 존재합니다.

Helm Hub에는 많은 개발자들이 미리 개발해 놓은, 공식 Helm 패키지들이 있습니다.

여러분은 손쉽게 패키지들을 다운받아 자신의 쿠버네티스 클러스터에 설치할 있습니다!

 

또한 Docker 레지스트리를 개인용 private 레지스트리로 구축할 있는 것처럼,

Helm 레지스트리 서버를 개인이 직접 실행시켜, private 레지스트리를 구축 수도 있습니다.

 

 

특별히 Helm v2 에서는 CLI 기능을 제공하는 Helm Client 부와, Helm 서버 역할을 하는 Helm tiller 따로 존재했습니다.

따라서 Helm CLI Tiller 각각 설치해야 했지만,

Helm v3 부터는 Helm Tiller 삭제되었습니다.

(자세한 내용은 https://helm.sh/docs/faq/#removal-of-tiller  참고)

글에서는 Helm v3 활용할 예정이며 따라서

Helm CLI Helm 같은 의미로 사용하도록 하겠습니다!

 

 

2. Helm 설치 

우선 Helm 사용하려면, Kubernetes 클러스터가 필요합니다.

Kubernetes 설치된 클러스터를 먼저 준비해주시기 바랍니다.

글에서는 Kubernetes 설치에 대해서는 다루지 않습니다.

 

 

본격적으로 Helm 설치해봅시다.

 

 

https://helm.sh/docs/intro/install/

 

글에 여러가지 Helm 설치 방법을 소개하고 있습니다.

저는 binary 직접 다운받는 방법( 글의 'From the Binary Releases' 내용) 소개 하겠습니다!

 

 

위에 도큐먼트 설명을 그대로 따라하시면 설치하는데 문제가 없으실 겁니다.

글도 도큐먼트 설명 순서 대로 따라 가겠습니다.

 

 

  • 2-2) 다운 받은 파일은 압축 파일이므로, 압축을 풀어 줍니다.
$ tar -zxvf [HELM_BIN_TAR_FILE_NAME].tar.gz

 

  • 2-3) 압축을 풀어보면 다운받은 파일폴더 아래 helm이라는 binary 찾을  있습니다. 
     binary /usr/local/bin/helm 위치로 옮깁니다.
$ mv linux-amd64/helm /usr/local/bin

 

  • 2-4) $ helm 명령을 인식하는지 확인 합니다
$ helm help

 

 

4번에서 아래 사진과 같이 helm 명령 사용 방법이 출력된다면,

Helm 정상적으로 설치가 완료 입니다.

 

 

3. Helm을 통한 Prometheus 설치 

너무 조대협님의 글과 흐름이 유사해져.

Helm 사용 예제로 Prometheus말고 다른 것을 해볼까 했는데…

추후 활용도를 생각했을 Prometheus 제일 적절한 같아,

어쩔 없이 (?) Prometheus Helm 패키지로 설치하는 방법을 알아보겠습니다. ㅎㅎ

 

 

우선 공식적인 Helm 레포지토리를 로컬에 stable 이란 이름으로 추가해줍니다.

$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/

 

 

추가된 레포에서 다운받을 있는 Helm Chart 리스트를 아래와 같이 조회할 있습니다.

$ helm search repo stable

 

 

또한 해당 레포에서, 다운 받으려는 차트 또한 검색 가능 합니다.

저희는 프로메테우스를 설치하는게 목표이니, 프로메테우스를 검색해 보겠습니다!

$ helm search repo prometheus

 

 

프로메테우스와 관련된 모든 차트들이 검색되는데,

위의 stable/prometheus 저희가 설치하려는 녀석 입니다.

 

 

특정 Helm 차트의 설치는 아래와 같이 수행하실 있습니다.

아래 명령어는 [HELM_CHART] [RELEASE_NAME]이라는 이름으로 쿠버네티스 클러스터 안에 배포합니다.

$ helm install [RELEASE_NAME] [HELM_CHART]

 

 

저희는 stable/prometheus 차트를 prometheus란 이름으로 클러스터에 배포 하였습니다. 

클러스터에 배포된 릴리즈 목록은 아래와 같이 조회할 수 있습니다. 

$ helm ls

 

 

prometheus라는 이름으로 promethus 패키지가 배포 된것을 확인할 수 있습니다. 

정상적으로 프로메테우스 패키지 설치가 완료되었으면,

쿠버네티스 클러스터에서 프로메테우스관련 파드들이 아래와 같이 조회 됩니다.

 

 

제 클러스터의 경우에는 PVC/PV 설정이 되어 있지 않아,

prometheus-server가 pending되는 문제가 있었습니다.

 

이 경우, PVC/PV를 추가 해주시거나

prometheus helm chart 설치 시, prometheus-server가 emptydir을 사용하도록 설정을 바꿔 주시면 됩니다.

 

**prometheus-server 볼륨으로 PVC/PV 대신 emptydir 사용 방법 설명 추가 합니다. (아래 더보기를 눌러주세요!)**

더보기

우선 prometheus-server의 default yaml 파일을 저장 합니다.

$ kubectl get pod [PROMETHEUS_SERVER_POD] -o yaml >> [FILE_NAME].yaml

 

저장하신 파일을 열어 보면, prometheus-server 파드 구동을 위한 설정 값들이 기재 되어 있습니다. 

그 중에! prometheus-server의 볼륨을 PV가 아니라 emptydir를 사용하도록 설정값을 변경해야 합니다. 

관련된 설정 값은 prometheus-server 파드 yaml파일의 아래와 같은 부분에 기재 되어 있습니다. 

(저의 경우 prometheus-server 파드의 759번째 줄 부터 였습니다.)

 

* yaml 파일 내에 persistentVolume 설정이 2번 등장합니다.

하나는 altermanager가 사용할 볼륨, 나머지 하나는 prometheus server가 사용할 볼륨 이며.

이는 아래 파일 발췌 내용의 2번 째 줄 처럼, 주석으로 잘 설명 되어 있으니 확인하시기 바랍니다.

저희가 수정할 부분은 promethes server가 사용할 볼륨 입니다. 

 

 

주석의 설명대로, emptydir를 prometheus server 볼륨으로 사용하기 위해서는 'enabled' 값을 'false'로 변경합니다. (아래 파일의 3번째 줄) 

  persistentVolume:
    ## If true, Prometheus server will create/use a Persistent Volume Claim
    ## If false, use emptyDir
    ##
    enabled: false

    ## Prometheus server data Persistent Volume access modes
    ## Must match those of existing PV or dynamic provisioner
    ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
    ##
    accessModes:
      - ReadWriteOnce

    ## Prometheus server data Persistent Volume annotations
    ##
    annotations: {}

    ## Prometheus server data Persistent Volume existing claim name
    ## Requires server.persistentVolume.enabled: true
    ## If defined, PVC must be created manually before volume will be bound
    existingClaim: ""

    ## Prometheus server data Persistent Volume mount root path
    ##
    mountPath: /data

    ## Prometheus server data Persistent Volume size
    ##
    size: 1Gi

    ## Prometheus server data Persistent Volume Storage Class
    ## If defined, storageClassName: <storageClass>
    ## If set to "-", storageClassName: "", which disables dynamic provisioning
    ## If undefined (the default) or set to null, no storageClassName spec is
    ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
    ##   GKE, AWS & OpenStack)
    ##
    # storageClass: "-"

    ## Prometheus server data Persistent Volume Binding Mode
    ## If defined, volumeBindingMode: <volumeBindingMode>
    ## If undefined (the default) or set to null, no volumeBindingMode spec is
    ##   set, choosing the default mode.
    ##
    # volumeBindingMode: ""

    ## Subdirectory of Prometheus server data Persistent Volume to mount
    ## Useful if the volume's root directory is not empty
    ##
    subPath: ""

 

 

이렇게 yaml파일을 변경 하셨으면, 위 yaml 파일을 적용 하시면 됩니다. 

$ kubectl apply -f [FILE_NAME].yaml

 

 

 

 

위 파드들 중 프로메테우스 웹 서버 역할을 하는 녀석은 'prometheus-server' 입니다. 

 

Prometheus 웹은 기본적으로 9090포트 사용한다고 합니다.

prometheus-server의 9090포트를 각자 환경에 맞게 포트포워딩 설정 해주시면, IP:9090 주소로 프로메테우스 웹에 접속 가능합니다.

 

가장 간단히 prometheus-server가 실행되는 머신에서 바로 접속을 원하시는 분들은,

아래와 같이 포트포워딩을 수행하시고, localhost:9090 주소로 접속하시면 됩니다.

$ kubectl port-forward [PROMETHEUS_SERVER_POD_NAME] 9090

 

 

(저는 kt 클라우드에 클러스터를 구성해 놓아서,

kt cloud에서의 포트포워딩 작업이 추가로 필요했습니다.)

 

 

 

아래와 같이 프로메테우스 화면을 확인하시면

이제부터 프로메테우스를 사용하실 있습니다!

 

 

 

 

 

이상으로 Helm 대해 알아보고,

Helm 통해 프로메테우스를 설치해보았습니다!