Contents

k8s doc reading: Concepts: Getting started - helm

/posts/20250627_k8s-doc-reading-getting-started-helm/images/banner.png

在 getting start 我們安裝了 k3s

以及使用了 kubectl 去新增 deplyment & service
可是這其實相當難以管理眾多的 manifest
因此 helm 這個工具就誕生了

同類型的工具很多, k8s 官方也提供 Kustomize 但目前來說 helm 是主流, 所以建議大家學習 helm

install helm

Helm 官方提供了很多安裝方式, 其中最簡單的是 script 安裝

https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

helm introduction

Helm 是 Kubernetes 的 manifest(yaml) 管理器。把一堆 k8s manifest 包裝成一個 chart 透過 chart 我們可以很輕鬆地安裝、升級、刪除 k8s 上的應用程式

主要有幾個核心概念

  • Chart: Helm 的打包格式, 包含了一組 k8s manifest 的模板
  • Release: 在 k8s 集群上運行的 chart 的一個實例
  • Repository: 用來存放和分享 chart 的地方

getting start helm chart

我們來試著安裝一個 nginx chart
首先, 我們需要新增一個 repository(使用人家寫好的 chart)

helm repo add bitnami https://charts.bitnami.com/bitnami

搜尋看看有沒有 nginx chart 可以使用

$ helm search repo nginx
NAME                                            CHART VERSION   APP VERSION     DESCRIPTION                                       
bitnami/nginx                                   20.0.7          1.28.0          NGINX Open Source is a web server that can be a...

最後, 我們安裝 nginx

helm install my-nginx bitnami/nginx

透過 kubectl get pod 可以看到 nginx 已經被安裝上去了

接著我們把 chart download 下來看看裡面

helm pull bitnami/nginx --untar

結構

$ tree
.
├── Chart.lock
├── 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
│       │   ├── validations
│       │   │   ├── _cassandra.tpl
│       │   │   ├── _mariadb.tpl
│       │   │   ├── _mongodb.tpl
│       │   │   ├── _mysql.tpl
│       │   │   ├── _postgresql.tpl
│       │   │   ├── _redis.tpl
│       │   │   └── _validations.tpl
│       │   └── _warnings.tpl
│       └── values.yaml
├── Chart.yaml
├── README.md
├── templates
│   ├── deployment.yaml
│   ├── extra-list.yaml
│   ├── health-ingress.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress-tls-secret.yaml
│   ├── ingress.yaml
│   ├── networkpolicy.yaml
│   ├── NOTES.txt
│   ├── 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

charts/: 用於存放此 chart 依賴的其他 chart (subcharts) Chart.lock: 用於鎖定 chart 依賴的 subcharts 的版本,確保每次部署的一致性
Chart.yaml: 包含了 chart 的元數據,例如 chart 名稱、版本、描述等
README.md: 提供 chart 的人類可讀的說明文件
templates/: 存放 Kubernetes 資源的模板文件。Helm 會將這裡的模板與 values.yaml 的值結合,生成最終的 Kubernetes manifest
values.yaml: 提供 chart 的默認配置值。用戶可以覆蓋這些值來自定義 chart 的部署


以上是 helm 的快速入門
如果一個完整的 app 需要 deploymnet,service,…etc
而他相依的 DB 也需要 deploymnet,service,…etc
會有非常多的 yaml file 要管理
helm 會包成一個 chart
並利用 template 機制產生 yaml
讓管理 app 所有 yaml 簡單的多