Helm 使用一種稱為圖表的打包格式。圖表是描述一組相關 Kubernetes 資源的文件的集合。單個圖表可用于部署簡單的東西,例如 memcached pod,或復雜的東西,例如帶有 HTTP 服務器、數據庫、緩存等的完整 Web 應用程序堆棧。
圖表被創建為放置在特定目錄樹中的文件。它們可以打包到版本化檔案中進行部署。
如果您想下載并查看已發布圖表的文件,而不安裝它,您可以使用`helm pull chartrepo/chartname.`
## 1. charts 文件結構
描述 WordPress 的圖表將存儲在`wordpress/`目錄中。
```bash
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
```
## 2. Chart.yaml 文件
```bash
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](https://github.com/helm/helm/releases/tag/v3.3.2) 開始,不允許使用其他字段。推薦的方法是在`annotations`.
## 3. Charts and Versioning
每個圖表都必須有一個版本號。版本必須遵循[SemVer 2](https://semver.org/spec/v2.0.0.html)標準。與 Helm Classic 不同,`Helm v2` 及更高版本使用版本號作為發布標記。存儲庫中的包由名稱加版本標識。
例如,nginx版本字段設置為的圖表`version: 1.2.3`將被命名為:
```bash
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 進行版本控制。
許多 Helm 工具(包括 CLI)使用內部的`version`字段。`Chart.yaml`生成包時,該`helm package`命令將使用它在 中找到的版本`Chart.yaml`作為包名稱中的標記。系統假定圖表包名稱中的版本號與`Chart.yaml`. 不滿足此假設將導致錯誤。
### 3.1 apiVersion領域_
該`apiVersion`字段應該v2用于至少需要 `Helm 3` 的 `Helm` 圖表。支持先前 Helm 版本的圖表有一個`apiVersion`設置,v1并且仍然可以由 Helm 3 安裝。
從更改`v1`為`v2`:
定義圖表依賴項的`dependencies`字段,位于圖表的單獨`requirements.yaml`文件中v1(請參閱[圖表依賴](https://www.bookstack.cn/read/helm-3.8.0-en/89342c804d7c3b76.md#chart-dependencies)項)。
字段,type區分應用程序和庫圖表(請參閱圖表類型)。
### 3.2 appVersion領域_
請注意,該`appVersion`字段與該字段無關version。這是一種指定應用程序版本的方法。例如,`drupal`圖表可能有一個`appVersion: "8.2.1"`,表示圖表中包含的 Drupal 版本(默認)是8.2.1。此字段是信息性的,對圖表版本計算沒有影響。強烈建議將版本用引號括起來。**它強制 YAML 解析器將版本號視為字符串。在某些情況下,不加引號可能會導致解析問題**。例如,YAML 解釋1.0為浮點值,而 git commit SHA則解釋1234e10為科學記數法。
從 `Helm v3.5.0` 開始,`helm create`將默認`appVersion`字段包含在引號中。
### 3.3 kubeVersion領域_
可選kubeVersion字段可以定義支持的 Kubernetes 版本的 semver 約束。Helm 將在安裝圖表時驗證版本約束,如果集群運行不受支持的 Kubernetes 版本,則會失敗。
版本約束可能包括空格分隔的 AND 比較,例如
```bash
>= 1.13.0 < 1.15.0
```
它們本身可以與 OR||運算符組合,如下例所示
```bash
>= 1.13.0 < 1.14.0 || >= 1.14.1 < 1.15.0
```
在此示例中,版本`1.14.0`被排除在外,如果已知某些版本中的錯誤會阻止圖表正常運行,這可能是有意義的。
除了使用運算符`=` `!=` `>` `<` `>=` `<=`的版本約束之外,還支持以下速記符號
- 閉合區間的連字符范圍,其中`1.1 - 2.3.4`等價于`>= 1.1 <= 2.3.4`.
- 通配符`x`, `X`and `*`, where`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](https://github.com/Masterminds/semver)。
### 3.4 Deprecating Charts
在圖表存儲庫中管理圖表時,有時需要棄用圖表。中的可選`deprecated`字段`Chart.yaml`可用于將圖表標記為已棄用。如果存儲庫中圖表的最新版本被標記為已棄用,則整個圖表被視為已棄用。稍后可以通過發布未標記為已棄用的較新版本來重用圖表名稱。棄用圖表的工作流程是:
- 更新圖表Chart.yaml以將圖表標記為已棄用,更新版本
- 在 Chart Repository 中發布新的圖表版本
- 從源存儲庫中刪除圖表(例如 git)
## 4. Chart Types
該type字段定義圖表的類型。有兩種類型:`application`和`library`。應用程序是默認類型,它是可以完全操作的標準圖表。庫圖表為圖表構建器提供實用程序或功能。庫圖表與應用程序[圖表](https://www.bookstack.cn/read/helm-3.8.0-en/5b6ede30be15ad22.md)不同,因為它不可安裝并且通常不包含任何資源對象。
> 注意:應用程序圖表可以用作庫圖表。這可以通過將類型設置為來啟用library。然后該圖表將呈現為可以利用所有實用程序和功能的庫圖表。圖表的所有資源對象都不會被渲染。
## 5. Chart LICENSE, README and NOTES
圖表還可以包含描述圖表的安裝、配置、使用和許可證的文件。
許可證是包含圖表[許可證的純文本文件](https://en.wikipedia.org/wiki/Software_license)。該圖表可以包含許可證,因為它可能在模板中具有編程邏輯,因此不僅僅是配置。如果需要,圖表安裝的應用程序也可以有單獨的許可證。
圖表的 `README` 應采用 `Markdown (README.md)` 格式,通常應包含:
- 圖表提供的應用程序或服務的描述
- 運行圖表的任何先決條件或要求
- 選項中的描述`values.yaml`和默認值
- 可能與圖表的安裝或配置相關的任何其他信息
當集線器和其他用戶界面顯示有關圖表的詳細信息時,該詳細信息是從`README.md`文件中的內容中提取的。
該圖表還可以包含一個簡短的純文本`templates/NOTES.txt`文件,該文件將在安裝后以及查看版本狀態時打印出來。此文件作為模板進行評估,可用于顯示使用說明、后續步驟或與圖表發布相關的任何其他信息。例如,可以提供連接到數據庫或訪問 Web UI 的說明。由于此文件在運行時會打印到 `STDOUThelm install`或`helm status`,因此建議保持內容簡短并指向 README 以獲得更多詳細信息。
## 6. Chart Dependencies
在 Helm 中,一個圖表可能依賴于任意數量的其他圖表。這些依賴關系可以使用`dependencies`字段動態鏈接`Chart.yaml`或引入`charts/`目錄并手動管理。
dependencies使用字段管理依賴項
當前圖表所需的圖表在dependencies字段中定義為列表。
```bash
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`在本地添加該存儲庫。
- 您可以使用 `repo` 的名稱而不是 URL
```bash
$ helm repo add fantastic-charts https://fantastic-charts.storage.googleapis.com
```
```bash
dependencies:
- name: awesomeness
version: 1.0.0
repository: "@fantastic-charts"
```
一旦你定義了依賴,你可以運行`helm dependency update`它,它會使用你的依賴文件為你下載所有指定的圖表到你的`charts/`目錄中。
```bash
$ 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/`目錄中。因此,對于上面的示例,人們希望在圖表目錄中看到以下文件:
```bash
charts/
apache-1.2.3.tgz
mysql-3.2.1.tgz
```
## 7. Alias field in dependencies
除了上面的其他字段之外,每個需求條目都可能包含可選字段`alias`。
為依賴關系圖表添加別名會將圖表放入依賴關系中,使用別名作為新依賴關系的名稱。
可以`alias`在他們需要訪問具有其他名稱的圖表的情況下使用。
```bash
# parentchart/Chart.yaml
dependencies:
- name: subchart
repository: http://localhost:10191
version: 0.1.0
alias: new-subchart-1
- name: subchart
repository: http://localhost:10191
version: 0.1.0
alias: new-subchart-2
- name: subchart
repository: http://localhost:10191
version: 0.1.0
```
在上面的示例中,我們將獲得 3 個依賴項`parentchart`:
```bash
subchart
new-subchart-1
new-subchart-2
```
實現此目的的手動方法是在`charts/`目錄中多次復制/粘貼相同的圖表,但名稱不同。
## 8. 依賴項中的標簽和條件字段
除了上述其他字段外,每個需求條目都可能包含可選字段`tags`和`condition`.
默認加載所有圖表。如果`tags`或`condition`字段存在,它們將被評估并用于控制它們應用到的圖表的加載。
**條件 - 條件字段包含一個或多個 YAML 路徑(以逗號分隔)。如果此路徑存在于頂級父級的值中并解析為布爾值,則將根據該布爾值啟用或禁用圖表**。僅評估列表中找到的第一個有效路徑,如果不存在路徑,則條件無效。
**標簽 - 標簽字段是與此圖表關聯的標簽的 YAML 列表。在頂部父級的值中,所有帶有標簽的圖表都可以通過指定標簽和布爾值來啟用或禁用**。
```bash
# parentchart/Chart.yaml
dependencies:
- name: subchart1
repository: http://localhost:10191
version: 0.1.0
condition: subchart1.enabled, global.subchart1.enabled
tags:
- front-end
- subchart1
- name: subchart2
repository: http://localhost:10191
version: 0.1.0
condition: subchart2.enabled,global.subchart2.enabled
tags:
- back-end
- subchart2
```
```bash
# parentchart/values.yaml
subchart1:
enabled: true
tags:
front-end: false
back-end: true
```
在上面的示例中,所有帶有標簽的圖表`front-end`都將被禁用,但由于`subchart1.enabled`路徑在父值中的計算結果為“真”,因此條件將覆蓋`front-end`標簽并`subchart1`啟用。
由于`subchart2`被標記`back-end`并且該標記評估為`true`,`subchart2`將被啟用。另請注意,雖然`subchart2`指定了條件,但父值中沒有對應的路徑和值,因此條件無效。
使用帶有標簽和條件的 CLI
- `--set`可以像往常一樣使用該參數來更改標簽和條件值。
```bash
helm install --set tags.front-end=true --set subchart2.enabled=false
```
標簽和條件解析
- 條件(當在值中設置時)總是覆蓋標簽。存在的第一個條件路徑獲勝,該圖表的后續條件路徑將被忽略。
- 標簽被評估為“如果圖表的任何標簽為真,則啟用圖表”。
- 標簽和條件值必須設置在最高父級的值中。
- `values` 中的`tags:`鍵必須是頂級鍵。tags:當前不支持全局和嵌套表。
## 9. 通過依賴項導入子值
在某些情況下,希望允許子圖表的值傳播到父圖表并作為通用默認值共享。使用該`exports`格式的另一個好處是,它將使未來的工具能夠內省用戶可設置的值。
可以使用 YAML 列表`dependencies`在字段中的父圖表中指定包含要導入的值的鍵。`import-values`列表中的每個項目都是從子圖表`exports`字段導入的鍵。
要導入`exports`鍵中未包含的值,請使用子父格式。兩種格式的示例如下所述。
### 9.1 exports 格式
如果子圖表的`values.yaml`文件在根目錄包含一個`exports`字段,則可以通過指定要導入的鍵將其內容直接導入父值,如下例所示:
```bash
# parent's Chart.yaml file
dependencies:
- name: subchart
repository: http://localhost:10191
version: 0.1.0
import-values:
- data
```
```bash
# child's values.yaml file
exports:
data:
myint: 99
```
由于我們`data`在導入列表中指定鍵,Helm 在`exports`子圖表的字段中查找`data`鍵并導入其內容。
最終的父值將包含我們導出的字段:
```bash
# parent's values
myint: 99
```
> 請注意,父鍵`data`不包含在父級的最終值中。如果需要指定父鍵,請使用 'child-parent' 格式。
### 9.2 使用子父格式
要訪問未包含在`exports`子圖表值的鍵中的值,您需要指定要導入的值的源鍵 ( child) 和父圖表值中的目標路徑 ( parent)。
下面`import-values`的示例中的 指示 Helm 獲取在`child:`路徑中找到的任何值并將它們復制到指定路徑中的父值`parent`:
```bash
# parent's Chart.yaml file
dependencies:
- name: subchart1
repository: http://localhost:10191
version: 0.1.0
...
import-values:
- child: default.data
parent: myimports
```
在上面的示例中,在子圖表 1 `default.data`的值中找到的值將被導入到`myimports`父圖表值中的鍵,詳細信息如下:
```bash
# parent's values.yaml file
myimports:
myint: 0
mybool: false
mystring: "helm rocks!"
```
```bash
# subchart1's values.yaml file
default:
data:
myint: 999
mybool: true
```
父圖表的結果值為:
```bash
# parent's final values
myimports:
myint: 999
mybool: true
mystring: "helm rocks!"
```
父級的最終值現在包含從 `subchart1` 導入的`myint`和字段。`mybool`
## 10. charts/通過目錄手動管理依賴項
`charts/`如果需要對依賴項進行更多控制,可以通過將依賴關系圖復制到目錄中來明確表達這些依賴關系。
依賴項應該是一個解壓縮的圖表目錄,但它的名稱不能以`_or`開頭.。圖表加載器會忽略此類文件。
例如,如果 `WordPress` 圖表依賴于 `Apache` 圖表,則 Apache 圖表(正確版本)將在 WordPress 圖表的`charts/`目錄中提供:
```bash
wordpress:
Chart.yaml
# ...
charts/
apache/
Chart.yaml
# ...
mysql/
Chart.yaml
# ...
```
`charts/`上面的示例顯示了 `WordPress` 圖表如何通過將這些圖表包含在其目錄中來表達其對 Apache 和 `MySQL` 的依賴。
> 提示: 要將依賴項放入您的`charts/`目錄,請使用`helm pull`命令
## 11. 使用依賴項的操作方面
面的部分解釋了如何指定圖表依賴關系,但是這對使用`helm installand` 的圖表安裝有何影響helm upgrade?
假設名為“A”的圖表創建了以下 Kubernetes 對象
- 命名空間“A-命名空間”
- 有狀態集“A-StatefulSet”
- 服務“A-服務”
此外,A 依賴于創建對象的圖表 B
- 命名空間“B-命名空間”
- 副本集“B-副本集”
- 服務“B-服務”
安裝/升級圖表 A 后,將創建/修改一個 `Helm` 版本。該版本將按以下順序創建/更新所有上述 Kubernetes 對象:
- A-命名空間
- B-命名空間
- A-服務
- B-服務
- B-副本集
- A-StatefulSet
這是因為當 Helm 安裝/升級圖表時,圖表中的 Kubernetes 對象及其所有依賴項都是
- 聚合成一個集合;然后
- 按類型后跟名稱排序;然后
- 按該順序創建/更新。
因此,使用圖表及其依賴項的所有對象創建了一個版本。
`Kubernetes` 類型的安裝順序由 `kind_sorter.go` 中的枚舉 `InstallOrder` 給出(參見[Helm 源文件](https://github.com/helm/helm/blob/484d43913f97292648c867b56768775a55e4bba6/pkg/releaseutil/kind_sorter.go))。
## 12. 模板和值
Helm Chart 模板是用[Go 模板語言編寫的](https://golang.org/pkg/text/template/),添加了來自 [Sprig](https://github.com/Masterminds/sprig) 庫的 50 個左右的附加模板函數和一些其他專用函數。
所有模板文件都存儲在圖表的`templates/`文件夾中。當 `Helm` 渲染圖表時,它將通過模板引擎傳遞該目錄中的每個文件。
模板的值以兩種方式提供:
- 圖表開發人員可以提供一個`values.yaml`在圖表內部調用的文件。該文件可以包含默認值。
- 圖表用戶可以提供包含值的 YAML 文件。這可以在命令行中使用`helm install`.
當用戶提供自定義值時,這些值將覆蓋圖表`values.yaml`文件中的值。
### 12.1 模板文件
模板文件遵循編寫 Go 模板的標準約定(有關詳細信息,請參閱`text/template Go` 包文檔)。示例模板文件可能如下所示:
```bash
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](https://github.com/deis/charts),是 Kubernetes 復制控制器的模板。它可以使用以下四個模板值(通常在values.yaml文件中定義):
- `imageRegistry`:Docker 映像的源注冊表。
- `dockerTag`:泊塢窗圖像的標簽。
- `pullPolicy`:Kubernetes 拉取策略。
- `storage`:存儲后端,默認設置為"`minio`"
所有這些值都由模板作者定義。Helm 不需要或指定參數。
要查看許多工作圖表,請查看 CNCF [Artifact Hub](https://artifacthub.io/packages/search?kind=0)。
### 12.2 預定義值
通過`values.yaml`文件(或通過`--set`標志)提供的值可以從`.Values`模板中的對象訪問。但是您可以在模板中訪問其他預定義的數據。
以下值是預定義的,可用于每個模板,并且不能被覆蓋。與所有值一樣,名稱區分大小寫。
- `Release.Name`:版本名稱(不是圖表)
- `Release.Namespace`: 圖表發布到的命名空間。
- `Release.Service`:進行發布的服務。
- `Release.IsUpgrade`:如果當前操作是升級或回滾,則設置為 `true`。
- `Release.IsInstall`:如果當前操作是安裝,則設置為 `true`。
- `Chart`:的內容`Chart.yaml`。因此,圖表版本是可獲得的,`Chart.Version`并且維護者在`Chart.Maintainers`.
- `Files`:一個類似地圖的對象,包含圖表中的所有非特殊文件。這不會讓您訪問模板,但會讓您訪問存在的其他文件(除非使用排除它們`.helmignore`)。可以使用`{{ index .Files "file.name" }}`或使用該`{{.Files.Get name }}`功能訪問文件。您還可以使用以下方式訪問文件的[]byte內容`{{ .Files.GetBytes }}`
- `Capabilities`:一個類似地圖的對象,包含有關 Kubernetes 版本 ( `{{ .Capabilities.KubeVersion }}`) 和支持的 Kubernetes API 版本 ( `{{ .Capabilities.APIVersions.Has "batch/v1" }}`)的信息
> 注意:任何未知`Chart.yaml`字段都將被刪除。它們將無法在Chart對象內部訪問。因此,`Chart.yaml`不能用于將任意結構化的數據傳遞到模板中。不過,值文件可用于此目的。
### 12.3 Values files
考慮上一節中的模板`values.yaml`,提供必要值的文件如下所示:
```bash
imageRegistry: "quay.io/deis"
dockerTag: "latest"
pullPolicy: "Always"
storage: "s3"
```
值文件采用 `YAML` 格式。圖表可能包含默認`values.yaml`文件。`Helm install` 命令允許用戶通過提供額外的 YAML 值來覆蓋值:
```bash
$ helm install --generate-name --values=myvals.yaml wordpress
```
當以這種方式傳遞值時,它們將被合并到默認值文件中。例如,考慮一個`myvals.yaml`如下所示的文件:
```bash
storage: "gcs"
```
當它與values.yaml圖表中的 合并時,生成的內容將是:
```bash
imageRegistry: "quay.io/deis"
dockerTag: "latest"
pullPolicy: "Always"
storage: "gcs"
```
> - 請注意,只有最后一個字段被覆蓋。
注意:圖表中包含的默認值文件必須命名為`values.yaml`. 但是在命令行上指定的文件可以命名為任何名稱。
注意:如果在or`--set`上使用該標志,則這些值會在客戶端簡單地轉換為 `YAML`。`helm install` `helm upgrade`
注意:如果值文件中存在任何必需的條目,則可以使用“必需”函數在圖表模板中將它們聲明為必需的
然后可以使用該`.Values`對象在模板內部訪問這些值中的任何一個:
```bash
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 }}
```
## 12.4 Scope, Dependencies, and Values
`Values files`可以聲明頂級圖表以及該圖表`charts/`目錄中包含的任何圖表的值。或者,換一種說法,值文件可以為圖表及其任何依賴項提供值。例如,上面的演示 WordPress 圖表同時具有mysql和apache作為依賴項。值文件可以為所有這些組件提供值:
```bash
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` 圖表,它可以訪問 MySQL 密碼字段為`.Values.mysql.password`. 但是對于 MySQL 圖表,值的范圍已經縮小,命名空間前綴被刪除,所以它會簡單地看到密碼字段為`.Values.password`.
## 12.5 Global Values
從 `2.0.0-Alpha.2` 開始,Helm 支持特殊的“`global`”值。考慮上一個示例的修改版本:
```bash
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`帶有 `value` 的部分`app: MyWordPress`。該值可用于所有圖表,如.Values.global.app。
例如,mysql模板可以訪問app為`{{ .Values.global.app}}`,apache圖表也可以訪問。實際上,上面的值文件是這樣重新生成的:
```bash
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`標簽等屬性很有用。
如果子圖表聲明了一個全局變量,則該全局變量將向下傳遞(到子圖表的子圖表),但不會向上傳遞到父圖表。子圖表無法影響父圖表的值。
### 12.6 架構 Files
有時,圖表維護者可能想要定義其值的結構。這可以通過在`values.schema.json`文件中定義模式來完成。模式表示為JSON 模式。它可能看起來像這樣:
- helm install
- helm upgrade
- helm lint
- helm template
滿足此架構要求的文件示例`values.yaml`可能如下所示:
```bash
name: frontend
protocol: https
port: 443
```
> 請注意,模式應用于最終`.Values`對象,而不僅僅是`values.yaml`文件。這意味著以下yaml文件有效,鑒于圖表安裝了相應的`--set`選項,如下所示。
```bash
name: frontend
protocol: https
```
```c
helm install --set port=443
```
此外,根據所有子圖模式檢查最終`.Values`對象。這意味著父圖表無法規避子圖表的限制。這也適用于反向 - 如果子圖的文件中未滿足子圖的要求,則父圖必須滿足這些限制才能有效。`values.yaml`
## 13. 自定義資源定義 (CRD)
Kubernetes 提供了一種機制來聲明新類型的 `Kubernetes` 對象。使用 `CustomResourceDefinitions (CRD)`,Kubernetes 開發人員可以聲明自定義資源類型。
在 `Helm 3` 中,`CRD` 被視為一種特殊的對象。它們在圖表的其余部分之前安裝,并??且受到一些限制。
`CRD YAML` 文件應放在crds/圖表內的目錄中。多個 CRD(由 YAML 開始和結束標記分隔)可以放在同一個文件中。Helm 將嘗試將CRD 目錄中的所有文件加載到 Kubernetes 中。
`CRD` 文件不能被模板化。它們必須是純 `YAML` 文檔。
當 Helm 安裝一個新圖表時,它會上傳 CRD,暫停直到 API 服務器使 CRD 可用,然后啟動模板引擎,渲染圖表的其余部分,并將其上傳到 Kubernetes。由于這種排序,CRD 信息`.Capabilities`在 Helm 模板中的對象中可用,并且 Helm 模板可以創建在 CRD 中聲明的對象的新實例。
例如,如果您的圖表在目錄中有一個 CRD ,您可以`CronTab`在目錄中創建該類型的crds/實例:`CronTabtemplates/`
```bash
crontabs/
Chart.yaml
crds/
crontab.yaml
templates/
mycrontab.yaml
```
該`crontab.yaml`文件必須包含沒有模板指令的 `CRD`:
```bash
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(像往常一樣使用模板):
```bash
apiVersion: stable.example.com
kind: CronTab
metadata:
name: {{ .Values.name }}
spec:
# ...
```
`Helm` 將確保該`CronTab`類型已安裝并且在 `Kubernetes API` 服務器中可用,然后再繼續在`templates/.`
### 13.1 CRD 的限制
**與 Kubernetes 中的大多數對象不同,CRD 是全局安裝的**。出于這個原因,Helm 在管理 CRD 時采取了非常謹慎的方法。CRD 受到以下限制:
- 永遠不會重新安裝 CRD。如果 Helm 確定`crds/`目錄中的 CRD 已經存在(無論版本如何),Helm 將不會嘗試安裝或升級。
- CRD 永遠不會在升級或回滾時安裝。Helm 只會在安裝操作時創建 CRD。
- CRD 永遠不會被刪除。刪除 CRD 會自動刪除集群中所有命名空間中的所有 CRD 內容。因此,Helm 不會刪除 CRD。
鼓勵想要升級或刪除 CRD 的操作員手動執行此操作并非常小心。
---
?<font color= #FF4500 size=4 style="font-family:Courier New">推薦閱讀:</font>
- [https://www.bookstack.cn/read/helm-3.8.0-en/b5fa667da3c6d162.md](https://www.bookstack.cn/read/helm-3.8.0-en/b5fa667da3c6d162.md)
- [helm v3.8.0 命令入門指南](https://ghostwritten.blog.csdn.net/article/details/122866004)
- [helm 快速學習手冊](https://ghostwritten.blog.csdn.net/article/details/122882625)