基于GO语言的集成开发示例

环境

  • go version 1.20.x
  • helm v3
  • kubernetes 1.24.x

示例

增加仓库

    1. package kubestore
    2. import (
    3. "fmt"
    4. "helm.sh/helm/v3/pkg/cli"
    5. "helm.sh/helm/v3/pkg/getter"
    6. "helm.sh/helm/v3/pkg/repo"
    7. "kube-store-operator/commons/logger"
    8. )
    9. // 添加一个仓库地址
    10. // Helm 的添加仓库地就是将【仓库名+仓库地址】写到一个本地的repositories.yaml文件中
    11. func add(entry *repo.Entry) error {
    12. settings := cli.New()
    13. repoFile := settings.RepositoryConfig
    14. // 加载仓库配置文件
    15. repositories, err := repo.LoadFile(repoFile)
    16. // 如果文件不存在
    17. if err != nil {
    18. // 创建一个新的仓库配置对象
    19. repositories = repo.NewFile()
    20. }
    21. // 检查要添加的仓库是否已存在
    22. if repositories.Has(entry.Name) {
    23. return fmt.Errorf("仓库 %s 已存在", entry.Name)
    24. }
    25. // 添加仓库信息到仓库配置
    26. repositories.Add(entry)
    27. // 保存更新后的仓库配置到文件
    28. if err = repositories.WriteFile(repoFile, 0644); err != nil {
    29. return fmt.Errorf("无法保存仓库配置文件:%s", err)
    30. }
    31. logger.Debugf("成功添加仓库地址:%s。", entry.Name)
    32. return nil
    33. }
  • 此功能相当于: helm repo add 仓库名 https://xxx.com

检索仓库

    1. package kubestore
    2. import (
    3. "fmt"
    4. "helm.sh/helm/v3/pkg/cli"
    5. "helm.sh/helm/v3/pkg/getter"
    6. "helm.sh/helm/v3/pkg/repo"
    7. "kube-store-operator/commons/logger"
    8. )
    9. // 查看仓库信息
    10. func list() ([]*repo.Entry, error) {
    11. settings := cli.New()
    12. // 加载仓库配置文件
    13. repositories, err := repo.LoadFile(settings.RepositoryConfig)
    14. if err != nil {
    15. return nil, fmt.Errorf("无法保存仓库配置文件:%s", err)
    16. }
    17. return repositories.Repositories, nil
    18. }
  • 此功能相当于: helm repo list

删除仓库

    1. package kubestore
    2. import (
    3. "fmt"
    4. "helm.sh/helm/v3/pkg/cli"
    5. "helm.sh/helm/v3/pkg/getter"
    6. "helm.sh/helm/v3/pkg/repo"
    7. "kube-store-operator/commons/logger"
    8. )
    9. // 删除一个仓库地址
    10. // repoName 仓库名
    11. func remove(repoName string) error {
    12. settings := cli.New()
    13. repoFile := settings.RepositoryConfig
    14. // 加载仓库配置文件
    15. repositories, err := repo.LoadFile(repoFile)
    16. if err != nil {
    17. return fmt.Errorf("无法加载仓库配置文件:%s", err)
    18. }
    19. // 检查要删除的仓库是否存在
    20. if !repositories.Has(repoName) {
    21. return fmt.Errorf("仓库 %s 不存在", repoName)
    22. }
    23. // 从仓库配置中删除仓库
    24. result := repositories.Remove(repoName)
    25. // 保存更新后的仓库配置到文件
    26. if err = repositories.WriteFile(repoFile, 0644); err != nil || !result {
    27. return fmt.Errorf("无法保存仓库配置文件:%s", err)
    28. }
    29. logger.Debugf("成功删除仓库地址: %s。", repoName)
    30. return nil
    31. }
  • 此功能相当于: helm repo remove 仓库名

