helm源码分析-基本介绍


| 阅读 |,阅读约 6 分钟
| 复制链接:

Overview

helm源码分析-基本介绍

概述

官网介绍

  • Helm是k8s包管理器,是查找、分享和使用软件构建k8s的最优方式

  • Helm 帮助您管理 Kubernetes 应用——Helm 图表,即使是最复杂的 Kubernetes 应用程序,都可以帮助您定义,安装和升级。

  • Helm是CNCF第10个毕业的项目

特性

  • 复杂性管理
  • 易于升级
  • 分发简单
  • 回滚

架构

helm的目标

helm管理名为chart的k8s包的工具,可以做以下事情:

  • 从头开始创建新的chart
  • 将chart包打包成归档(tgz)文件
  • 与存储chart的仓库进行交互
  • 在k8s集群中安装和卸载chart
  • 管理与helm一起安装的chart的发布周期

重要概念

Chart

创建k8s应用程序所必需的一组信息

Config

包含可以合并到打包的chart中的配置信息,用于创建一个可以发布的对象

Release

是一个与特定配置相结合的chart的运行实例

源码分析环境准备

版本说明

  • 基于helm v3.5.3分支
  • go1.15.6 darwin/amd64

前期准备

1// 创建目录
2cd $GOPATH/src && mkdir -p github.com/helm.sh
3// 下载代码
4git clone https://github.com/helm/helm
5cd helm
6// 切换分支
7git checkout v3.5.3
8// 下载git依赖
9go get -v all

目录结构

 1➜  helm git:(041ce5a2) ✗ tree -L 1 
 2.
 3├── ADOPTERS.md
 4├── CONTRIBUTING.md
 5├── KEYS
 6├── LICENSE
 7├── Makefile // make编译文件
 8├── OWNERS
 9├── README.md
10├── SECURITY.md
11├── cmd  // 使用helm命令所有的入口文件
12├── code-of-conduct.md
13├── go.mod
14├── go.sum
15├── internal // 内部实现逻辑包
16├── pkg // sdk包
17├── scripts // 存放脚本的目录
18└── testdata // 测试数据

主要关注 cmd、pkg、internal三个目录的代码

