github.com/wangchanggan/helm@v0.0.0-20211020154240-11b1b7d5406d/README.md (about) 1 # Helm源码分析 2 Source Code From https://github.com/helm/helm/archive/refs/tags/v2.17.0.tar.gz 3 4 参考云原生应用管理原理与实践(陈显鹭 阚俊宝 匡大虎 卢稼奇 著) 5 6 ## 目录 7 - [Helm源码分析](#helm源码分析) 8 - [目录](#目录) 9 - [Helm Install Client](#helm-install-client) 10 - [locateChartPath](#locatechartpath) 11 - [ensureHelmClient](#ensurehelmclient) 12 - [InstallCmd Run](#installcmd-run) 13 - [installReleaseFromChart](#installreleasefromchart) 14 - [setupConnection](#setupconnection) 15 - [Helm Client install 16 Function](#helm-client-install-function) 17 - [返回Release状态](#返回release状态) 18 - [Helm Install Server](#helm-install-server) 19 - [prepareRelease](#preparerelease) 20 - [performRelease](#performrelease) 21 - [Helm Update](#helm-update) 22 - [update命令的定义](#update命令的定义) 23 - [Update服务端的实现](#update服务端的实现) 24 - [Helm Ls](#helm-ls) 25 - [Client端实现](#client端实现) 26 - [Server端实现](#server端实现) 27 - [Helm Rollback](#helm-rollback) 28 - [Helm Delete](#helm-delete) 29 30 ## Helm Install Client 31 cmd/helm/install.go:172 32 33 ![image](flow_charts/客户端helm安装.png) 34 35 1.提前使用kubectl port-forward功能打通宿主机与远程Tiller Pod的通信。 36 37 2.checkArgsLength检查用户输入参数的合法性。 38 39 3.对于远程地址,locateChartPath下载Chart到本地指定目录;对于本地地址,则直接加载。 40 41 4.installCmd.run将用户命令行输入参数覆盖values.yaml信息,下载依赖的Chart,将Chart信息加载到内存中变成结构体信息。 42 43 5.向Tiller发送install命令,将含有Chart所有信息的结构体发送出去。 44 45 6.打印Tiller返回的Release信息。 46 47 7.向Tiller发送获取Release Status信息并且打印出来。 48 49 ### locateChartPath 50 cmd/helm/install.go:491 51 52 pkg/repo/chartrepo.go:206 53 54 ![image](flow_charts/Chart流程下载.png) 55 56 ### ensureHelmClient 57 cmd/helm/helm.go:421, 430 58 59 ### InstallCmd Run 60 61 cmd/helm/install.go:242 62 63 1.处理helm install命令行临时覆盖的参数 64 65 2.处理外部介入的template 66 67 3.检查指定的Release名称是否符合DNS命名规范 68 69 4.加载Chart文件并且初始化为Chart对象 70 71 5.加载requirements.yaml文件内声明的依赖Chart 72 73 ### installReleaseFromChart 74 pkg/helm/client.go:112 75 76 ### setupConnection 77 cmd/helm/install.go:177 78 79 cmd/helm/helm.go:341 80 81 ### Helm Client install Function 82 pkg/helm/client.go:422,361 83 84 pkg/proto/hapi/services/tiller.pb.go:1566 85 86 ### 返回Release状态 87 cmd/helm/install.go:357 88 89 ## Helm Install Server 90 pkg/tiller/release_install.go:34 91 92 ### prepareRelease 93 pkg/tiller/release_install.go:61 94 95 1.首先检查当前Release名称是否是集群唯一,这是Release唯一性的标志,如果没有指定Release名称,那么就创建一个全集群唯一的名称。 96 97 2.检查客户端、服务端、Kubernetes Api Server的版本兼容性。 98 99 3.初始化ReleaseOptions结构体,填入名称、版本号、命名空间等信息。 100 101 4.ToRenderValuesCaps将手动传递的参数和默认已经存在的values渲染到一起。 102 103 5.renderResources将上一步构建的信息和Kubernetes Api Ssever等信息合并在一起,同时分离出安装Chart Yaml信息和hooks等。 104 105 6.拼接出Release对象,真正开始进入安装步骤。 106 107 ### performRelease 108 pkg/tiller/release_install.go:158 109 110 pkg/tiller/release_server.go:433,423 111 112 pkg/tiller/release_modules.go:53 113 114 1.将Hooks按照权重的顺序依次排序,优先级从高到低,一般需要先安装pre-istall 115 116 2.deleteHookByPolicy丽数将需要在安装前删除的资源优先删除。 117 118 3.将剩余需要创建的资源,尤其是CRD资源提交给集群创建。 119 120 4.提交后一直等待资源创建完毕,默认超时时间为1min。 121 122 5.全部Hooks资源创建完毕后,代表该Chart Hooks准备完毕。 123 124 6.将Release信息记录到Kubernetes集群中,目前Helm默认的方式是记录到kube-system下的configmap中。configmap的名称就是Release的名字,后面的点对应着它的版本号。比如v1就是第一次安装的版本,后面的labels也能表明些身份,比如OWNER=TILLER,代表它是Tiller创建的。 125 126 7.基本信息记录完毕后,将剩余Chart谊染后的资源文件提交给Kubernetes ApiServer。 127 128 ## Helm Update 129 ### update命令的定义 130 cmd\helm\upgrade.go:131 131 132 1.首先创建与Tiller的联通通道。 133 134 2.检查传入参数的合法性。 135 136 3.下载对应的Chart包。 137 138 4.将对应的传入setting值构建成一个Release结构体。 139 140 5.调用 Tiller update接口。 141 142 6.检查Release状态。 143 144 ### Update服务端的实现 145 pkg\tiller\release_update.go:34,276 146 147 ## Helm Ls 148 ### Client端实现 149 cmd\helm\list.go:149 150 151 pkg\helm\client.go:390 152 153 ### Server端实现 154 pkg\tiller\release_list.go:30 155 156 pkg\storage\driver\cfgmaps.go:90 157 158 ## Helm Rollback 159 pkg\tiller\release_rollback.go:64 160 161 pkg\tiller\release_rollback.go:123 162 163 1.检查传递的Release名称是否符合规则。 164 165 2.根据传递的需要,回滚版本号来确定目标版本。 166 167 3.根据版本号去configmap中读取对应的版本号信息。 168 169 4.将读取到的版本号信息格式化成对应的Release结构体。 170 171 5.拼装成结构体后返回。 172 173 ## Helm Delete 174 pkg\tiller\release_uninstall.go:33 175 176 1.检查传递的名称是否符合规范。 177 178 2.根据Release的名称查询其所有的历史记录。 179 180 3.将Release的状态置为删除中。 181 182 4.执行Release中声明的Hooks。 183 184 5.删除Release中的所有资源。 185 186 6.如果指定了强制删除,那么也会把Release信息一并删除掉,这里指的就是configmap。