更新仓库

    1. package kubestore
    2. import (
    3. "fmt"
    4. "helm.sh/helm/v3/pkg/cli"
    5. "helm.sh/helm/v3/pkg/getter"
    6. "helm.sh/helm/v3/pkg/repo"
    7. "kube-store-operator/commons/logger"
    8. )
    9. // 更新仓库的Helm Chart仓库
    10. func update() (string, error) {
    11. settings := cli.New()
    12. // 加载仓库配置文件
    13. repositories, err := repo.LoadFile(settings.RepositoryConfig)
    14. if err != nil {
    15. return "", fmt.Errorf("无法加载仓库配置文件:%s", err)
    16. }
    17. // 遍历每个仓库
    18. for _, repoEntry := range repositories.Repositories {
    19. // 添加要检索的仓库
    20. chartRepository, err := repo.NewChartRepository(repoEntry, getter.All(settings))
    21. if err != nil {
    22. return "", fmt.Errorf("无法添加仓库:%s\n", err)
    23. }
    24. // 更新仓库索引信息
    25. if _, err := chartRepository.DownloadIndexFile(); err != nil {
    26. return "", fmt.Errorf("无法下载仓库索引:%s\n", err)
    27. }
    28. logger.Debugf("...Successfully got an update from the %s chart repository", repoEntry.Name)
    29. }
    30. return "Update Complete. ⎈Happy Helming!⎈", nil
    31. }
  • 此功能相当于: helm repo update

检索指定仓库中的Chart信息

    1. package kubestore
    2. import (
    3. "fmt"
    4. "helm.sh/helm/v3/pkg/cli"
    5. "helm.sh/helm/v3/pkg/repo"
    6. "kube-store-operator/commons/logger"
    7. )
    8. // 查看指定仓库中最新的Chart信息
    9. // search(仓库名)
    10. func search(repoName string) ([]*ChartListResponse, error) {
    11. settings := cli.New()
    12. path := fmt.Sprintf("%s/%s-index.yaml", settings.RepositoryCache, repoName)
    13. // 加载 xxx-index.yaml 文件
    14. indexFile, err := repo.LoadIndexFile(path)
    15. if err != nil {
    16. return nil, fmt.Errorf("仓库 %s 不存在", repoName)
    17. }
    18. var chartList []*ChartListResponse
    19. // 遍历指定仓库的 Chart 信息
    20. for _, entry := range indexFile.Entries {
    21. // 将每个 Chart 的最新信息提取出来
    22. chart := &ChartListResponse{
    23. ChartName: entry[0].Name,
    24. ChartVersion: entry[0].Version,
    25. AppVersion: entry[0].AppVersion,
    26. Description: entry[0].Description,
    27. }
    28. chartList = append(chartList, chart)
    29. }
    30. // 指定仓库的Chart信息
    31. logger.Debugf("%s", chartList)
    32. return chartList, nil
    33. }
  • 此功能相当于: helm search repo 仓库名

检索指定仓库中Chart的所有版本信息

    1. package kubestore
    2. import (
    3. "fmt"
    4. "helm.sh/helm/v3/pkg/cli"
    5. "helm.sh/helm/v3/pkg/repo"
    6. "kube-store-operator/commons/logger"
    7. )
    8. // 查看指定仓库的Chart所有版本信息
    9. // searchAll(仓库名, Chart名)
    10. func searchAll(repoName, chartName string) ([]*ChartListResponse, error) {
    11. settings := cli.New()
    12. path := fmt.Sprintf("%s/%s-index.yaml", settings.RepositoryCache, repoName)
    13. // 加载 xxx-index.yaml 文件
    14. indexFile, err := repo.LoadIndexFile(path)
    15. if err != nil {
    16. return nil, fmt.Errorf("仓库 %s 不存在", repoName)
    17. }
    18. var chartList []*ChartListResponse
    19. // 遍历指定仓库的 Chart 信息
    20. for _, entry := range indexFile.Entries[chartName] {
    21. // 将每个 Chart 的主要信息提取出来
    22. chart := &ChartListResponse{
    23. ChartName: entry.Name,
    24. ChartVersion: entry.Version,
    25. AppVersion: entry.AppVersion,
    26. Description: entry.Description,
    27. }
    28. chartList = append(chartList, chart)
    29. }
    30. // 指定仓库的Chart信息
    31. logger.Debugf("%s", chartList)
    32. return chartList, nil
    33. }
  • 此功能相当于: helm search repo 仓库名 -l

