Chart
Helm 使用名為圖表之封裝格式。圖表是描述一組相關 Kubernetes 資源的檔案集合。單一圖表可以用於部署簡單的應用程式,例如 memcached pod,或是複雜的應用程式,例如包含 HTTP 伺服器、資料庫、快取等功能的完整 Web 應用程式堆疊。
圖表會以特定目錄樹中的檔案形式產生,並可以封裝成版本化封存檔案進行部署。
如果您想要下載並查看已發布圖表的檔案,而不安裝它,可以使用 helm pull chartrepo/chartname
這麼做。
這份文件說明了圖表格式,並提供使用 Helm 建構圖表的基礎指南。
圖表檔案結構
圖表會組織成目錄中的檔案集合。目錄名稱為圖表的名稱(不包含版本資訊)。因此,描述 WordPress 的圖表會儲存在 wordpress/
目錄中。
在這個目錄中,Helm 會預期有符合此結構的內容
wordpress/
Chart.yaml # A YAML file containing information about the chart
LICENSE # OPTIONAL: A plain text file containing the license for the chart
README.md # OPTIONAL: A human-readable README file
values.yaml # The default configuration values for this chart
values.schema.json # OPTIONAL: A JSON Schema for imposing a structure on the values.yaml file
charts/ # A directory containing any charts upon which this chart depends.
crds/ # Custom Resource Definitions
templates/ # A directory of templates that, when combined with values,
# will generate valid Kubernetes manifest files.
templates/NOTES.txt # OPTIONAL: A plain text file containing short usage notes
Helm 會保留 charts/
、crds/
和 templates/
目錄以及所列檔名的使用權。其他檔案會保持原樣。
Chart.yaml 檔案
Chart.yaml
檔案是圖表所必需的。它包含下列欄位
apiVersion: The chart API version (required)
name: The name of the chart (required)
version: A SemVer 2 version (required)
kubeVersion: A SemVer range of compatible Kubernetes versions (optional)
description: A single-sentence description of this project (optional)
type: The type of the chart (optional)
keywords:
- A list of keywords about this project (optional)
home: The URL of this projects home page (optional)
sources:
- A list of URLs to source code for this project (optional)
dependencies: # A list of the chart requirements (optional)
- name: The name of the chart (nginx)
version: The version of the chart ("1.2.3")
repository: (optional) The repository URL ("https://example.com/charts") or alias ("@repo-name")
condition: (optional) A yaml path that resolves to a boolean, used for enabling/disabling charts (e.g. subchart1.enabled )
tags: # (optional)
- Tags can be used to group charts for enabling/disabling together
import-values: # (optional)
- ImportValues holds the mapping of source values to parent key to be imported. Each item can be a string or pair of child/parent sublist items.
alias: (optional) Alias to be used for the chart. Useful when you have to add the same chart multiple times
maintainers: # (optional)
- name: The maintainers name (required for each maintainer)
email: The maintainers email (optional for each maintainer)
url: A URL for the maintainer (optional for each maintainer)
icon: A URL to an SVG or PNG image to be used as an icon (optional).
appVersion: The version of the app that this contains (optional). Needn't be SemVer. Quotes recommended.
deprecated: Whether this chart is deprecated (optional, boolean)
annotations:
example: A list of annotations keyed by name (optional).
自 v3.3.2 起,不再允許有其他欄位。建議做法是在 annotations
中加入自訂的元資料。
圖表和版本資訊
每個圖表都必須要有版本編號。版本必須符合 SemVer 2 標準。Helm v2 及更新版本不像 Helm Classic 一樣會使用版本號碼做為版本標記。存放庫中的套件會用名稱和版本來識別。
例如,版本欄位設為 version: 1.2.3
的 nginx
圖表會被命名為
nginx-1.2.3.tgz
也支援更複雜的 SemVer 2 名稱,例如 version: 1.2.3-alpha.1+ef365
。但是系統明確禁止使用非 SemVer 名稱。
注意:雖然 Helm Classic 和 Deployment Manager 在處理圖表時都非常強調 GitHub,但 Helm v2 和更新版本並不需要 GitHub 或 Git。因此,它完全不使用 Git SHA 作為版本控制。
CLI 等許多 Helm 工具都會使用 Chart.yaml
內部的 version
欄位。生成封裝時,helm package
指令會將它在 Chart.yaml
找到的版本作為封裝名稱中的符號。系統會假設圖表封裝名稱中的版本號會與 Chart.yaml
中的版本號一致。如果這項假設不成立,就會產生錯誤。
apiVersion
欄位
需要至少 Helm 3 的 Helm 圖表的 apiVersion
欄位應設為 v2
。支援先前 Helm 版本的圖表其 apiVersion
設為 v1
,而且也能夠由 Helm 3 安裝。
從 v1
變更為 v2
dependencies
欄位定義圖表相依關係,在v1
圖表中放置於獨立的requirements.yaml
檔案(請參閱 圖表相依關係)。type
欄位判斷應用程式和函式庫圖表(請參閱 圖表類型)。
appVersion
欄位
請注意 appVersion
欄位與 version
欄位無關。這是指定應用程式版本的方法。例如,drupal
圖表可能具有 appVersion: "8.2.1"
,這表示包括在圖表中(預設)的 Drupal 版本為 8.2.1
。這個欄位供提供資訊之用,不會影響圖表版本計算。強烈建議在版本號外加上引號。這樣可以讓 YAML 解析程式將版本號當成字串處理。在某些情況下,如果不加上引號,可能會導致無法解析的問題。例如,YAML 會將 1.0
解釋為浮點數值,而將 1234e10
等 git 提交 SHA 解釋為科學記號。
在 Helm v3.5.0 中,helm create
會在預設的 appVersion
欄位外加上引號。
kubeVersion
欄位
可選擇的 kubeVersion
欄位可以定義支援的 Kubernetes 版本中關於 semver 約束的條件。Helm 會在安裝圖表時驗證版本約束的條件,如果叢集執行的 Kubernetes 版本未獲得支援,就會失敗。
版本約束的條件可以包含以空格分隔的 AND 比較,例如
>= 1.13.0 < 1.15.0
本身可以與 OR ||
運算子結合使用,如下例所示
>= 1.13.0 < 1.14.0 || >= 1.14.1 < 1.15.0
在此範例中,會排除版本 1.14.0
,如果已知特定版本中的 bug 會導致圖表無法正確執行,這很有道理。
除了使用運算子 =
!=
>
<
>=
<=
來約束版本之外,還支援以下簡寫符號
- 封閉區間的連字號範圍,其中
1.1 - 2.3.4
等於>= 1.1 <= 2.3.4
。 - 萬用字元
x
、X
和*
,其中1.2.x
等於>= 1.2.0 < 1.3.0
。 - 範圍起伏(修正版本變更允許),其中
~1.2.3
等於>= 1.2.3 < 1.3.0
。 - 範圍起伏(次要版本變更允許),其中
^1.2.3
等於>= 1.2.3 < 2.0.0
。
若要詳細了解支援的 semver 限制,請參閱 Masterminds/semver。
逐漸捨棄圖表
在圖表儲存庫中管理圖表時,有時有必要逐漸捨棄圖表。Chart.yaml
中選用的 deprecated
欄位可用於標示圖表為已逐漸捨棄。如果儲存庫中圖表的**最新**版本已標示為已逐漸捨棄,則表示圖表整體已逐漸捨棄。稍後可透過發布非標記已逐漸捨棄的新版本來重複使用圖表名稱。逐漸捨棄圖表的步驟包括
- 更新圖表的
Chart.yaml
來標示圖表已逐漸捨棄,並更新版本 - 在圖表儲存庫中釋出新圖表版本
- 從來源儲存庫中移除圖表(例如 Git)
圖表類型
type
欄位定義圖表的類型。有兩個類型:application
和 library
。應用程式是預設類型,這是一個可以完全操作的標準圖表。程式庫圖表 為圖表建立工具提供實用工具或功能。程式庫圖表不同於應用程式圖表在於它不可安裝,而且通常不包含任何資源物件。
請注意:應用程式圖表可以用做程式庫圖表。這會透過將類型設定為 library
來啟用。然後圖表將作為程式庫圖表呈現,其中所有實用工具和功能皆可利用。圖表的所有資源物件不會呈現。
圖表授權、自述檔和注意事項
圖表也能包含說明圖表的安裝、組態、使用和授權的檔案。
授權是一種純文字檔案,包含圖表的 授權。圖表能包含授權,因為範本可能有程式邏輯,因此不會僅限於組態。如有需要時,也會有個別授權供圖表安裝的應用程式。
圖表自述檔應以 Markdown (README.md) 格式化,並且一般應包含
- 圖表提供的應用程式或服務的說明
- 執行圖表所需的任何前提條件或需求
values.yaml
中的選項說明和預設值- 任何其他與圖表的安裝或組態有關的資訊
當 hub 和其他使用者介面顯示有關圖表的資訊時,這些詳細資訊會從 README.md
檔案中的內容拉取。
圖表也可以包含簡短的純文字 templates/NOTES.txt
檔案,此檔案會在安裝後和檢視版本狀態時列印出來。此檔案會評估為 樣板,可用於顯示使用說明、後續步驟或與圖表版本相關的其他任何資訊。例如,可以提供連線至資料庫或存取 Web UI 的說明。由於此檔案在執行 helm install
或 helm status
時會列印至 STDOUT,因此建議內容簡潔扼要,並在 README 中提供更詳細的資訊。
圖表相依性
在 Helm 中,一個圖表可以相依於任何數量的其他圖表。這些相依性可以使用 Chart.yaml
中的 dependencies
欄位動態連結,或引入到 charts/
目錄中,並手動管理。
使用 dependencies
欄位管理相依性
當前圖表所需的圖表在 dependencies
欄位中定義為清單。
dependencies:
- name: apache
version: 1.2.3
repository: https://example.com/charts
- name: mysql
version: 3.2.1
repository: https://another.example.com/charts
name
欄位就是要的圖表名稱。version
欄位就是要的圖表版本。repository
欄位是圖表儲存庫的完整 URL。請注意,也必須使用helm repo add
在本地新增該儲存庫。- 可以改用儲存庫名稱,而不是 URL。
$ helm repo add fantastic-charts https://charts.helm.sh/incubator
dependencies:
- name: awesomeness
version: 1.0.0
repository: "@fantastic-charts"
定義相依性後,可以執行 helm dependency update
,它會使用相依性檔案為你下載所有指定的圖表到 charts/
目錄中。
$ helm dep up foochart
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "local" chart repository
...Successfully got an update from the "stable" chart repository
...Successfully got an update from the "example" chart repository
...Successfully got an update from the "another" chart repository
Update Complete. Happy Helming!
Saving 2 charts
Downloading apache from repo https://example.com/charts
Downloading mysql from repo https://another.example.com/charts
當 helm dependency update
擷取圖表時,會以圖表封存檔的方式將它們儲存在 charts/
目錄中。因此,針對上述範例,預期會在圖表目錄中看到以下檔案:
charts/
apache-1.2.3.tgz
mysql-3.2.1.tgz
相依性中的別名字段
除了上述其他欄位之外,各項需求輸入還可以包含選用欄位 alias
。
為相依性圖表新增別名,會將圖表放進相依性中,並將別名用作新相依性的名稱。
在需要存取具有其他名稱的圖表時,可以用到 alias
。
# parentchart/Chart.yaml
dependencies:
- name: subchart
repository: https://127.0.0.1:10191
version: 0.1.0
alias: new-subchart-1
- name: subchart
repository: https://127.0.0.1:10191
version: 0.1.0
alias: new-subchart-2
- name: subchart
repository: https://127.0.0.1:10191
version: 0.1.0
在上述範例中我們會總共獲得 3 組與 parentchart
相依的圖表。
subchart
new-subchart-1
new-subchart-2
手動達成這個目標的方式,是將相同的圖表以不同的名稱多次複製/貼上到 charts/
目錄中。
相依性中的標籤和條件欄位
除了上述其他欄位之外,各項需求輸入還可以包含選用欄位 tags
和 condition
。
預設會載入所有圖表。如果存在 tags
或 condition
欄位,將會評估這些欄位,並用於控制套用欄位的圖表的載入。
條件 - 條件欄位包含一個或多個 YAML 路徑(以逗號分隔)。如果此路徑存在於頂層父項的數值中,並解析為布林值,圖表將根據布林值啟用或停用。僅 оцени清單中找到的第一個有效路徑,如果沒有路徑存在,則條件不會生效。
標籤 - 標籤欄位是與此圖表關聯的標籤 YAML 清單。在頂層父項的數值中,所有带有標籤的圖表都可以透過指定標籤和布林值來啟用或停用。
# parentchart/Chart.yaml
dependencies:
- name: subchart1
repository: https://127.0.0.1:10191
version: 0.1.0
condition: subchart1.enabled,global.subchart1.enabled
tags:
- front-end
- subchart1
- name: subchart2
repository: https://127.0.0.1:10191
version: 0.1.0
condition: subchart2.enabled,global.subchart2.enabled
tags:
- back-end
- subchart2
# parentchart/values.yaml
subchart1:
enabled: true
tags:
front-end: false
back-end: true
在上述範例中,所有带有 front-end
標籤的圖表都會停用,但由於 subchart1.enabled
路徑在父項的數值中評估為 'true',條件將覆寫 front-end
標籤,而 subchart1
會啟用。
由於 subchart2
標籤為 back-end
,且該標籤評估為 true
,因此 subchart2
會啟用。另請注意,儘管指定了 subchart2
的條件,但父項的數值中沒有對應的路徑和值,因此該條件不會生效。
使用 CLI 與標籤和條件
可照常使用 --set
參數來變更標籤和條件值。
helm install --set tags.front-end=true --set subchart2.enabled=false
標籤和條件解決
- 條件(在數值中設定時)總是會覆寫標籤。第一個存在的條件路徑會勝出,而圖表中後續的條件路徑會被忽略。
- 標籤評估為 '圖表的任何標籤如果為 true,則啟用圖表'。
- 標籤和條件值必須設定在頂層父項的數值中。
- 數值中的
tags:
鍵必須是頂層鍵。目前不支援全局和嵌套的tags:
表格。
透過相依性匯入子數值
在某些情況下,可以讓子圖表的數值傳播到父圖表,並做為共用預設值。使用 exports
格式的另一個好處是,它可以讓後續的工具內省使用者可設定的數值。
包含要匯入數值的鍵可以輸入父圖表的 dependencies
中的 import-values
欄位中,使用 YAML 清單。清單中的每個項目都是從子圖表的 exports
欄位中匯入的鍵。
若要匯入未包含在 exports
鍵中的數值,請使用 子項-父項 格式。以下說明這兩種格式的範例。
使用 exports 格式
如果子圖表的 values.yaml
檔案在根目錄中包含一個 exports
欄位,可用以下範例指定匯入的鍵,直接將其內容匯入父項的數值中
# parent's Chart.yaml file
dependencies:
- name: subchart
repository: https://127.0.0.1:10191
version: 0.1.0
import-values:
- data
# child's values.yaml file
exports:
data:
myint: 99
由於我們在匯入清單中指定鍵 data
,Helm 會在子圖表的 exports
欄位中尋找 data
鍵,並匯入其內容。
最終的父項數值將包含我們匯出的欄位
# parent's values
myint: 99
請注意,父層金鑰 data
不包含在父層的最後值中。如果您需要指定父層金鑰,請使用「子層-父層」格式。
使用子層-父層格式
若要存取子層範例值中 exports
金鑰不包含的值,您需要指定要匯入的值的來源金鑰(child
)以及父層範例中的目標路徑值(parent
)。
以下範例中的 import-values
指示 Helm 取得在 child:
路徑找到的任何值,並將它們複製到父層值中由 parent:
指定的路徑。
# parent's Chart.yaml file
dependencies:
- name: subchart1
repository: https://127.0.0.1:10191
version: 0.1.0
...
import-values:
- child: default.data
parent: myimports
在上述範例中,在 subchart1 的值中找到的 default.data
值,將會匯入到父層範例值中的 myimports
金鑰,如下詳述
# parent's values.yaml file
myimports:
myint: 0
mybool: false
mystring: "helm rocks!"
# subchart1's values.yaml file
default:
data:
myint: 999
mybool: true
以下是父層範例的結果值
# parent's final values
myimports:
myint: 999
mybool: true
mystring: "helm rocks!"
父層的最後值現在包含從 subchart1 匯入的 myint
和 mybool
欄位。
手動管理相依性,透過 charts/
目錄
如果需要對相依性進一步控制,可以透過將相依性範例複製到 charts/
目錄中,明確地表達這些相依性。
相依性應該是解壓縮的範例目錄,但其名稱不能以 _
或 .
開頭。範例載入器會忽略此類檔案。
例如,如果 WordPress 範例依賴 Apache 範例,則會在 WordPress 範例的 charts/
目錄中提供 Apache 範例(正確的版本)。
wordpress:
Chart.yaml
# ...
charts/
apache/
Chart.yaml
# ...
mysql/
Chart.yaml
# ...
以上的範例顯示 WordPress 範例如何透過在 charts/
目錄中包含這些範例,來表達其對 Apache 和 MySQL 的相依性。
提示: 若要將相依性丟到您的 charts/
目錄中,請使用 helm pull
指令
使用相依性的操作層面
以上的章節說明如何指定範例相依性,但這如何影響使用 helm install
和 helm upgrade
安裝範例?
假設一個稱為「A」的範例建立了以下 Kubernetes 物件
- 命名空間「A-Namespace」
- 有狀態組「A-StatefulSet」
- 服務「A-Service」
此外,A 依賴建立物件的範例 B
- 命名空間「B-Namespace」
- 複製品組「B-ReplicaSet」
- 服務「B-Service」
在安裝/升級 A 範例後,會建立/修改單一 Helm 版本。版本將會按照下列順序建立/更新以上所有的 Kubernetes 物件
- A-Namespace
- B-Namespace
- A-Service
- B-Service
- B-ReplicaSet
- A-StatefulSet
這是因為當 Helm 安裝/升級範例時,範例和所有其相依性的 Kubernetes 物件都已
- 集合到單一組中;接著
- 以類別接著名稱排序;最後
- 按照那個順序建立/更新。
因此,建立單一版本包含該範例和其相依性的所有物件。
Kubernetes 類型的安裝程序順序由 kind_sorter.go 中的列舉 InstallOrder 提供(參閱 Helm 原始檔案)。
範本和值
Helm 圖表範本使用 Go 範本語言 撰寫,並加入了 50 個左右來自 Sprig 函式庫 的附加範本函式,以及一些其他 特殊函式。
所有範本檔案都儲存在圖表的 templates/
資料夾中。當 Helm 呈現這些圖表時,它將通過範本引擎處理該目錄中的每個檔案。
範本的值以兩種方式提供
- 圖表開發人員可能在圖表中提供一個名為
values.yaml
的檔案。此檔案可以包含預設值。 - 圖表使用者可以提供一個包含值的 YAML 檔案。這可以透過
helm install
搭配命令提示字元提供。
當使用者提供自訂值時,這些值將會覆寫圖表中的 values.yaml
檔案中的值。
範本檔案
範本檔案遵循撰寫 Go 範本的標準慣例(請參閱 text/template Go 套件文件中詳細解說)。範本檔案範例可能如下所示
apiVersion: v1
kind: ReplicationController
metadata:
name: deis-database
namespace: deis
labels:
app.kubernetes.io/managed-by: deis
spec:
replicas: 1
selector:
app.kubernetes.io/name: deis-database
template:
metadata:
labels:
app.kubernetes.io/name: deis-database
spec:
serviceAccount: deis-database
containers:
- name: deis-database
image: {{ .Values.imageRegistry }}/postgres:{{ .Values.dockerTag }}
imagePullPolicy: {{ .Values.pullPolicy }}
ports:
- containerPort: 5432
env:
- name: DATABASE_STORAGE
value: {{ default "minio" .Values.storage }}
以上範例大致基於 https://github.com/deis/charts,是 Kubernetes 複製控制器的範本。它可以使用下列四個範本值(通常定義在 values.yaml
檔案中)
imageRegistry
:Docker 映象的來源註冊中心。dockerTag
:Docker 映象的標籤。pullPolicy
:Kubernetes 提取政策。storage
:儲存後端,預設設定為"minio"
這些值全部都由範本作者定義。Helm 不需要或不會指示參數。
若要查看許多工作圖表,請查看 CNCF 人工製品中心。
預先定義值
透過 values.yaml
檔案(或透過 --set
旗標)提供的值,可以在範本的 .Values
物件中存取。但是,您可以在範本中存取其他預先定義的資料部分。
下列值已預先定義,可供每個範本使用,且無法覆寫。與所有值一樣,名稱區分 大小寫。
Release.Name
:版本名稱(不是圖表)Release.Namespace
:版本發布到的命名空間。Release.Service
:執行發布的服務。Release.IsUpgrade
:如果目前的作業是升級或回滾,則設為 true。Release.IsInstall
:如果目前的作業是安裝,則設為 true。Chart
:Chart.yaml
的內容。因此,可以將 chart 版本取得為Chart.Version
,而維護人員會在Chart.Maintainers
。Files
:包含 chart 中所有非特殊檔案的類似鍵值物件。這不會讓您存取範本,但會讓您存取存在的其他檔案(除非使用.helmignore
將其排除)。可以使用{{ index .Files "file.name" }}
或使用{{.Files.Get name }}
函式存取檔案。您也可以使用{{ .Files.GetBytes }}
以[]byte
的方式存取檔案內容。Capabilities
:包含有關 Kubernetes 版本({{ .Capabilities.KubeVersion }}
)和支援 Kubernetes API 版本({{ .Capabilities.APIVersions.Has "batch/v1" }}
)的類似鍵值物件。
注意:將會捨棄任何不認識的 Chart.yaml
欄位。這些欄位不會在 Chart
物件內部可存取。因此,Chart.yaml
無法用於將任意結構化的資料傳遞到範本。不過,值檔案可以用於此目的。
值檔案
考量上一節的範本,提供必要值的 values.yaml
檔案看起來會像這樣
imageRegistry: "quay.io/deis"
dockerTag: "latest"
pullPolicy: "Always"
storage: "s3"
值檔案以 YAML 格式化。chart 可以包含預設的 values.yaml
檔案。Helm 安裝指令允許使用者透過提供其他 YAML 值來覆寫值
$ helm install --generate-name --values=myvals.yaml wordpress
以這種方式傳遞值時,會將其合併到預設值檔案中。例如,請考慮看起來像這樣的 myvals.yaml
檔案
storage: "gcs"
將此與 chart 中的 values.yaml
合併時,產生的結果會是
imageRegistry: "quay.io/deis"
dockerTag: "latest"
pullPolicy: "Always"
storage: "gcs"
請注意,只覆寫了最後一個欄位。
注意:包含在 chart 內部的預設值檔案必須命名為 values.yaml
。但是,可以在命令列上指定的檔案可以任意命名。
注意:如果在 helm install
或 helm upgrade
上使用 --set
旗標,則僅會在用戶端上將那些值轉換為 YAML。
注意:如果值檔案中存在的任何必要分頁,可以透過使用 'required' 函式 在 chart 範本中宣告它們的必要性。
可以使用 .Values
物件在範本內部存取這些值中的任何一個。
apiVersion: v1
kind: ReplicationController
metadata:
name: deis-database
namespace: deis
labels:
app.kubernetes.io/managed-by: deis
spec:
replicas: 1
selector:
app.kubernetes.io/name: deis-database
template:
metadata:
labels:
app.kubernetes.io/name: deis-database
spec:
serviceAccount: deis-database
containers:
- name: deis-database
image: {{ .Values.imageRegistry }}/postgres:{{ .Values.dockerTag }}
imagePullPolicy: {{ .Values.pullPolicy }}
ports:
- containerPort: 5432
env:
- name: DATABASE_STORAGE
value: {{ default "minio" .Values.storage }}
範圍、相依性和值
值檔案可以宣告頂層 chart 的值,也可以宣告 chart 的 charts/
目錄中包含的任何 chart 的值。或者換句話說,值檔案可以向 chart 提供值以及向其任何相依性提供值。例如,上述展示的 WordPress chart 將 mysql
和 apache
作為相依性。值檔案可以提供值給所有這些元件。
title: "My WordPress Site" # Sent to the WordPress template
mysql:
max_connections: 100 # Sent to MySQL
password: "secret"
apache:
port: 8080 # Passed to Apache
在更高階層圖表中存取定義在較低階層圖表中的所有變數。例如 WordPress 圖表可以使用 MySQL 密碼,方式為 .Values.mysql.password
。但較低階層圖表無法存取父層圖表中的資料,因此 MySQL 無法存取 title
屬性。此外,也無法存取 apache.port
。
值會加上命名空間,但命名空間會被修剪。因此,對於 WordPress 圖表,它可以使用 .Values.mysql.password
存取 MySQL 密碼欄位。但對於 MySQL 圖表,值範圍已縮小且移除命名空間字首,因此只會將密碼欄位視為 .Values.password
。
全域值
Helm 自 2.0.0-Alpha.2 起支援特殊的「全域」值。參閱以下針對先前範例進行修改的版本
title: "My WordPress Site" # Sent to the WordPress template
global:
app: MyWordPress
mysql:
max_connections: 100 # Sent to MySQL
password: "secret"
apache:
port: 8080 # Passed to Apache
上述範例新增一個 global
區段,值為 app: MyWordPress
。此值可供 所有 圖表以 .Values.global.app
使用。
例如,mysql
樣板可以使用 {{ .Values.global.app}}
存取 app
,apache
圖表亦同。基本上,values 檔案會以以下方式重新產生
title: "My WordPress Site" # Sent to the WordPress template
global:
app: MyWordPress
mysql:
global:
app: MyWordPress
max_connections: 100 # Sent to MySQL
password: "secret"
apache:
global:
app: MyWordPress
port: 8080 # Passed to Apache
這提供一種方式可與所有子圖表共用一個頂層變數,這對於設定標籤等 metadata
屬性來說非常實用。
如果子圖表宣告一個全域變數,則該全域變數會傳遞 向下(至子圖表的子圖表),但不會傳遞 向上 至父圖表。子圖表無法影響父圖表的值。
另外,父圖表的全域變數優先於子圖表中的全域變數。
Schema 檔案
有時,圖表維護員可能希望在他們的值中定義一個結構。這可以透過在 values.schema.json
檔案中定義一個 schema 來完成。schema 表示為 JSON schema。它的外觀可能如下所示
{
"$schema": "https://json-schema.dev.org.tw/draft-07/schema#",
"properties": {
"image": {
"description": "Container Image",
"properties": {
"repo": {
"type": "string"
},
"tag": {
"type": "string"
}
},
"type": "object"
},
"name": {
"description": "Service name",
"type": "string"
},
"port": {
"description": "Port",
"minimum": 0,
"type": "integer"
},
"protocol": {
"type": "string"
}
},
"required": [
"protocol",
"port"
],
"title": "Values",
"type": "object"
}
這個 schema 會套用至值上以進行驗證。當呼叫下列任何命令時,便會進行驗證
helm install
helm upgrade
helm lint
helm template
下方的 values.yaml
檔案範例符合這個 schema 的需求,它的外觀可能如下所示
name: frontend
protocol: https
port: 443
請注意,會將 schema 套用至最後的 .Values
物件,而不會只套用到 values.yaml
檔案。這表示下方 yaml
檔案是有效的,因為圖表是使用下方顯示的適當 --set
選項安裝的。
name: frontend
protocol: https
helm install --set port=443
此外,會將最後的 .Values
物件與 所有 子圖表 schema 進行查核。這表示母圖表無法規避子圖表的限制。它也可以反過來運作 - 如果子圖表有一個需求,而子圖表的 values.yaml
檔案未達成該需求,母圖表 必須 滿足這些限制才能有效。
參考文獻
在撰寫範本、數值和架構檔案時,有數個標準參考文件可以提供協助。
自訂資源定義 (CRD)
Kubernetes 提供宣告新型 Kubernetes 物件機制。Kubernetes 開發人員可以使用自訂資源定義 (CRD) 宣告自訂資源類型。
在 Helm 3 中,CRD 是視為特殊類型的物件。它們會在圖表的其餘部分安裝之前安裝,並且受到一些限制。
CRD YAML 檔案應放在圖表內部 crds/
目錄中。可以在同一個檔案中放置多個 CRD (以 YAML 開始和結束標記分隔)。Helm 會嘗試將 CRD 目錄中的所有檔案載入 Kubernetes。
CRD 檔案無法編列範本。它們必須是純 YAML 文件。
當 Helm 安裝新的圖表時,它會上傳 CRD,暫停,直到 CRD 由 API 伺服器提供,然後啟動範本引擎,呈現圖表的其餘部分,並將其上傳到 Kubernetes。由於此順序,CRD 資訊在 Helm 範本中的 .Capabilities
物件中可用,而 Helm 範本可能會建立在 CRD 中宣告的新物件執行個體。
例如,如果您的圖表在 crds/
目錄中有一個適用於 CronTab
的 CRD,您可以在 templates/
目錄中建立 CronTab
類型。,.p
crontabs/
Chart.yaml
crds/
crontab.yaml
templates/
mycrontab.yaml
crontab.yaml
檔案必須包含沒有範本指令的 CRD
kind: CustomResourceDefinition
metadata:
name: crontabs.stable.example.com
spec:
group: stable.example.com
versions:
- name: v1
served: true
storage: true
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
然後範本 mycrontab.yaml
可以建立一個新的 CronTab
(使用範本,如同往常一樣)
apiVersion: stable.example.com
kind: CronTab
metadata:
name: {{ .Values.name }}
spec:
# ...
在繼續安裝 templates/
的內容之前,Helm 會確保已安裝 CronTab
類型,且可從 Kubernetes API 伺服器取得。
CRD 限制
與 Kubernetes 中的大多數物件不同,CRD 是全球安裝的。由於此原因,Helm 在管理 CRD 時會採取非常謹慎的作法。CRD 受到以下限制
- CORD 永遠不會重新安裝。如果 Helm 決定
crds/
目錄中的 CRD 已經存在 (無論版本為何),Helm 都不會嘗試安裝或升級。 - CRD 永遠不會在升級或回滾時安裝。Helm 只會在安裝作業中建立 CRD。
- CRD 永遠不會被刪除。刪除 CRD 會自動刪除叢集中所有命名空間中的所有 CRD 內容。因此,Helm 不會刪除 CRD。
建議要升級或刪除 CRD 的操作員手動執行此動作,並非常小心。
使用 Helm 管理圖表
helm
工具有多個指令可用於處理圖表。
它可以為您建立新的圖表
$ helm create mychart
Created mychart/
當您編輯完圖表後,helm
可以為您將圖表打包成圖表封存檔
$ helm package mychart
Archived mychart-0.1.-.tgz
您也可以使用 helm
協助您找出圖表格式或資訊的問題
$ helm lint mychart
No issues found
圖表儲存庫
圖表儲存庫是儲存一個或多個封裝圖表的 HTTP 伺服器。雖然 helm
可用於管理本機圖表目錄,但提到圖表共用時,首選機制是圖表儲存庫。
任何可以提供 YAML 檔案和 tar 檔案且可以回應 GET 要求的 HTTP 伺服器都可以用作儲存庫伺服器。Helm 團隊已測試過部分伺服器,包括啟用網站模式的 Google Cloud Storage 和啟用網站模式的 S3。
儲存庫的主要特徵是提供一個特殊檔案 index.yaml
,它列有儲存庫提供的所有套件,以及允許擷取和驗證這些套件的元資料。
在用戶端,儲存庫使用 helm repo
指令來管理。不過,Helm 不提供可將圖表上傳到遠端儲存庫伺服器的工具。原因是這些工具會為實作伺服器增加大量的需求,因此會提高建立儲存庫的門檻。
圖表啟動器套件
helm create
指令會使用一個選擇性的 --starter
選項,它允許您指定一個「啟動器圖表」。此外,啟動器選項有一個簡短別名 -p
。
使用範例
helm create my-chart --starter starter-name
helm create my-chart -p starter-name
helm create my-chart -p /absolute/path/to/starter-name
啟動器只是常規圖表,但它們位於 $XDG_DATA_HOME/helm/starters
中。身為圖表開發人員,您可能會撰寫特別設計為啟動器使用的圖表。此類圖表應考量以下事項進行設計
Chart.yaml
會由產生器覆寫。- 使用者會預期修改此類圖表的內容,因此文件應說明使用者如何執行此操作。
<CHARTNAME>
的所有出現次數都會使用指定的圖表名稱取代,這樣啟動器圖表才可做為範本使用,但某些變數檔案除外。例如,如果您在vars
目錄或某些README.md
檔案中使用自訂檔案,<CHARTNAME>
將不會在其中覆寫。此外,圖表說明不會繼承。
目前僅有的方法是將圖表新增至 $XDG_DATA_HOME/helm/starters
,就是手動將其複製到那裡。您可能想要在圖表的文件中說明此流程。