Helm
kubernetes의 패키지 매니저, 배포하는 환경에 따라 설정값을 따로 정의해서 배포할 수 있도록 패키지 매니저 역할을 한다.
Helm에서 패키지는 ‘Chart’라고 하며, chart는 kubernetes 애플리케이션의 리소스 정의로 이루어진다.
Helm을 통해 Chart를 설치하는 과정은 Chart가 정의된 helm repo를 추가하고, 해당 repo를 통해 install한다.
Helm 아키텍쳐
Helm 아키텍쳐의 구성요소에는 쿠버네티스 클러스터, Helm 클라이언트, Helm Chart Repository가 있다.
Helm 클라이언트가 Chart Repository로부터 Chart를 다운로드받고, 이 Chart를 기반으로 쿠버네티스 클러스터의 API 서버와 통신해 Chart를 적용하게 된다.
Helm V2에서 V3로 버전이 올라옴에 따라, Helm 클라이언트와 클러스터 API 서버간의 통신 구조가 바뀐것을 볼 수 있다.
V2에는 둘 사이에 Tiler라는 클러스터 내부에 위치하는 중간매개체로 Chart 리소스를 클러스터에 생성 요청하는 구조를 지녔다.
V3에서는 이 Tiler가 삭제되어 Helm 클라이언트와 클러스터 API 서버가 직접 통신하게 되었다.
Helm Chart 구성
Chart의 구조는 모든 Chart가 동일하지는 않으나, 대부분 아래와 같이 비슷하게 구성되어있다.
[chart]
Chart.yml : Chart에 대한 기본 설명(메타데이터)을 포함, 이름 / 버전 등이 기술된다.
values.yml : Chart에 대한 기본값을 설정하는 파일, 사용자는 이 부분을 수정해서 Application을 배포한다.
templates/ : Chart로 생성하는 리소스의 템플릿 Directory, deployment / service 템플릿이 들어있다.
Charts/ : 생성할 Chart에 대한 Dependency Chart Directory, requirements.yml에 Dependency를 명시해준다.
Chart를 받아서 적용하기 전에 values.yml을 구성하고자하는 환경에 맞게 수정한다.
Helm을 통해 kube-prometheus-stack 설치
간단하게 앞서 배웠던 Prometheus stack을 Helm을 통해 쿠버네티스 클러스터에 적용해보도록한다.
(kube-prometheus-stack)
WSL 환경을 이용해 Master node만 하나를 둔 클러스터를 구성했다.
Helm 설치 & Repo 추가
Master node에 Helm을 설치하도록 한다. 설치는 helm 공식으로 제공하는 설치 script를 사용했다.
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 -o get-helm.sh
chmod +x get-helm.sh
./get-helm.sh
Script 이외에도 공식 github에 Release된 Helm 바이너리를 제공하므로 이쪽을 이용해도 무방하다.
Prometheus-stack Repo를 추가하고, Pull로 다운받는다.
# Repo 추가
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# Repo 업데이트 (추가한 Repo 반영을 위함)
helm repo update
# Repo pull
helm pull prometheus-community/kube-prometheus-stack
# Repo pull untar 자동
helm pull prometheus-community/kube-prometheus-stack --untar
다음과 같이 Chart 구조를 확인 할 수 있다.
Chart 수정
이번에 Helm을 통해 설치될 리소스는 Prometheus, Alertmanager, Grafana가 있다. (기본적으로 3개 모두 설치되도록 설정되어 있음)
values.yaml을 수정해서 배포할 환경에 맞게 리소스 내용을 커스텀할 수 있다. 배포에 앞서 몇몇 설정만 추가로 해주도록 한다.
values.yaml의 전체 내용은 여기서 볼 수 있다.
웹으로 Grafana에 접속해서 모니터링하기 위해 Nodeport나 Loadbalancer로의 설정이 필요하다.
이 Chart의 Grafana 기본 설정은 ClusterIP로 설정되어있다.
// Grafana 설정 하단의 service part
## Passed to grafana subchart and used by servicemonitor below
##
service:
portName: http-web
Nodeport 형식으로 사용하기 위해 다음과 같이 변경한다.
service:
type: NodePort
nodePort: 31100
portName: http-web
Grafana의 admin 패스워드는 adminPassword 항목에서 설정가능하다. (Chart 기본값 : prom-operator)
...
## Editable flag for the default dashboards
##
defaultDashboardsEditable: true
adminPassword: prom-operator
...
values.yaml 수정 후 적용한다.
install할때에 namespace명을 지정해주어 해당 namespace에 helm chart 리소스가 설치되도록 할 수 있다.
helm install [RELEASE_NAME] -f values.yaml -n [namespace명]
설정한 Nodeport 번호로 접속해 Grafana가 구동 중임을 확인할 수 있다.
Grafana에 로그인 후 Data Source를 확인하면 Alertmanager와 Prometheus가 기본값으로 설정되어 있는 것을 볼 수 있다.
그리고 몇몇 대시보드들도 기본적으로 import되어있는 것도 볼 수 있다.
마지막으로 Helm을 통해 설치한 Chart와 리소스를 삭제하도록 한다.
+) delete는 uninstall로 rename되었다고 한다. 기능은 동일하니 참고
helm delete [Release명] -n [namespace명]
이렇게 Helm을 통해 간단하게 쿠버네티스 패키지를 받아서 구축해보았다.
잘 만들어진 쿠버네티스 패키지를 손쉽게 사용할 수 있다는 점이 인상깊었다. 공유도 간편하니 많이들 이용하는 듯 하다.