头盔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定义动作配置是正确的方法吗?
答案 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()
并编译代码。
您还可以尝试修改代码,使生成的二进制文件具有通用性,并且可以用在集群以及集群内。
让我知道它是否有帮助以及是否可以解决您的问题。