[따배쿠] Helm
Helm?
Helm이란, Kubernetes 패키지 관리 도구이다.
Helm 주요 구성 요소
1. Chart(차트)
- Helm 패키지로, k8s cluster에서 애플리케이션이 기동되기 위해 필요한 모든 리소스들이 포함되어 있습니다.
2. Repository(저장소)
- Helm Chart가 저장되고 배포되는 장소
3. Release(릴리즈)
- Helm 차트를 사용하여 Kubernetes 클러스터에 배포된 인스턴스
- 각 릴리스는 고유한 이름을 가지며, 특정 차트와 버전, 설정 값으로 구성됩니다.
- 릴리스는 Helm을 통해 관리되고, 업그레이드 또는 삭제할 수 있습니다.
즉, Helm Chart를 원하는 Repository에서 검색 후 설치한다.
각 설치에 따른 새로운 Release를 생성한다.
*참고
Helm 공식 홈페이지 : https://helm.sh/
Helm
Helm - The Kubernetes Package Manager.
helm.sh
Helm 차트 저장소 : https://bitnami.com/
Bitnami
With over 1 million apps deployed per month, Bitnami makes it incredibly easy to deploy apps with native installers, as virtual machines, docker containers or in the cloud.
bitnami.com
Helm 설치하기
Helm 설치
# Helm 설치
# Install Helm
root@master:~# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
root@master:~# chmod 700 get_helm.sh
root@master:~# ./get_helm.sh
Downloading https://get.helm.sh/helm-v3.17.0-linux-amd64.tar.gz
Verifying checksum... Done.
Preparing to install helm into /usr/local/bin
helm installed into /usr/local/bin/helm
# Helm 설치 확인
root@master:~# helm version
version.BuildInfo{Version:"v3.17.0", GitCommit:"301108edc7ac2a8ba79e4ebf5701b0b6ce6a31e4", GitTreeState:"clean", GoVersion:"go1.23.4"}
Helm 구성 (repository 구성)
# Repositroy 추가
# Repository 추가/삭제 : helm repo [add|remove|list] [NAME] [URL]
root@master:~# helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories
root@master:~# helm repo list
NAME URL
bitnami https://charts.bitnami.com/bitnami
예시로 bitnami라는 repository를 사용해보자
* bitnami에서 k8s용 chart를 제공하고있다.
Helm 명령어
실습
# helm search
root@master:~# helm search repo nginx
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/nginx 18.3.5 1.27.3 NGINX Open Source is a web server that can be a...
bitnami/nginx-ingress-controller 11.6.5 1.12.0 NGINX Ingress Controller is an Ingress controll...
bitnami/nginx-intel 2.1.15 0.4.9 DEPRECATED NGINX Open Source for Intel is a lig...
bitnam/nginx에 대해 더 자세히 알아보자
# helm show
root@master:~# helm show chart bitnami/nginx
annotations:
category: Infrastructure
images: |
- name: git
image: docker.io/bitnami/git:2.48.0-debian-12-r0
- name: nginx
image: docker.io/bitnami/nginx:1.27.3-debian-12-r5
- name: nginx-exporter
image: docker.io/bitnami/nginx-exporter:1.4.1-debian-12-r0
licenses: Apache-2.0
apiVersion: v2
appVersion: 1.27.3
dependencies:
- name: common
repository: oci://registry-1.docker.io/bitnamicharts
tags:
- bitnami-common
version: 2.x.x
description: NGINX Open Source is a web server that can be also used as a reverse
proxy, load balancer, and HTTP cache. Recommended for high-demanding sites due to
its ability to provide faster content.
home: https://bitnami.com
icon: https://bitnami.com/assets/stacks/nginx/img/nginx-stack-220x234.png
keywords:
- nginx
- http
- web
- www
- reverse proxy
maintainers:
- name: Broadcom, Inc. All Rights Reserved.
url: https://github.com/bitnami/charts
name: nginx
sources:
- https://github.com/bitnami/charts/tree/main/bitnami/nginx
version: 18.3.5
# helm inspect values
helm inspect values bitnami/nginx
# 번외) helm inspect values 파일을 가져오기
root@master:~# helm inspect values bitnami/nginx > nginx_values.yaml
root@master:~# vi nginx_values.yaml
Bitnami의 Nginx 차트에 대한 기본 값을 nginx_values.yaml 파일로 저장해서 확인해볼 수 있다.
# helm install
root@master:~# helm install webserver bitnami/nginx
NAME: webserver
LAST DEPLOYED: Mon Jan 20 04:50:54 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: nginx
CHART VERSION: 18.3.5
APP VERSION: 1.27.3
Did you know there are enterprise versions of the Bitnami catalog? For enhanced secure software supply chain features, unlimited pulls from Docker, LTS support, or application customization, see Bitnami Premium or Tanzu Application Catalog. See https://www.arrow.com/globalecs/na/vendors/bitnami for more information.
** Please be patient while the chart is being deployed **
NGINX can be accessed through the following DNS name from within your cluster:
webserver-nginx.default.svc.cluster.local (port 80)
To access NGINX from outside the cluster, follow the steps below:
1. Get the NGINX URL by running these commands:
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
Watch the status with: 'kubectl get svc --namespace default -w webserver-nginx'
export SERVICE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].port}" services webserver-nginx)
export SERVICE_IP=$(kubectl get svc --namespace default webserver-nginx -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo "http://${SERVICE_IP}:${SERVICE_PORT}"
WARNING: There are "resources" sections in the chart not set. Using "resourcesPreset" is not recommended for production. For production installations, please set the following values according to your workload needs:
- cloneStaticSiteFromGit.gitSync.resources
- resources
+info https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
helm install: Helm을 사용하여 새로운 차트를 설치하는 명령입니다.
webserver: 설치할 릴리스의 이름입니다. 이 이름은 클러스터 내에서 해당 Nginx 인스턴스를 식별하는 데 사용됩니다.
bitnami/nginx: 설치할 차트의 경로입니다. 여기서는 Bitnami의 Nginx 차트를 지정하고 있습니다.
번외) Helm을 사용하여 Bitnami의 Nginx 차트를 Kubernetes 클러스터에 설치하는 명령
root@master:~# helm install webserver2 --set service.type=Nodeport bitnami/nginx
Helm을 사용하여 Bitnami의 Nginx 차트를 Kubernetes 클러스터에 설치하면서,
Nginx 서비스의 타입을 NodePort로 설정하는 명령
# 확인
root@master:~# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/webserver-nginx-65f8955b99-s48cr 1/1 Running 0 6m24s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12d
service/webserver-nginx LoadBalancer 10.101.190.238 <pending> 80:31102/TCP,443:31999/TCP 10m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/webserver-nginx 1/1 1 1 10m
NAME DESIRED CURRENT READY AGE
replicaset.apps/webserver-nginx-65f8955b99 1 1 1 10m
# 삭제
root@master:~# helm uninstall webserver
release "webserver" uninstalled
실습2
# 기존 nginx_values.yaml 파일 수정
root@master:~# vi nginx_values.yaml
...
service:
## @param service.type Service type
##
type: NodePort
## @param service.ports.http Service HTTP port
## @param service.ports.https Service HTTPS port
##
ports:
http: 80
https: 443
##
## @param service.nodePorts [object] Specify the nodePort(s) value(s) for the LoadBalancer and NodePort service types.
## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport
##
nodePorts:
http: ""
https: ""
...
type을 LB에서 NodePort로 수정
# helm install
root@master:~# helm install webserver -f nginx_values.yaml bitnami/nginx
NAME: webserver
LAST DEPLOYED: Mon Jan 20 05:07:44 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: nginx
CHART VERSION: 18.3.5
APP VERSION: 1.27.3
Did you know there are enterprise versions of the Bitnami catalog? For enhanced secure software supply chain features, unlimited pulls from Docker, LTS support, or application customization, see Bitnami Premium or Tanzu Application Catalog. See https://www.arrow.com/globalecs/na/vendors/bitnami for more information.
** Please be patient while the chart is being deployed **
NGINX can be accessed through the following DNS name from within your cluster:
webserver-nginx.default.svc.cluster.local (port 80)
To access NGINX from outside the cluster, follow the steps below:
1. Get the NGINX URL by running these commands:
export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services webserver-nginx)
export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
echo "http://${NODE_IP}:${NODE_PORT}"
WARNING: There are "resources" sections in the chart not set. Using "resourcesPreset" is not recommended for production. For production installations, please set the following values according to your workload needs:
- cloneStaticSiteFromGit.gitSync.resources
- resources
+info https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
nginx_values.yaml 파일을 참고하여, helm install
아까 helm install webserver2 --set service.type=Nodeport bitnami/nginx(Command line)을 yaml 파일로 실행한 것이랑 동일한 결과이다.
# 확인
root@master:~# kubectl get all
NAME READY STATUS RESTARTS AGE
pod/webserver-nginx-65f8955b99-dnjk9 1/1 Running 0 76s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12d
service/webserver-nginx NodePort 10.107.248.143 <none> 80:30650/TCP,443:31600/TCP 76s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/webserver-nginx 1/1 1 1 76s
NAME DESIRED CURRENT READY AGE
replicaset.apps/webserver-nginx-65f8955b99 1 1 1 76s
root@master:~# curl localhost:30650
# 삭제
root@master:~# helm uninstall webserver
release "webserver" uninstalled
Helm 차트 구조
helm 패키지 구조를 확인해보자.
# helm 저장소에서 차트 다운로드
root@master:~# helm pull bitnami/nginx
helm 차트 저장소 bitnami에서 nginx를 다운받는다.
# 확인
root@master:~# ls
Getting-Start-Kubernetes nginx-18.3.5.tgz
get_helm.sh nginx_values.yaml
nginx-18.3.5.tgz -> helm chart 압축 파일
# 압축 해제
root@master:~# tar zxvf nginx-18.3.5.tgz
nginx/
nginx/charts/
nginx/charts/common/
nginx/charts/common/templates/
nginx/charts/common/templates/validations/
nginx/templates/
nginx/Chart.lock
nginx/Chart.yaml
nginx/.helmignore
nginx/charts/common/Chart.yaml
nginx/charts/common/.helmignore
nginx/charts/common/README.md
nginx/charts/common/values.yaml
nginx/charts/common/templates/_warnings.tpl
nginx/charts/common/templates/_affinities.tpl
nginx/charts/common/templates/_storage.tpl
nginx/charts/common/templates/_utils.tpl
nginx/charts/common/templates/_compatibility.tpl
nginx/charts/common/templates/_tplvalues.tpl
nginx/charts/common/templates/_capabilities.tpl
nginx/charts/common/templates/_labels.tpl
nginx/charts/common/templates/_errors.tpl
nginx/charts/common/templates/_resources.tpl
nginx/charts/common/templates/_names.tpl
nginx/charts/common/templates/validations/_validations.tpl
nginx/charts/common/templates/validations/_postgresql.tpl
nginx/charts/common/templates/validations/_mariadb.tpl
nginx/charts/common/templates/validations/_cassandra.tpl
nginx/charts/common/templates/validations/_redis.tpl
nginx/charts/common/templates/validations/_mongodb.tpl
nginx/charts/common/templates/validations/_mysql.tpl
nginx/charts/common/templates/_secrets.tpl
nginx/charts/common/templates/_images.tpl
nginx/charts/common/templates/_ingress.tpl
nginx/README.md
nginx/values.yaml
nginx/templates/health-ingress.yaml
nginx/templates/networkpolicy.yaml
nginx/templates/deployment.yaml
nginx/templates/ingress.yaml
nginx/templates/_helpers.tpl
nginx/templates/servicemonitor.yaml
nginx/templates/hpa.yaml
nginx/templates/svc.yaml
nginx/templates/extra-list.yaml
nginx/templates/serviceaccount.yaml
nginx/templates/NOTES.txt
nginx/templates/pdb.yaml
nginx/templates/stream-server-block-configmap.yaml
nginx/templates/prometheusrules.yaml
nginx/templates/server-block-configmap.yaml
nginx/templates/tls-secret.yaml
nginx/templates/ingress-tls-secret.yaml
nginx/values.schema.json
# 확인
root@master:~/nginx# ls
Chart.lock Chart.yaml README.md charts templates values.schema.json values.yaml
# helm chart를 트리 구조로 확인
root@master:~# tree nginx
nginx
├── Chart.lock
├── Chart.yaml
├── README.md
├── charts
│ └── common
│ ├── Chart.yaml
│ ├── README.md
│ ├── templates
│ │ ├── _affinities.tpl
│ │ ├── _capabilities.tpl
│ │ ├── _compatibility.tpl
│ │ ├── _errors.tpl
│ │ ├── _images.tpl
│ │ ├── _ingress.tpl
│ │ ├── _labels.tpl
│ │ ├── _names.tpl
│ │ ├── _resources.tpl
│ │ ├── _secrets.tpl
│ │ ├── _storage.tpl
│ │ ├── _tplvalues.tpl
│ │ ├── _utils.tpl
│ │ ├── _warnings.tpl
│ │ └── validations
│ │ ├── _cassandra.tpl
│ │ ├── _mariadb.tpl
│ │ ├── _mongodb.tpl
│ │ ├── _mysql.tpl
│ │ ├── _postgresql.tpl
│ │ ├── _redis.tpl
│ │ └── _validations.tpl
│ └── values.yaml
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ ├── extra-list.yaml
│ ├── health-ingress.yaml
│ ├── hpa.yaml
│ ├── ingress-tls-secret.yaml
│ ├── ingress.yaml
│ ├── networkpolicy.yaml
│ ├── pdb.yaml
│ ├── prometheusrules.yaml
│ ├── server-block-configmap.yaml
│ ├── serviceaccount.yaml
│ ├── servicemonitor.yaml
│ ├── stream-server-block-configmap.yaml
│ ├── svc.yaml
│ └── tls-secret.yaml
├── values.schema.json
└── values.yaml
애플리케이션을 컨테이너로 만든 후, 차트로 만들어서 배포하는 것이 가능 !!
[참고 영상]
https://www.youtube.com/watch?v=QlYgYcJ-GhA&list=PLApuRlvrZKohLYdvfX-UEFYTE7kfnnY36&index=13