Helm

Helm 是一個 Kubernetes 的套件管理工具,可以用來部署應用程式到 Kubernetes 叢集中。

[!NOTE]

Helm 之於 Kubernetes,就像是 apt 或是 yum 之於 Linux。

一個 Helm 套件由三個部分組成:

  • Chart : Helm 套件的主要,裡面包含了要部署的應用程式的描述檔。
  • Repository : 用來存放 Chart 的地方,可以是本地端的檔案系統,也可以是遠端的 HTTP 伺服器。
  • Release : 一個 Chart 的部署實例,一個 Chart 可以部署多個 Release。

常用指令

搜尋 Chart:

# 從 Artifact Hub 搜尋 有沒有 WordPress 的 Chart
helm search hub wordpress

# 從本地添加的 Repository 中搜尋有沒有 WordPress 的 Chart
helm search repo wordpress

加入一個 Repository:

# 添加一個名稱為 sealed-secrets 的 Repository
# Repository 的 URL 為 https://charts.helm.sh/stable
helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets

安裝 Chart:

# 安裝 wordpress 的 Chart,並將 release 名稱設定為 happy-panda
helm install happy-panda bitnami/wordpress

查看 Release 的狀態:

helm status happy-panda

Chart 通常會有預設的設定,這些設定是可以修改的,可以使用 helm show values 查看 Chart 的預設設定。

helm show values bitnami/wordpress

如果想要修改 Chart 的設定,可以建立一個 values.yaml,並寫上想要修改的設定。

# values.yaml
mariadb:
  auth:
    database: user0db
    username: user0

使用 helm install-f 參數載入檔案,覆蓋 Chart 的預設設定。

# 使用 --generate-name 參數,讓 helm 自動產生 release 名稱
helm install -f values.yaml bitnami/wordpress --generate-name

也可以直接使用 --set 參數修改設定。

helm install bitnami/wordpress --generate-name \
--set mariadb.auth.database=user0db,mariadb.auth.username=user0

建立自己的 Chart

可以使用 helm create 來建立一個新的 Chart。

helm create mychart

mychart 資料夾的結構如下:

mychart
├── Chart.yaml <- Chart 的描述檔,包含了 Chart 的名稱、版本、描述等資訊
├── charts <- 用來存放其他 Chart 的資料夾,剛建立是空的
├── templates <- 用來存放 Kubernetes 資源描述檔的資料夾
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── service.yaml
│   ├── serviceaccount.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

你可以在 templates 中,放置你的 K8s 資源描述檔案。

Helm Template 提供一些特殊語法與控制流,讓你在寫資源描述檔時更得心應手。

內建物件 (Built-in Object)

Helm 提供了一些內建物件,你可以在 template 中使用這些物件。

apiVersion: v1
kind: ConfigMap
metadata:
  # Helm 中提供一種叫做 Release 的內置物件
  # 使用  可以取得 Chart 的發佈版本
  name: -configmap
data:
  myvalue: "Hello World"

更多內建物件可以參考文件

Pipeline

你可以在 template 中使用 Pipeline,來處理一些複雜的邏輯。例如將一個字串轉換成小寫。

apiVersion: v1
kind: ConfigMap
metadata:
  name: -configmap
data:
  # 將 myvalue 轉換成小寫
  # 這裡的 .Values.global.myvalue 是從 values.yaml 中取得的
  myvalue: 

Pipeline 可以串接多個函式,例如將一個字串轉換成小寫,再將第一個字母轉換成大寫。

apiVersion: v1
kind: ConfigMap
metadata:
  name: -configmap
data:
  # 將 myvalue 轉換成小寫,再將第一個字母轉換成大寫
  myvalue: 

控制流

Helm Template 提供了一些控制流,讓你可以在 template 中使用 ifelserange 等語法。

apiVersion: v1
kind: ConfigMap
metadata:
  name: -configmap
data:
  # 如果 .Values.global.myvalue 為空,則使用預設值
  myvalue:    default value 
apiVersion: v1
kind: ConfigMap
metadata:
  name: -configmap
data:
  # 如果 .Values.global.say 為 hello,則多一個 res: world 的欄位
  myvalue: foobar
   res: world 

還有類似於 forrange 語法,可以用來迭代一個 list。

apiVersion: v1
kind: ConfigMap
metadata:
  name: -configmap
data:
# 迭代 .Values.global.list,並將每個元素轉換成小寫
  - 

將自己的 Charts 上傳到 GitHub Pages 供別人使用

建立好你的 Chart 之後,就可以將它上傳到 GitHub Pages 供別人使用。

首先,你需要在 GitHub 上建立一個 Repository,資料夾結構如下:

mychart-repo
├── .github
│   └── workflows
│       └── release.yaml <- 用來自動發佈 Chart 的 GitHub Action
├── README.md
└── charts
    └── mychart <- 將你的 Chart 放在這裡

release.yaml 的內容如下:

name: Release Charts

on:
  push:
    branches:
      - main

jobs:
  release:
    permissions:
      contents: write
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: Configure Git
        run: |
          git config user.name "$GITHUB_ACTOR"
          git config user.email "$GITHUB_ACTOR@users.noreply.github.com"

      - name: Run chart-releaser
        uses: helm/chart-releaser-action@v1.6.0
        env:
          CR_TOKEN: "$"

接著,你需要在 GitHub 上建立一個分支 gh-pages

接下來,當你將 Chart 推到 main 分支時,GitHub Action 會自動將 Chart 發佈到 gh-pages 分支。

參考資料


This site uses Just the Docs, a documentation theme for Jekyll.