進階 Helm 技巧

本節說明使用 Helm 的各種進階功能和技巧。本節中的資訊適用於想要對其圖表和版本進行進階自訂和操作的 Helm「進階使用者」。這些進階功能中的每一項都有其自身的取捨和注意事項,因此必須在深入了解 Helm 的情況下謹慎使用每一項。換句話說,請記住能力越大,責任越大的道理。

後置渲染

後置渲染使圖表安裝程式能夠在 Helm 安裝渲染後的資訊清單之前手動操作、配置和/或驗證它們。這允許具有進階配置需求的使用者能夠使用像kustomize這樣的工具來應用配置變更,而無需分叉公共圖表或要求圖表維護者為某個軟體指定每個配置選項。在企業環境中或部署前分析資訊清單時,也有使用案例可以注入常用工具和邊車。

先決條件

  • Helm 3.1+

用法

後置渲染器可以是任何可執行檔,它接受 STDIN 上的渲染後 Kubernetes 資訊清單,並在 STDOUT 上返回有效的 Kubernetes 資訊清單。如果發生錯誤,它應該返回一個非 0 的退出代碼。這是兩個元件之間唯一的「API」。它允許您在後置渲染過程中做很多事情。

後置渲染器可以用於installupgradetemplate。要使用後置渲染器,請將--post-renderer標誌與您要使用的渲染器可執行檔的路徑一起使用。

$ helm install mychart stable/wordpress --post-renderer ./path/to/executable

如果路徑不包含任何分隔符號,它將在 $PATH 中搜尋,否則它將解析任何相對路徑到完全限定路徑。

如果您想使用多個後置渲染器,請在腳本中或在您構建的任何二進制工具中一起調用它們。在 bash 中,這就像renderer1 | renderer2 | renderer3一樣簡單。

您可以在此處看到使用kustomize作為後置渲染器的範例。

注意事項

使用後置渲染器時,有幾件重要的事情要牢記。其中最重要的是,當使用後置渲染器時,所有修改該版本的人必須使用相同的渲染器才能進行可重複的構建。此功能的設計目的是允許任何使用者切換他們正在使用的渲染器或停止使用渲染器,但这應該是有意完成的,以避免意外修改或資料丟失。

另一個需要注意的重要事項是安全性。如果您正在使用後置渲染器,您應該確保它來自可靠的來源(與任何其他任意可執行檔的情況一樣)。不建議使用不受信任或未經驗證的渲染器,因為它們可以完全訪問渲染後的範本,而範本通常包含秘密資料。

自訂後置渲染器

在 Go SDK 中使用時,後置渲染步驟提供了更大的靈活性。任何後置渲染器只需要實現以下 Go 接口。

type PostRenderer interface {
    // Run expects a single buffer filled with Helm rendered manifests. It
    // expects the modified results to be returned on a separate buffer or an
    // error if there was an issue or failure while running the post render step
    Run(renderedManifests *bytes.Buffer) (modifiedManifests *bytes.Buffer, err error)
}

有關使用 Go SDK 的更多資訊,請參閱Go SDK 部分

Go SDK

Helm 3 推出了一種完全重構的 Go SDK,以便在構建利用 Helm 的軟體和工具時獲得更好的體驗。完整的文件可以在https://pkg.go.dev/helm.sh/helm/v3找到,但下面簡要概述了一些最常用的套件和一個簡單的範例。

套件概述

這是一個最常用套件的清單,並對每個套件進行了簡單的說明。

  • pkg/action:包含用於執行 Helm 操作的主要「客戶端」。這是 CLI 在幕後使用的相同套件。如果您只需要從另一個 Go 程式執行基本的 Helm 命令,則可以使用此套件。
  • pkg/{chart,chartutil}:用於加載和操作圖表的方法和輔助函式。
  • pkg/cli 及其子套件:包含標準 Helm 環境變數的所有處理常式,其子套件包含輸出和值檔案處理。
  • pkg/release:定義Release物件和狀態。

顯然,除了這些之外還有很多套件,所以請查看文件以獲取更多資訊!

簡單範例

這是一個使用 Go SDK 執行helm list的簡單範例。

package main

import (
    "log"
    "os"

    "helm.sh/helm/v3/pkg/action"
    "helm.sh/helm/v3/pkg/cli"
)

func main() {
    settings := cli.New()

    actionConfig := new(action.Configuration)
    // You can pass an empty string instead of settings.Namespace() to list
    // all namespaces
    if err := actionConfig.Init(settings.RESTClientGetter(), settings.Namespace(), os.Getenv("HELM_DRIVER"), log.Printf); err != nil {
        log.Printf("%+v", err)
        os.Exit(1)
    }

    client := action.NewList(actionConfig)
    // Only list deployed
    client.Deployed = true
    results, err := client.Run()
    if err != nil {
        log.Printf("%+v", err)
        os.Exit(1)
    }

    for _, rel := range results {
        log.Printf("%+v", rel)
    }
}

儲存後端

Helm 3 將預設版本資訊儲存更改為版本命名空間中的 Secrets。Helm 2 預設將版本資訊作為 ConfigMap 儲存在 Tiller 實例的命名空間中。以下小節說明如何配置不同的後端。此配置基於HELM_DRIVER環境變數。它可以設置為以下值之一:[configmap, secret, sql]

ConfigMap 儲存後端

要啟用 ConfigMap 後端,您需要將環境變數HELM_DRIVER設置為configmap

您可以在 shell 中設置它,如下所示。

export HELM_DRIVER=configmap

如果要從預設後端切換到 ConfigMap 後端,則必須自行完成遷移。您可以使用以下命令檢索版本資訊。

kubectl get secret --all-namespaces -l "owner=helm"

**生產注意事項**:版本資訊包括圖表和值檔案的內容,因此可能包含需要防止未經授權訪問的敏感資料(例如密碼、私鑰和其他憑證)。在管理 Kubernetes 授權時,例如使用RBAC,可以授予對 ConfigMap 資源的更廣泛訪問權限,同時限制對 Secret 資源的訪問權限。例如,預設的面向使用者的角色「view」授予對大多數資源的訪問權限,但不能訪問 Secrets。此外,可以為加密儲存配置秘密資料。如果您決定切換到 ConfigMap 後端,請記住這一點,因為它可能會洩露應用程式的敏感資料。

SQL 儲存後端

有一個*測試版* SQL 儲存後端,它將版本資訊儲存在 SQL 資料庫中。

如果您的版本資訊大小超過 1MB(在這種情況下,由於 Kubernetes 底層 etcd 鍵值儲存的內部限制,它無法儲存在 ConfigMap/Secrets 中),則使用這樣的儲存後端特別有用。

要啟用 SQL 後端,您需要部署一個 SQL 資料庫並將環境變數HELM_DRIVER設置為sql。資料庫詳細資訊使用環境變數HELM_DRIVER_SQL_CONNECTION_STRING設置。

您可以在 shell 中設置它,如下所示。

export HELM_DRIVER=sql
export HELM_DRIVER_SQL_CONNECTION_STRING=postgresql://helm-postgres:5432/helm?user=helm&password=changeme

注意:目前僅支援 PostgreSQL。

**生產注意事項**:建議

  • 使您的資料庫做好生產準備。有關 PostgreSQL 的資訊,請參閱伺服器管理文件以獲取更多詳細資訊。
  • 啟用權限管理以鏡像 Kubernetes RBAC 以獲取版本資訊。

如果要從預設後端切換到 SQL 後端,則必須自行完成遷移。您可以使用以下命令檢索版本資訊。

kubectl get secret --all-namespaces -l "owner=helm"