Golang 对接并部署 helm charts

文摘   2024-07-01 19:51   中国香港  

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)
  }
}
参考资料
[1]

Helm: https://helm.sh/


Go Official Blog
Golang官方博客的资讯翻译及独家解读
 最新文章