Helm
Helm[1] 旨在简化 Kubernetes 中复杂应用工作负载的部署和管理。它的功能类似于 Kubernetes 的软件包管理器,其中的软件包被称为 Helm Charts。Helm Chart 结合了一个模板文件和一个值文件,前者概述了要部署的 Kubernetes 资源,后者则为模板提供必要的配置。Helm Charts 中的模板系统可实现软件包的可重用性。
Helm Go SDK
Helm 包含一个方便的 CLI,这是一个强大的命令行工具,可帮助最终用户管理图表生命周期的各个阶段。不过,使用 CLI 在 Kubernetes 集群上以编程方式安装 Helm 图表,对于构建可靠、可预测的应用程序来说并不理想。幸运的是,Helm 开发人员将 CLI 设计为 Go SDK 的接口,我们可以在应用中方便对接。
安装使用 Helm Client
首先,我们需要安装 go-helm-client,可以使用下面的命令将该模块添加到 go.mod 文件中。
$ go get github.com/mittwald/go-helm-client
现在,我们可以像导入 helmcilent github.com/mmittwald/go-helm-client
那样导入它,并在应用程序中使用它。
package main
import (
"fmt"
"os"
helmclient "github.com/mittwald/go-helm-client"
)
func GetHelmClient(kubeConfig string, namespace string) (helmclient.Client) {
opt := &helmclient.KubeConfClientOptions{
Options: &helmclient.Options{
Namespace: namespace, // Change this to the namespace you wish to install the chart in.
RepositoryCache: "/tmp/.helmcache",
RepositoryConfig: "/tmp/.helmrepo",
Debug: true,
},
KubeContext: "",
KubeConfig: []byte(kubeConfig),
}
helmClient, err := helmclient.NewClientFromKubeConf(opt)
if err != nil {
fmt.Printf("Failed to initialize Helm Client: %v", err)
return nil
}
return helmClient
}
func main() {
dirname, err := os.UserHomeDir()
kubeConfig, err := os.ReadFile(fmt.Sprintf("%s/.kube/config", dirname))
if err != nil {
t.Fatalf("Not able to read File: %v", err)
}
helmClient := helmc.GetHelmClient(string(kubeConfig), "default")
}
如果启用了 docker-kubernetes,就可以在本地 Kubernetes 上运行和测试。提供 kubeConfig 和命名空间后,就可以创建 helmClient 对象,并使用该对象执行 helm 操作。
下面是提供的方法接口:
type Client interface {
AddOrUpdateChartRepo(entry repo.Entry) error
UpdateChartRepos() error
InstallOrUpgradeChart(ctx context.Context, spec *ChartSpec, opts *GenericHelmOptions) (*release.Release, error)
InstallChart(ctx context.Context, spec *ChartSpec, opts *GenericHelmOptions) (*release.Release, error)
UpgradeChart(ctx context.Context, spec *ChartSpec, opts *GenericHelmOptions) (*release.Release, error)
ListDeployedReleases() ([]*release.Release, error)
ListReleasesByStateMask(action.ListStates) ([]*release.Release, error)
GetRelease(name string) (*release.Release, error)
// RollBack is an interface to abstract a rollback action.
RollBack
GetReleaseValues(name string, allValues bool) (map[string]interface{}, error)
GetSettings() *cli.EnvSettings
GetProviders() getter.Providers
UninstallRelease(spec *ChartSpec) error
UninstallReleaseByName(name string) error
TemplateChart(spec *ChartSpec, options *HelmTemplateOptions) ([]byte, error)
LintChart(spec *ChartSpec) error
SetDebugLog(debugLog action.DebugLog)
ListReleaseHistory(name string, max int) ([]*release.Release, error)
GetChart(chartName string, chartPathOptions *action.ChartPathOptions) (*chart.Chart, string, error)
RunChartTests(releaseName string) (bool, error)
}
Example
下面举例说明如何使用 helmClient, 从本地目录安装 helm chart。
import (
"context"
)
func main() {
// using old helmClient that we have created before
helmClient := helmc.GetHelmClient(string(kubeConfig), "default")
// Define the chart to be installed
chartSpec := ChartSpec{
ReleaseName: "nginx",
ChartName: "/tmp/nginx",
Namespace: "default",
UpgradeCRDs: true,
Wait: true,
}
// Install a chart release.
// Note that helmclient.Options.Namespace should ideally match
// the namespace in chartSpec.Namespace.
if _, err := helmClient.InstallChart(context.Background(), &chartSpec,
nil); err != nil {
panic(err)
}
}
Helm: https://helm.sh/