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。