Helm 是 k8s 的套件管理工具,有點像是 mac 的 Homebrew,或是 Linux 中的 yum 負責安裝及管理套件。
當今天想要將自己在 k8s 中建立的程式分享給他人時,此時會有很多設定檔案,如 Deployment、Service、ConfigSet 或 Secret 等,這些東西都必須複製一份出來到他人的 k8s 環境上,除此之外還需要針對每個設定檔案去一一修改其中的個別參數,以符合自己的需求,處理起來勢必很耗時間。
Helm 的功能就是針對這些 yaml 設定檔收集起來,並打包成一個 package,便於分享給他人使用,並提供模板引擎讓使用者可以輕易替換 yaml 裡面的設定參數。
其中,Helm Charts
是描述一個 k8s 中相關資源檔案(yaml)的集合,也就是剛才提到的 package。這些 Helm Charts 可以放在私人 helm repository
或放在網路上與他人分享,例如「ArtifactHub」是一個類似 DockerHub 讓開發者上傳自己建立 helm charts 的地方,也可以在上面尋找 k8s packages。
Release
指的是在 k8s 叢集中的 chart 實例。一個 chart 可以在同個叢集中安裝不只一次,每安裝一次 k8s 都會建立一個新的 release。
我們可以透過 helm 到 helm repository 尋找他人的 helm charts,並將其下載下來,讓 helm 將下載的 charts 安裝到自己叢集上使用。
在安裝上官方提供很多種方式,我這邊是 mac 使用 Homebrew 安裝。
brew install helm
查看版本。
helm version
在 ArtifactHub 上尋找有關 bitnami 的 charts,如沒有過濾會列出所有可用的 charts。
helm search hub bitnami
透過 helm repo add
將 ArtifactHub 上的 charts 加入至自己本地的 repository,方便管理與查找。
helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories
在自己的 repository 查看。
helm search repo bitnami
安裝 bitnami charts,可以看到安裝後 chart 實例的名稱:mysql-1696867238
。
helm repo update
helm install bitnami/mysql --generate-name
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "bitnami" chart repository
Update Complete. ⎈Happy Helming!⎈
NAME: mysql-1696867238
# ...略
查看 chart 相關資訊。
helm show chart bitnami/mysql
查看當前叢集中有哪些 releases。
helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mysql-1696867238 default 1 2023-10-10 00:00:40.695898 +0800 CST deployed mysql-9.12.4 8.0.34
執行以下指令,解除安裝這個 release。
helm uninstall mysql-1696867238
release "mysql-1696867238" uninstalled
helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
若是要從本地 repository 刪除 bitnami 這個 chart。
helm repo remove bitnami
查看一下。
helm repo list
Error: no repositories to show
尋找 chart: wordpress。
helm search hub wordpress
將其加入到自己的 repo。
helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories
安裝 wordpress 並將其 release 命名為 happy-panda,--generate-name
加了會自動幫命名。
helm install happy-panda bitnami/wordpress
接著查看這個 chart 提供可自定義參數的地方。
helm show values bitnami/wordpress # 查看可以自定義的參數
# ... 略
mariadb:
## @param mariadb.enabled Deploy a MariaDB server to satisfy the applications database requirements
## To use an external database set this to false and configure the `externalDatabase.*` parameters
##
enabled: true
## @param mariadb.architecture MariaDB architecture. Allowed values: `standalone` or `replication`
##
architecture: standalone
## MariaDB Authentication parameters
## @param mariadb.auth.rootPassword MariaDB root password
## @param mariadb.auth.database MariaDB custom database
## @param mariadb.auth.username MariaDB custom user name
## @param mariadb.auth.password MariaDB custom user password
# ... 略
這邊是我想修改的參數內容:
mariadb.auth.database
設定為 mydb
。mariadb.auth.username
設定為 vanz
。將其寫成一個 values.yaml
檔案。
mariadb:
auth:
database: mydb
username: vanz
這邊我再重新 release 一個版本出來,並以 -f
或 --values
指定要覆蓋的參數內容。
helm install -f values.yaml bitnami/wordpress --generate-name
查看當前 release。
helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
happy-panda default 1 2023-10-10 00:25:58.851103 +0800 CST deployed wordpress-17.1.16 6.3.1
wordpress-1696870314 default 1 2023-10-10 00:51:56.63141 +0800 CST deployed wordpress-17.1.16 6.3.1
查看在這個 release 中我設定了哪些自定義的參數內容。
helm get values wordpress-1696870314
USER-SUPPLIED VALUES:
mariadb:
auth:
database: mydb
username: vanz
接著前往 pods 查看這些設定值有沒有真的修改,選定 wordpress-1696870314-mariadb-0
這個 pod。
kubectl get po
NAME READY STATUS RESTARTS AGE
happy-panda-mariadb-0 0/1 CrashLoopBackOff 8 (3m36s ago) 28m
happy-panda-wordpress-7676768bf4-wvd9g 0/1 CrashLoopBackOff 8 (3m28s ago) 28m
wordpress-1696870314-6fd8bd66c7-hkqw9 1/1 Running 0 2m40s
wordpress-1696870314-mariadb-0 1/1 Running 0 2m40s
從 kubectl describe
可以看到替換掉原本 yaml 預設值,變為 vanz
與 mydb
。
kubectl describe pods wordpress-1696870314-mariadb-0
# ... 略
MARIADB_USER: vanz
MARIADB_PASSWORD: <set to the key 'mariadb-password' in secret 'wordpress-1696870314-mariadb'> Optional: false
MARIADB_DATABASE: mydb
# ... 略
以下是原本預設的。
# ... 略
MARIADB_USER: bn_wordpress
MARIADB_PASSWORD: <set to the key 'mariadb-password' in secret 'wordpress-1696870695-mariadb'> Optional: false
MARIADB_DATABASE: bitnami_wordpress
# ... 略
1.Helm Docs - Quickstart Guide
2.Helm Docs - 使用Helm