【问题标题】:Run helm3 client from in-cluster从集群内运行 helm3 客户端
【发布时间】:2020-05-04 00:55:15
【问题描述】:

Helm 3 不提供任何方式来创建 action.Configuration 结构,如果代码是在集群内运行的话。

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

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 定义操作配置是否正确?

【问题讨论】:

  • 什么是“动作”?你能描述一下你想要达到的目标吗?
  • action 是 Helm 包,它允许对客户端执行“操作”:pkg.go.dev/helm.sh/helm/v3@v3.0.2/pkg/action?tab=doc。所有这些操作都需要配置 (pkg.go.dev/helm.sh/helm/v3@v3.0.2/pkg/…)。但是似乎没有用于集群内代码的 API。
  • 哦,好的,谢谢。那么“集群内”的区别就是您如何设置与 kube api 的连接?
  • 我认为是这样 - 使用 cli 包可以消除我的 SIGSEGV 错误,但我仍然无法连接,收到 context deadline exceeded

标签: kubernetes kubernetes-helm


【解决方案1】:

要在集群中运行 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() 并编译代码。

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

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

【讨论】:

  • 感谢您的回复!我想避免直接修改 helm 源代码,而是使用库的接口。他们没有提供直接从集群运行代码的方法,这真的很奇怪。
【解决方案2】:

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

import (
    "log"

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

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

动作配置

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的初始化之外,和你原来做的没有太大区别。也可能是较新的版本修复了一些问题。让我知道这是否适合您。

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 2020-09-29
    • 2023-03-03
    • 1970-01-01
    • 2018-06-19
    • 2020-02-14
    • 2017-11-15
    • 2016-04-25
    相关资源
    最近更新 更多