基于GO语言的集成开发示例
环境
- go version 1.20.x
- helm v3
- kubernetes 1.24.x
示例
增加仓库
package kubestore import ( "fmt" "helm.sh/helm/v3/pkg/cli" "helm.sh/helm/v3/pkg/getter" "helm.sh/helm/v3/pkg/repo" "kube-store-operator/commons/logger" ) // 添加一个仓库地址 // Helm 的添加仓库地就是将【仓库名+仓库地址】写到一个本地的repositories.yaml文件中 func add(entry *repo.Entry) error { settings := cli.New() repoFile := settings.RepositoryConfig // 加载仓库配置文件 repositories, err := repo.LoadFile(repoFile) // 如果文件不存在 if err != nil { // 创建一个新的仓库配置对象 repositories = repo.NewFile() } // 检查要添加的仓库是否已存在 if repositories.Has(entry.Name) { return fmt.Errorf("仓库 %s 已存在", entry.Name) } // 添加仓库信息到仓库配置 repositories.Add(entry) // 保存更新后的仓库配置到文件 if err = repositories.WriteFile(repoFile, 0644); err != nil { return fmt.Errorf("无法保存仓库配置文件:%s", err) } logger.Debugf("成功添加仓库地址:%s。", entry.Name) return nil }
此功能相当于: helm repo add 仓库名 https://xxx.com
检索仓库
package kubestore import ( "fmt" "helm.sh/helm/v3/pkg/cli" "helm.sh/helm/v3/pkg/getter" "helm.sh/helm/v3/pkg/repo" "kube-store-operator/commons/logger" ) // 查看仓库信息 func list() ([]*repo.Entry, error) { settings := cli.New() // 加载仓库配置文件 repositories, err := repo.LoadFile(settings.RepositoryConfig) if err != nil { return nil, fmt.Errorf("无法保存仓库配置文件:%s", err) } return repositories.Repositories, nil }
此功能相当于: helm repo list
删除仓库
package kubestore import ( "fmt" "helm.sh/helm/v3/pkg/cli" "helm.sh/helm/v3/pkg/getter" "helm.sh/helm/v3/pkg/repo" "kube-store-operator/commons/logger" ) // 删除一个仓库地址 // repoName 仓库名 func remove(repoName string) error { settings := cli.New() repoFile := settings.RepositoryConfig // 加载仓库配置文件 repositories, err := repo.LoadFile(repoFile) if err != nil { return fmt.Errorf("无法加载仓库配置文件:%s", err) } // 检查要删除的仓库是否存在 if !repositories.Has(repoName) { return fmt.Errorf("仓库 %s 不存在", repoName) } // 从仓库配置中删除仓库 result := repositories.Remove(repoName) // 保存更新后的仓库配置到文件 if err = repositories.WriteFile(repoFile, 0644); err != nil || !result { return fmt.Errorf("无法保存仓库配置文件:%s", err) } logger.Debugf("成功删除仓库地址: %s。", repoName) return nil }
此功能相当于: helm repo remove 仓库名
更新仓库
package kubestore import ( "fmt" "helm.sh/helm/v3/pkg/cli" "helm.sh/helm/v3/pkg/getter" "helm.sh/helm/v3/pkg/repo" "kube-store-operator/commons/logger" ) // 更新仓库的Helm Chart仓库 func update() (string, error) { settings := cli.New() // 加载仓库配置文件 repositories, err := repo.LoadFile(settings.RepositoryConfig) if err != nil { return "", fmt.Errorf("无法加载仓库配置文件:%s", err) } // 遍历每个仓库 for _, repoEntry := range repositories.Repositories { // 添加要检索的仓库 chartRepository, err := repo.NewChartRepository(repoEntry, getter.All(settings)) if err != nil { return "", fmt.Errorf("无法添加仓库:%s\n", err) } // 更新仓库索引信息 if _, err := chartRepository.DownloadIndexFile(); err != nil { return "", fmt.Errorf("无法下载仓库索引:%s\n", err) } logger.Debugf("...Successfully got an update from the %s chart repository", repoEntry.Name) } return "Update Complete. ⎈Happy Helming!⎈", nil }
此功能相当于: helm repo update
检索指定仓库中的Chart信息
package kubestore import ( "fmt" "helm.sh/helm/v3/pkg/cli" "helm.sh/helm/v3/pkg/repo" "kube-store-operator/commons/logger" ) // 查看指定仓库中最新的Chart信息 // search(仓库名) func search(repoName string) ([]*ChartListResponse, error) { settings := cli.New() path := fmt.Sprintf("%s/%s-index.yaml", settings.RepositoryCache, repoName) // 加载 xxx-index.yaml 文件 indexFile, err := repo.LoadIndexFile(path) if err != nil { return nil, fmt.Errorf("仓库 %s 不存在", repoName) } var chartList []*ChartListResponse // 遍历指定仓库的 Chart 信息 for _, entry := range indexFile.Entries { // 将每个 Chart 的最新信息提取出来 chart := &ChartListResponse{ ChartName: entry[0].Name, ChartVersion: entry[0].Version, AppVersion: entry[0].AppVersion, Description: entry[0].Description, } chartList = append(chartList, chart) } // 指定仓库的Chart信息 logger.Debugf("%s", chartList) return chartList, nil }
此功能相当于: helm search repo 仓库名
检索指定仓库中Chart的所有版本信息
package kubestore import ( "fmt" "helm.sh/helm/v3/pkg/cli" "helm.sh/helm/v3/pkg/repo" "kube-store-operator/commons/logger" ) // 查看指定仓库的Chart所有版本信息 // searchAll(仓库名, Chart名) func searchAll(repoName, chartName string) ([]*ChartListResponse, error) { settings := cli.New() path := fmt.Sprintf("%s/%s-index.yaml", settings.RepositoryCache, repoName) // 加载 xxx-index.yaml 文件 indexFile, err := repo.LoadIndexFile(path) if err != nil { return nil, fmt.Errorf("仓库 %s 不存在", repoName) } var chartList []*ChartListResponse // 遍历指定仓库的 Chart 信息 for _, entry := range indexFile.Entries[chartName] { // 将每个 Chart 的主要信息提取出来 chart := &ChartListResponse{ ChartName: entry.Name, ChartVersion: entry.Version, AppVersion: entry.AppVersion, Description: entry.Description, } chartList = append(chartList, chart) } // 指定仓库的Chart信息 logger.Debugf("%s", chartList) return chartList, nil }
此功能相当于: helm search repo 仓库名 -l
将Chart安装部署到kubernetes
package kubestore import ( "fmt" "helm.sh/helm/v3/pkg/action" "helm.sh/helm/v3/pkg/chart/loader" "helm.sh/helm/v3/pkg/cli" "kube-store-operator/commons/logger" "os" ) // 安装Helm Chart func installChart(deployRequest *DeployRequest) error { settings := cli.New() actionConfig := new(action.Configuration) if err := actionConfig.Init(settings.RESTClientGetter(), deployRequest.Namespace, os.Getenv("HELM_DRIVER"), logger.Debugf); err != nil { return fmt.Errorf("初始化 action 失败\n%s", err) } install := action.NewInstall(actionConfig) install.RepoURL = deployRequest.RepoURL install.Version = deployRequest.ChartVersion install.Timeout = 30e9 install.CreateNamespace = true install.Wait = true // kubernetes 中的配置 install.Namespace = deployRequest.Namespace install.ReleaseName = deployRequest.ReleaseName chartRequested, err := install.ChartPathOptions.LocateChart(deployRequest.ChartName, settings) if err != nil { return fmt.Errorf("下载失败\n%s", err) } chart, err := loader.Load(chartRequested) if err != nil { return fmt.Errorf("加载失败\n%s", err) } _, err = install.Run(chart, nil) if err != nil { return fmt.Errorf("执行失败\n%s", err) } return nil }
此功能相当于: helm install
将Chart从kubernetes中卸载
package kubestore import ( "fmt" "helm.sh/helm/v3/pkg/action" "helm.sh/helm/v3/pkg/chart/loader" "helm.sh/helm/v3/pkg/cli" "kube-store-operator/commons/logger" "os" ) // 卸载Helm Chart func uninstallChart(namespace, releaseName string) error { settings := cli.New() actionConfig := new(action.Configuration) if err := actionConfig.Init(settings.RESTClientGetter(), namespace, os.Getenv("HELM_DRIVER"), logger.Debugf); err != nil { return fmt.Errorf("初始化 action 失败\n%s", err) } uninstall := action.NewUninstall(actionConfig) uninstall.Timeout = 30e9 // 设置超时时间300秒 uninstall.KeepHistory = false resp, err := uninstall.Run(releaseName) if err != nil { return fmt.Errorf("卸载失败\n%s", err) } logger.Infof("%s 成功卸载\n", resp.Release.Name) return nil }
此功能相当于: helm uninstall
代码中用到的实体对象
package kubestore // DeployRequest /** * 部署时用到的结构体 */ type DeployRequest struct { RepoURL string // 仓库地址 ChartName string // Chart名称 ChartVersion string // Chart版本 Namespace string // 命名空间 ReleaseName string // 在kubernetes中的程序名 Values map[string]interface{} // values.yaml 配置文件 } // --------------------------------------------------------------- // ChartListResponse /** * 返回指定仓库中的所有Chart信息 */ type ChartListResponse struct { ChartName string // Chart名称 ChartVersion string // Chart版本 AppVersion string // 应用版本 Description string // 描述 }