helm源码分析-基本介绍
| 阅读 | 共 2908 字,阅读约
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