常用指令(置頂)
以下將常用指令置頂:
開發階段
1 | # 可以不安裝的方式顯示 release manifest (適合用來 debug 用) |
安裝後狀態檢查
1 | # 顯示指定 release 的 YAML 內容 |
管理 Helm Chart Repository
安裝 S3 plugin:
1 | # 安裝最新版 S3 plugin |
初始化 S3 bucket:(需要有足夠的 AWS S3 存取權限)
1 | # 初始化 Helm Chart Repo (假設 helm chart 要放在 `/test` prefix 下,階層可以自訂沒問題) |
加入 Helm Chart Repository:
1 | # 加入 S3 bucket (名稱為 "stable-myapp") |
打包 Helm Chart 並上傳
1 | # 先更新 Helm Chart repo,取得最新的 index.yaml |
安裝/升級/退版 Helm Chart 安裝
1 | # 從指定的 Helm Chart Repo 安裝指定最新版的 Helm Chart |
測試 & 驗證 Helm Chart
1 | # 檢查 Helm Chart 是否有語法上的錯誤 |
Templating 的應用
Go template 相關資訊
Go templating 的語法,可以參考 template · pkg.go.dev
若要查詢 template function(例如:quote, upper),可到 sprig 網站
pipeline 應用
可以透過 pipeline 的方式對 value 套用多個 function:
1 | # 一般使用方式 |
Flow control - if/else
以下是 if/else 的基本格式:
1 | {{ if PIPELINE }} |
以下情況下 if 會被判定為 false:
Boolean false
數字為 0
空字串
nil (空白 or null)
空集合 (map, slice, tuple, dict, array)
需要注意的地方:
indent 的問題需要注意,錯誤就會造成 YAML 文件有問題無法使用
whitespace & newline 可以透過
{{-` or `-}}
過濾掉,但同時擺上{{- if PIPELINE -}}
&{{- end -}}
可能會讓結果不如預期 (可參考官網詳細說明)
使用 with
- 使用
with
可用來限定變數的使用範圍,在寫 template 可以不用寫得很冗長的變數完整階層,但在 with 中無法使用其他變數,即使是 built-in object(例如:Release
) 也不行使用
range
也會有相同限制
自訂 variable
自訂變數用,可自行組合,例如搭配 built-in object 的值,語法是
{{- $relname := .Release.Name -}}
自訂的 variable 可以放進
with
內,因此搭配自訂 variable,就可以在with
中使用 built-in object 的值range 也可以透過自動 variable 的方式將指定變數之外的內容放進來
$
符號代表 Global chart value,有一些內建的 context 可用,例如:Release
(.Release.Name
,.Release.Service
… etc) &Chart
(Chart.Version
,Chart.AppVersion
… etc)
自訂 template
- 透過 define 關鍵字可以自訂一個 template,並在 template 其他的地方引用
自訂的 template 可以定義在獨立的檔案,也可以與引用它的檔案放在一起
1 | {{- define "mychart.workload_labels" }} |
自訂的 template 建議放在獨立的檔案,一般會定義在
_helpers.tpl
檔案中在自訂的 template 中使用 built-in object value,引用時會發現 value 是空白的,原因是因為沒有指定 scope,在引用 template 時指定好 scope 就可以解決此問題
1 | {{- define "mychart.labels" }} |
使用 include 來放入 template 資訊
若是 template 被引用是在 chart 中各種不同的位置,甚至是其他 chart 時,縮排(indent)的處理就至關重要,光用
template
關鍵字引用 template 可能會遇到 indent 錯誤的問題,此時就是使用include
來解決問題基本上,
template
&include
功能是相同的,都是用來引用透過define
定義的 template僅有
include
可以搭配indent
使用,用法範例為{{ include "mychart.version" . | indent 4 }}
Notes
透過撰寫 NOTES.txt
檔案的內容,可以在使用者透過 chart 佈署特定資源後,告知使用者如何連線到此服務、如何使用此服務之類的訊息;對於提供使用者如何正確的使用服務有很大的幫助。
sub chart
sub chart 顧名思義就是在一個 Helm chart 中再包一個 Helm chart 的概念
每一個 sub chart 可以定義自己的 values,但 parent chart 中可以 override sub chart 中設定的值
在 parent chart 中可以定義 Global variable,讓 parent chart & sub chart 都可以使用
使用關鍵字
global
,並放在 root level
Repository Management
Overview
基本上,最簡單的 Helm Chart Repository,只要符合兩個條件即可:
支援 HTTP(S) 協定
提供 Helm Chart package & 對應的 index 檔案(
index.yaml
) 即可
目前在自架方案中,比較常用的 solution 是 ChartMuseum
但由於 Helm CLI 有 plugin 的機制,這使得也可以使用像是 AWS S3 作為 Helm Chart Repository (可參考䅮面的常用指令操作)
另外 Helm CLI 也支援使用提供 OCI(Open Container Initiative) 標準的 Helm Chart Repository,因此像是 AWS ECR 就可以作為 Helm Chart Repository 其中一個選項之一
GitHub as Helm Repository
- 由於 GitHub Repository 本身並不是設定用來存放 Helm Chart,因此沒有相關功能,所以用來表示 Helm Chart 的 index file
index.yaml
就必須自行產生後再 push 到 GitHub
1 | # 可以根據目前目錄下的 helm package 產生 index.yaml |
- 若相關檔案已經正確上傳到 GitHub Repository,就可以透過類似下面格式用來加入 Helm Chart Repo 並使用
https://raw.githubusercontent.com/[USER_NAME]/[REPO_NAME]/[BRANCH_NAME]
Helm Chart Hook
Helm Chart 有 Chart Hooks 的機制設計,可以在 Helm Chart 的生命週期各階段根據需求執行不同的 hook job,從官網的說明中,有以下幾個 Chart Hook 可使用:
pre-install
: Executes after templates are rendered, but before any resources are created in Kubernetespost-install
: Executes after all resources are loaded into Kubernetespre-delete
: Executes on a deletion request before any resources are deleted from Kubernetespost-delete
: Executes on a deletion request after all of the release’s resources have been deletedpre-upgrade
: Executes on an upgrade request after templates are rendered, but before any resources are updatedpost-upgrade
: Executes on an upgrade request after all resources have been upgradedpre-rollback
: Executes on a rollback request after templates are rendered, but before any resources are rolled backpost-rollback
: Executes on a rollback request after all resources have been modifiedtest
: Executes when the Helm test subcommand is invoked ( view test docs)
撰寫方式其實也很簡單,只要將要執行的 Hook Job 加上 Annotations 的內容即可,範例如下:(以下是個 post-install 的範例)
1 | apiVersion: batch/v1 |
若是同一個 job 同時在不同的 Chart Hook 中需要,也可以這樣寫:
1 | annotations: |
與 ArgoCD 整合
若是環境中有使用 ArgoCD 搭配 Helm,需要注意的是,並非所有 Chart Hook 都有支援,因此若是有利用到 Chart Hook 時,就需要留意一下。
相關的詳細說明可以參考 ArgoCD 文件說明。