cmd目录结构

  • cmd目录下存放了执行helm命令时所有的相关代码,比如helm install、helm uninstall、helm upgrade等。
  • cmd中有些命令是实验性阶段的命令,需要配置HELM_EXPERIMENTAL_OCI=1属性才能使用
  • cmd中代码使用cobra命令行框架(该框架非常流行,比如k8s、istio等重大项目都是使用该命令行框架)
  • main函数入口在helm.go文件中
  • 所有的命令注册在root.go文件中,root.go还包括加载插件、校验kubeconfig权限、校验超时的repo仓库
  • 调用的先后关系:helm.go -> root.go -> xxx.go
  1➜  helm git:(041ce5a2) ✗ tree -L 2 cmd
  2cmd
  3└── helm
  4    ├── chart.go // helm chart 命令的代码,子命令有:pull、push、tag、list、remove
  5    ├── chart_export.go
  6    ├── chart_list.go // helm chart list 命令代码
  7    ├── chart_pull.go // helm chart pull 命令代码
  8    ├── chart_push.go // helm chart push 命令代码
  9    ├── chart_remove.go // helm chart remove 命令代码
 10    ├── chart_save.go // helm chart save 命令代码
 11    ├── completion.go // helm completion, 子命令有:bash、fish、zsh
 12    ├── completion_test.go
 13    ├── create.go // helm create 命令代码
 14    ├── create_test.go
 15    ├── dependency.go // helm dependency,helm dependency list 命令代码,子命令有:build、list、update
 16    ├── dependency_build.go // helm dependency build 命令代码
 17    ├── dependency_build_test.go
 18    ├── dependency_test.go
 19    ├── dependency_update.go // helm dependency update 命令代码
 20    ├── dependency_update_test.go
 21    ├── docs.go // helm docs 命令代码,执行后会在当前目录下生成每个命令的markdown说明文件
 22    ├── docs_test.go
 23    ├── env.go // helm env 命令代码
 24    ├── env_test.go
 25    ├── flags.go // 解析命令行flag的代码
 26    ├── flags_test.go
 27    ├── get.go // helm get 命令代码,获取release相关信息。子命令有:all、hooks、manifest、notes、values
 28    ├── get_all.go // helm get all 命令代码
 29    ├── get_all_test.go
 30    ├── get_hooks.go // helm get hook 命令代码
 31    ├── get_hooks_test.go
 32    ├── get_manifest.go // helm get manifest 命令代码
 33    ├── get_manifest_test.go
 34    ├── get_notes.go // helm get notes 命令代码
 35    ├── get_notes_test.go
 36    ├── get_test.go
 37    ├── get_values.go // helm get values 命令代码
 38    ├── get_values_test.go
 39    ├── helm.go // main函数入口文件
 40    ├── helm_test.go
 41    ├── history.go // helm history 命令代码,获取某个release发布的历史情况,历史发布情况通过driver模块存储,底层实现可以是多种:secret、configmap、memory,sql(仅仅支持postgresql),比如secret这种驱动就通过查询label(LabelSelector)实现历史查询(name+owner),因为发布的历史数据存放在一个owner属于helm的secret中
 42    ├── history_test.go
 43    ├── install.go // helm install 命令代码
 44    ├── install_test.go
 45    ├── lint.go // helm lint 命令代码
 46    ├── lint_test.go
 47    ├── list.go // helm list 命令代码
 48    ├── list_test.go
 49    ├── load_plugins.go // 处理插件相关代码,读取插件文件,将相关元信息中的命令注册到helm命令行中
 50    ├── package.go // helm package 命令代码,将目录打包成待版本管理的tgz
 51    ├── package_test.go
 52    ├── plugin.go // helm plugin 命令代码,子命令有:install、list、uninstall、update
 53    ├── plugin_install.go // helm plugin install 命令代码
 54    ├── plugin_list.go // helm plugin list 命令代码
 55    ├── plugin_test.go
 56    ├── plugin_uninstall.go // helm plugin uninstall 命令代码 (也可以用rm、remove)
 57    ├── plugin_update.go // helm plugin update 命令代码
 58    ├── printer.go
 59    ├── pull.go // helm pull 命令代码
 60    ├── pull_test.go
 61    ├── registry.go // helm registry 命令代码,子命令有:login、logout
 62    ├── registry_login.go // helm registry login 命令代码
 63    ├── registry_logout.go // helm registry logout 命令代码
 64    ├── release_testing.go
 65    ├── release_testing_test.go
 66    ├── repo.go // helm repo 命令代码,子命令有:add、list、remove、index、update
 67    ├── repo_add.go // helm repo add 命令代码
 68    ├── repo_add_test.go
 69    ├── repo_index.go // helm repo index 为目录下所有的chart包创建索引
 70    ├── repo_index_test.go
 71    ├── repo_list.go // helm repo list 命令代码
 72    ├── repo_list_test.go
 73    ├── repo_remove.go // helm repo remove 命令代码
 74    ├── repo_remove_test.go
 75    ├── repo_test.go
 76    ├── repo_update.go // helm repo update 命令代码
 77    ├── repo_update_test.go
 78    ├── rollback.go // helm rollback 命令代码,将release回滚到之前的版本
 79    ├── rollback_test.go
 80    ├── root.go // 所有命令的注册入口
 81    ├── root_test.go
 82    ├── root_unix.go // unix下的校验,目前只校验kubeconfig文件是否存在以及全新
 83    ├── root_unix_test.go
 84    ├── root_windows.go // windows下暂未实现
 85    ├── search.go // helm search 命令代码
 86    ├── search_hub.go // helm search hub 命令代码
 87    ├── search_hub_test.go
 88    ├── search_repo.go // helm search repo 命令代码
 89    ├── search_repo_test.go
 90    ├── search_test.go
 91    ├── show.go // helm show 或者 helm inspect
 92    ├── show_test.go
 93    ├── status.go // helm status
 94    ├── status_test.go
 95    ├── template.go // helm template
 96    ├── template_test.go
 97    ├── uninstall.go // helm uninstall 命令代码,也可以是helm un、helm del、helm delete
 98    ├── uninstall_test.go
 99    ├── upgrade.go // helm upgrade
100    ├── upgrade_test.go
101    ├── verify.go // helm vertify
102    ├── verify_test.go
103    ├── version.go // helm version
104    └── version_test.go

pkg目录结构

 1➜  helm git:(041ce5a2) ✗ tree -L 1 pkg     
 2pkg
 3├── action // 存放所有cmd中helm执行命令行需要的底层操作
 4├── chart // chart对象和相关操作的包(比如加载文件为Chart对象)
 5├── chartutil
 6├── cli
 7├── downloader // 下载chart包相关代码
 8├── engine // 模板渲染相关代码,将给定的配置和模板渲染成最终的资源文件
 9├── gates
10├── getter
11├── helmpath
12├── kube
13├── lint
14├── plugin // helm plugin 相关代码,注册的插件会自动添加到cobra命令中
15├── postrender // helm有生命周期管理,这里是在渲染完成模板后加入的一些钩子(hook)
16├── provenance
17├── release // release等数据结构和操作的包
18├── releaseutil
19├── repo // helm repo相关操作的实现代码
20├── storage // 存储相关操作,release发布后的信息,需要存储起来,便于查询、回滚等操作。storage提供了插件式存储接口,底层有多种存储实现:secret(默认)、configmap、sql(目前只支持postgresql)、memory
21├── strvals
22└── time

internal目录结构

 1➜  helm git:(041ce5a2) ✗ tree -L 1 internal 
 2internal
 3├── experimental
 4├── fileutil
 5├── ignore
 6├── monocular
 7├── resolver
 8├── sympath
 9├── test
10├── third_party
11├── tlsutil
12├── urlutil
13└── version