kubernetes helm golang客户端上的样本

时间:2017-08-15 12:19:07

标签: go kubernetes kubernetes-helm

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

5 个答案:

答案 0 :(得分:8)

FOR HELM3

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

使用Helm 3可以更干净,因为移除了分and并且helm客户端直接与Kubernetes API Server通信。

以下是示例代码,可通过helm3以编程方式安装头盔图表:

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)
}

答案 1 :(得分:1)

由于花了我一些时间才能在这里工作,所以是列出发行版本名称的一个最小示例(没有错误处理,有关kube config的详细信息,...)。

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())
  }
}

答案 2 :(得分:1)

长期以来,我一直尝试使用--set值设置Helm安装,我发现看待当前可用功能的最佳位置是official helm documentation exampleofficial Go docs for the client

这仅与头盔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客户造成了严重冲突。

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)

}

答案 3 :(得分:0)

我一直在寻找相同的答案,因为我现在知道解决方案,并在此处共享。

您正在寻找的是在头盔库周围编写包装器。

首先,您需要一个能够与群集分till说话的客户端。为此,您需要从本地主机创建通往分till的隧道。使用this(与kiran共享相同的链接。)

  1. 设置Helm环境变量look here
  2. 接下来使用this。它将返回一个掌舵的客户。 (您可能需要为它编写一个包装器以使用集群设置)

获得*helm.Client句柄后,可以使用给定here的helm的客户端API。您只需要使用所需的值和适当的值即可。

您可能需要定义一些here的实用程序功能,例如将图表作为文件夹/档案/文件加载。

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

答案 4 :(得分:-1)

使用Tiller服务向kubernetes发表讲话,因为Kiran指出看看舵代码,它会有示例代码。