我希望在 Kubernetes 上创建一个服务,管理集群上的 Helm Charts。它从私有 Chart 仓库安装 Charts。由于我没有找到如何使用 Helm 客户端 API 的文档,因此我正在寻找一些示例或指南,以便在 Helm 客户端之上创建服务。
我希望在 Kubernetes 上创建一个服务,管理集群上的 Helm Charts。它从私有 Chart 仓库安装 Charts。由于我没有找到如何使用 Helm 客户端 API 的文档,因此我正在寻找一些示例或指南,以便在 Helm 客户端之上创建服务。
针对Helm3
正如其他答案所指出的,使用Helm 2需要与Tiller进行交互,这使事情变得更加复杂。
由于删除了Tiller,使用Helm 3要干净得多,因为Helm客户端直接与Kubernetes API服务器通信。
以下是使用Helm3以编程方式安装Helm图表的示例代码:
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)
}
Init
方法。 - Ishan Kharemap[string]interface{}
您可以将参数传递给 Run
函数,如果这些是您的安装值。 - LemurPwned由于我花了一些时间才使其工作,因此这是一个最小示例(没有错误处理,留下有关kube配置的详细信息等),用于列出发布名称:
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())
}
}
host := "tiller-deploy.kube-system.svc:44134"
即可。 - B.Z.我曾长时间尝试使用--set
值设置Helm安装,发现目前可用功能的最佳参考是官方Helm文档示例和客户端官方Go文档。
这仅适用于Helm 3。
以下是我使用上述资源成功实现的示例:
除了递归请求map[string]interface{}
之外,我没有找到更优雅地定义值的方法,因此如果有人知道更好的方法,请告诉我。
值应大致相当于:
helm install myrelease /mypath --set redis.sentinel.masterName=BigMaster,redis.sentinel.pass="random" ... etc
请注意,与其他答案中的kube.Get
不同,此处使用了settings.RESTClientGetter()
。 我发现kube.Get
会与k8s客户端发生冲突。
package main
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)
}
-h
选项运行它,并从源代码中探索实现。 - user378704