从集群内运行helm3客户端

时间:2020-01-17 06:27:47

标签: kubernetes kubernetes-helm

头盔3不提供任何创建动作的方法。如果代码是在集群中运行的,则为配置结构。

我尝试通过建立自己的通用标志:

config, err := rest.InClusterConfig()
if err != nil {
    panic(err)
}
insecure := false

genericConfigFlag := &genericclioptions.ConfigFlags{
    Timeout: stringptr("0"),
    Insecure: &insecure,
    APIServer: stringptr(config.Host),
    CAFile: stringptr(config.CAFile),
    BearerToken: stringptr(config.BearerToken),
    ImpersonateGroup: &[]string{},
    Namespace: stringptr(namespace),
}

actionConfig := &action.Configuration{
    RESTClientGetter: genericConfigFlag,
    KubeClient: kube.New(genericConfigFlag),
    Log: log.Infof,
}

不幸的是,这稍后会在运行action.NewList(actionConfig).Run()时导致SIGSEGV错误。

从Kubernetes集群中为Helm 3定义动作配置是正确的方法吗?

2 个答案:

答案 0 :(得分:1)

这就是我所做的,并且对我来说很好(使用helm 3.2.0级sdk代码): 进口

import (
    "log"

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

    "k8s.io/cli-runtime/pkg/genericclioptions"
    "k8s.io/client-go/rest"
)

ActionConfig

func getActionConfig(namespace string) (*action.Configuration, error) {
    actionConfig := new(action.Configuration)
    var kubeConfig *genericclioptions.ConfigFlags
    // Create the rest config instance with ServiceAccount values loaded in them
    config, err := rest.InClusterConfig()
    if err != nil {
        return nil, err
    }
    // Create the ConfigFlags struct instance with initialized values from ServiceAccount
    kubeConfig = genericclioptions.NewConfigFlags(false)
    kubeConfig.APIServer = &config.Host
    kubeConfig.BearerToken = &config.BearerToken
    kubeConfig.CAFile = &config.CAFile
    kubeConfig.Namespace = &namespace
    if err := actionConfig.Init(kubeConfig, namespace, os.Getenv("HELM_DRIVER"), log.Printf); err != nil {
        return nil, err
    }
    return actionConfig, nil
}

用法

actionConfig, kubeConfigFileFullPath, err := getActionConfig(namespace)
listAction := action.NewList(actionConfig)
releases, err := listAction.Run()
if err != nil {
    log.Println(err)
}
for _, release := range releases {
    log.Println("Release: " + release.Name + " Status: " + release.Info.Status.String())
}

除了actionConfig的初始化外,它与您最初所做的没有太大不同。也可能是较新的版本修复了一些问题。让我知道这是否适合您。

答案 1 :(得分:0)

要运行Helm 3集群,您需要修改源代码。 Here是函数:

func (c *Configuration) KubernetesClientSet() (kubernetes.Interface, error) {
    conf, err := c.RESTClientGetter.ToRESTConfig()
    if err != nil {
        return nil, errors.Wrap(err, "unable to generate config for kubernetes client")
    }

    return kubernetes.NewForConfig(conf)
}

此行conf, err := c.RESTClientGetter.ToRESTConfig()
更改为conf, err := rest.InClusterConfig() 并编译代码。

您还可以尝试修改代码,使生成的二进制文件具有通用性,并且可以用在集群以及集群内。

让我知道它是否有帮助以及是否可以解决您的问题。