如果代码是从集群内部运行的,则Helm3不提供任何创建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集群中为Helm3定义操作配置是正确的方式吗?
发布于 2020-04-28 17:27:55
这就是我所做的,并且对我来说工作得很好(使用Helm3.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的初始化之外,它与您最初所做的没有太大的不同。也可能是新版本修复了一些问题。如果这对你有效,请告诉我。
发布于 2020-01-17 20:01:11
要在集群内运行helm3,您需要修改源代码。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()并编译代码。
您还可以尝试修改代码,使生成的二进制文件是通用的,并且可以在集群外运行,也可以在集群内运行。
让我知道它是否有帮助,如果它解决了你的问题。
https://stackoverflow.com/questions/59782217
复制相似问题