開始使用

在本指南的此部分中,我們將建立一個圖表,然後新增第一個範本。我們在此建立的圖表將在本指南的其餘部分中使用。

首先,讓我們簡要了解一下 Helm 圖表。

圖表

圖表指南 中所述,Helm 圖表的結構如下

mychart/
  Chart.yaml
  values.yaml
  charts/
  templates/
  ...

templates/ 目錄用於存放範本檔案。當 Helm 評估圖表時,它會將 templates/ 目錄中的所有檔案傳送通過範本渲染引擎。然後,它會收集這些範本的結果,並將其傳送到 Kubernetes。

values.yaml 檔案對範本也很重要。此檔案包含圖表的 *預設值*。這些值可能會在 helm installhelm upgrade 期間由使用者覆蓋。

Chart.yaml 檔案包含圖表的描述。您可以從範本內部存取它。

charts/ 目錄 *可能* 包含其他圖表(我們稱之為 *子圖表*)。在本指南的後面,我們將看到在範本渲染方面它們是如何工作的。

入門圖表

在本指南中,我們將建立一個名為 mychart 的簡單圖表,然後在圖表內建立一些範本。

$ helm create mychart
Creating mychart

mychart/templates/ 的快速瀏覽

如果您查看 mychart/templates/ 目錄,您會注意到那裡已經有一些檔案。

  • NOTES.txt:圖表的「說明文字」。當您的使用者執行 helm install 時,就會顯示這個說明文字。
  • deployment.yaml:用於建立 Kubernetes 部署 的基本資訊清單
  • service.yaml:用於為您的部署建立 服務端點 的基本資訊清單
  • _helpers.tpl:存放範本輔助程式的地方,您可以在整個圖表中重複使用這些輔助程式

我們要做的是... *將它們全部移除!* 這樣我們就可以從頭開始完成我們的教學。我們實際上會在過程中建立自己的 NOTES.txt_helpers.tpl

$ rm -rf mychart/templates/*

當您編寫生產級圖表時,擁有這些圖表的基本版本會非常有用。因此,在您日常的圖表編寫過程中,您可能不會想要移除它們。

第一個範本

我們要建立的第一個範本將是一個 ConfigMap。在 Kubernetes 中,ConfigMap 只是一個用於儲存組態資料的物件。其他東西,例如 Pod,可以存取 ConfigMap 中的資料。

因為 ConfigMap 是基本資源,所以它們是我們很好的起點。

讓我們從建立一個名為 mychart/templates/configmap.yaml 的檔案開始

apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: "Hello World"

**提示:**範本名稱不需要遵循嚴格的命名模式。但是,我們建議對 YAML 檔案使用副檔名 .yaml,對輔助程式使用 .tpl

上面的 YAML 檔案是一個基本的 ConfigMap,具有最少的必要欄位。由於這個檔案位於 mychart/templates/ 目錄中,因此它會被傳送到範本引擎。

將像這樣的純 YAML 檔案放在 mychart/templates/ 目錄中是可以的。當 Helm 讀取這個範本時,它會原封不動地將其傳送到 Kubernetes。

有了這個簡單的範本,我們現在就有一個可以安裝的圖表。我們可以像這樣安裝它

$ helm install full-coral ./mychart
NAME: full-coral
LAST DEPLOYED: Tue Nov  1 17:36:01 2016
NAMESPACE: default
STATUS: DEPLOYED
REVISION: 1
TEST SUITE: None

使用 Helm,我們可以擷取版本並查看已載入的實際範本。

$ helm get manifest full-coral

---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: "Hello World"

helm get manifest 命令會接收一個版本名稱(full-coral),並印出所有已上傳到伺服器的 Kubernetes 資源。每個檔案都以 --- 開頭,表示 YAML 文件的開始,然後是一個自動產生的註釋行,告訴我們哪個範本檔案產生了這個 YAML 文件。

從那裡開始,我們可以看到 YAML 資料正是我們放在 configmap.yaml 檔案中的內容。

現在我們可以解除安裝我們的版本:helm uninstall full-coral

新增一個簡單的範本呼叫

name: 硬編碼到資源中通常被認為是不好的做法。名稱應該對每個版本都是唯一的。因此,我們可能希望透過插入版本名稱來產生名稱欄位。

**提示:**由於 DNS 系統的限制,name: 欄位最多只能有 63 個字元。因此,版本名稱最多只能有 53 個字元。Kubernetes 1.3 及更早版本最多只能有 24 個字元(因此名稱只有 14 個字元)。

讓我們相應地修改 configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"

最大的變化是 name: 欄位的值,現在是 {{ .Release.Name }}-configmap

範本指令包含在 {{}} 區塊中。

範本指令 {{ .Release.Name }} 會將版本名稱插入範本中。傳遞到範本中的值可以被視為 *命名空間物件*,其中點(.)分隔每個命名空間元素。

Release 前面的點表示我們從這個範圍的頂層命名空間開始(我們稍後會討論範圍)。因此,我們可以將 .Release.Name 理解為「從頂層命名空間開始,找到 Release 物件,然後在其中尋找一個名為 Name 的物件」。

Release 物件是 Helm 的內建物件之一,我們稍後會更詳細地介紹它。但就目前而言,只需知道這將顯示函式庫分配給我們版本的版本名稱即可。

現在,當我們安裝我們的資源時,我們會立即看到使用這個範本指令的結果

$ helm install clunky-serval ./mychart
NAME: clunky-serval
LAST DEPLOYED: Tue Nov  1 17:45:37 2016
NAMESPACE: default
STATUS: DEPLOYED
REVISION: 1
TEST SUITE: None

您可以執行 helm get manifest clunky-serval 來查看生成的完整 YAML。

請注意,Kubernetes 名稱中的 ConfigMap 是 clunky-serval-configmap,而不是之前的 mychart-configmap

至此,我們已經看到了最基本的範本:YAML 檔案,其中嵌入了 {{}} 中的範本指令。在下一部分中,我們將更深入地了解範本。但在繼續之前,有一個小技巧可以讓建置範本更快:當您想要測試範本渲染,但不想實際安裝任何東西時,您可以使用 helm install --debug --dry-run goodly-guppy ./mychart。這將渲染範本。但它不會安裝圖表,而是會將渲染的範本返回給您,以便您可以看到輸出

$ helm install --debug --dry-run goodly-guppy ./mychart
install.go:149: [debug] Original chart version: ""
install.go:166: [debug] CHART PATH: /Users/ninja/mychart

NAME: goodly-guppy
LAST DEPLOYED: Thu Dec 26 17:24:13 2019
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}

COMPUTED VALUES:
affinity: {}
fullnameOverride: ""
image:
  pullPolicy: IfNotPresent
  repository: nginx
imagePullSecrets: []
ingress:
  annotations: {}
  enabled: false
  hosts:
  - host: chart-example.local
    paths: []
  tls: []
nameOverride: ""
nodeSelector: {}
podSecurityContext: {}
replicaCount: 1
resources: {}
securityContext: {}
service:
  port: 80
  type: ClusterIP
serviceAccount:
  create: true
  name: null
tolerations: []

HOOKS:
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: goodly-guppy-configmap
data:
  myvalue: "Hello World"

使用 --dry-run 可以更容易地測試您的程式碼,但它不能確保 Kubernetes 本身會接受您生成的範本。最好不要假設您的圖表會安裝,僅僅因為 --dry-run 可以正常工作。

圖表範本指南 中,我們將使用我們在此定義的基本圖表,並詳細探討 Helm 範本語言。我們將從內建物件開始。