将Chart安装部署到kubernetes

    1. package kubestore
    2. import (
    3. "fmt"
    4. "helm.sh/helm/v3/pkg/action"
    5. "helm.sh/helm/v3/pkg/chart/loader"
    6. "helm.sh/helm/v3/pkg/cli"
    7. "kube-store-operator/commons/logger"
    8. "os"
    9. )
    10. // 安装Helm Chart
    11. func installChart(deployRequest *DeployRequest) error {
    12. settings := cli.New()
    13. actionConfig := new(action.Configuration)
    14. if err := actionConfig.Init(settings.RESTClientGetter(), deployRequest.Namespace, os.Getenv("HELM_DRIVER"), logger.Debugf); err != nil {
    15. return fmt.Errorf("初始化 action 失败\n%s", err)
    16. }
    17. install := action.NewInstall(actionConfig)
    18. install.RepoURL = deployRequest.RepoURL
    19. install.Version = deployRequest.ChartVersion
    20. install.Timeout = 30e9
    21. install.CreateNamespace = true
    22. install.Wait = true
    23. // kubernetes 中的配置
    24. install.Namespace = deployRequest.Namespace
    25. install.ReleaseName = deployRequest.ReleaseName
    26. chartRequested, err := install.ChartPathOptions.LocateChart(deployRequest.ChartName, settings)
    27. if err != nil {
    28. return fmt.Errorf("下载失败\n%s", err)
    29. }
    30. chart, err := loader.Load(chartRequested)
    31. if err != nil {
    32. return fmt.Errorf("加载失败\n%s", err)
    33. }
    34. _, err = install.Run(chart, nil)
    35. if err != nil {
    36. return fmt.Errorf("执行失败\n%s", err)
    37. }
    38. return nil
    39. }
  • 此功能相当于: helm install

将Chart从kubernetes中卸载

    1. package kubestore
    2. import (
    3. "fmt"
    4. "helm.sh/helm/v3/pkg/action"
    5. "helm.sh/helm/v3/pkg/chart/loader"
    6. "helm.sh/helm/v3/pkg/cli"
    7. "kube-store-operator/commons/logger"
    8. "os"
    9. )
    10. // 卸载Helm Chart
    11. func uninstallChart(namespace, releaseName string) error {
    12. settings := cli.New()
    13. actionConfig := new(action.Configuration)
    14. if err := actionConfig.Init(settings.RESTClientGetter(), namespace, os.Getenv("HELM_DRIVER"), logger.Debugf); err != nil {
    15. return fmt.Errorf("初始化 action 失败\n%s", err)
    16. }
    17. uninstall := action.NewUninstall(actionConfig)
    18. uninstall.Timeout = 30e9 // 设置超时时间300秒
    19. uninstall.KeepHistory = false
    20. resp, err := uninstall.Run(releaseName)
    21. if err != nil {
    22. return fmt.Errorf("卸载失败\n%s", err)
    23. }
    24. logger.Infof("%s 成功卸载\n", resp.Release.Name)
    25. return nil
    26. }
  • 此功能相当于: helm uninstall

代码中用到的实体对象

    1. package kubestore
    2. // DeployRequest
    3. /**
    4. * 部署时用到的结构体
    5. */
    6. type DeployRequest struct {
    7. RepoURL string // 仓库地址
    8. ChartName string // Chart名称
    9. ChartVersion string // Chart版本
    10. Namespace string // 命名空间
    11. ReleaseName string // 在kubernetes中的程序名
    12. Values map[string]interface{} // values.yaml 配置文件
    13. }
    14. // ---------------------------------------------------------------
    15. // ChartListResponse
    16. /**
    17. * 返回指定仓库中的所有Chart信息
    18. */
    19. type ChartListResponse struct {
    20. ChartName string // Chart名称
    21. ChartVersion string // Chart版本
    22. AppVersion string // 应用版本
    23. Description string // 描述
    24. }