10

我想在 kubernetes 上创建一个服务来管理集群上的 helm 图表。它从私有图表存储库安装图表。由于我没有找到任何有关如何使用 helm 客户端 api 的文档,因此我正在寻找一些示例或指南,以在 helm 客户端之上创建服务。

4

4 回答 4

13

对于 HELM3

正如其他答案所指出的那样,使用 Helm 2,您需要与使事情复杂化的分蘖交谈。

Helm 3 更干净,因为删除了分蘖,并且 helm 客户端直接与 Kubernetes API 服务器通信。

以下是使用 helm3 以编程方式安装 helm 图表的示例代码:

package main

import (
    "fmt"
    "os"

    "helm.sh/helm/v3/pkg/action"
    "helm.sh/helm/v3/pkg/chart/loader"
    "helm.sh/helm/v3/pkg/kube"
    _ "k8s.io/client-go/plugin/pkg/client/auth"
)

func main() {
    chartPath := "/tmp/my-chart-0.1.0.tgz"
    chart, err := loader.Load(chartPath)
    if err != nil {
        panic(err)
    }

    kubeconfigPath := "/tmp/my-kubeconfig"
    releaseName := "my-release"
    releaseNamespace := "default"
    actionConfig := new(action.Configuration)
    if err := actionConfig.Init(kube.GetConfig(kubeconfigPath, "", releaseNamespace), releaseNamespace, os.Getenv("HELM_DRIVER"), func(format string, v ...interface{}) {
        fmt.Sprintf(format, v)
    }); err != nil {
        panic(err)
    }

    iCli := action.NewInstall(actionConfig)
    iCli.Namespace = releaseNamespace
    iCli.ReleaseName = releaseName
    rel, err := iCli.Run(chart, nil)
    if err != nil {
        panic(err)
    }
    fmt.Println("Successfully installed release: ", rel.Name)
}
于 2020-02-05T14:09:51.103 回答
5

因为我花了一些时间才让这个工作在这里是一个最小的例子(没有错误处理,关于 kube 配置的详细信息,......)用于列出版本名称:

package main

import (
  "k8s.io/client-go/kubernetes"
  "k8s.io/helm/pkg/helm"
  "k8s.io/helm/pkg/helm/portforwarder"
)

func main() {
  // omit getting kubeConfig, see: https://github.com/kubernetes/client-go/tree/master/examples

  // get kubernetes client
  client, _ := kubernetes.NewForConfig(kubeConfig)

  // port forward tiller
  tillerTunnel, _ := portforwarder.New("kube-system", client, config)

  // new helm client
  helmClient := helm.NewClient(helm.Host(host))

  // list/print releases
  resp, _ := helmClient.ListReleases()
  for _, release := range resp.Releases {
    fmt.Println(release.GetName())
  }
}
于 2019-10-21T10:51:43.657 回答
4

我一直在尝试使用值设置 Helm 安装--set,我发现查看当前可用功能的最佳位置是官方 helm 文档示例客户端的官方 Go 文档

这仅适用于Helm 3

这是我通过使用上面链接的资源设法开始工作的示例。

我还没有找到一种更优雅的方式来定义值,而不是递归地请求map[string]interface{},所以如果有人知道更好的方式,请告诉我。

值应大致等于:
helm install myrelease /mypath --set redis.sentinel.masterName=BigMaster,redis.sentinel.pass="random" ... etc

请注意使用settings.RESTClientGetter(), 而不是kube.Get, 与其他答案一样。我发现kube.Get这会导致与 k8s 客户端的严重冲突。

package main

import (
    "log"
    "os"

    "helm.sh/helm/v3/pkg/action"
    "helm.sh/helm/v3/pkg/chart/loader"
    "helm.sh/helm/v3/pkg/cli"
    "helm.sh/helm/v3/pkg/release"
)

func main(){
    chartPath := "/mypath"
    namespace := "default"
    releaseName := "myrelease"

    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(), namespace,
        os.Getenv("HELM_DRIVER"), log.Printf); err != nil {
        log.Printf("%+v", err)
        os.Exit(1)
    }

    // define values
    vals := map[string]interface{}{
        "redis": map[string]interface{}{
            "sentinel": map[string]interface{}{
                "masterName": "BigMaster",
                "pass":       "random",
                "addr":       "localhost",
                "port":       "26379",
            },
        },
    }

    // load chart from the path 
    chart, err := loader.Load(chartPath)
    if err != nil {
        panic(err)
    }

    client := action.NewInstall(actionConfig)
    client.Namespace = namespace
    client.ReleaseName = releaseName
    // client.DryRun = true - very handy!


    // install the chart here
    rel, err := client.Run(chart, vals)
    if err != nil {
        panic(err)
    }

    log.Printf("Installed Chart from path: %s in namespace: %s\n", rel.Name, rel.Namespace)
    // this will confirm the values set during installation
    log.Println(rel.Config)
}
于 2020-07-27T13:22:14.773 回答
2

我一直在寻找相同的答案,因为我现在知道解决方案,在这里分享。

您正在寻找的是围绕 helm 库编写一个包装器。

首先,您需要一个与集群的分蘖对话的客户端。为此,您需要从本地主机创建一条到分蘖的隧道。使用这个(它与 kiran 共享的链接相同。)

  1. 设置 Helm 环境变量看这里
  2. 接下来使用这个。它将返回一个 helm 客户端。(您可能需要围绕它编写一个包装器以使用您的集群设置)

拿到句柄后,就可以使用这里*helm.Client给出的 helm 客户端 API 。您只需要使用具有适当值的那个即可。

您可能需要在此处定义一些实用功能,例如将图表加载为文件夹/存档/文件。

如果您想做更多事情,您几乎可以在文档中找到该方法并使用客户端调用它。

于 2019-06-03T08:48:58.927 回答