4.1.3 InstallCmd Run
经过了前面的一系列准备,下面就可以进入客户端最重要的步骤,真正地处理数据并向Tiller发送信息。由于Run函数代码比较长,下面分段展示讲解。
1.处理helm install命令行临时覆盖的参数
if i.namespace == "" { i.namespace = defaultNamespace() } rawVals, err := vals(i.valueFiles, i.values, i.stringValues, i.fileValues, i.certFile, i.keyFile, i.caFile) if err != nil { return err }
首先查看是否填写了命名空间名称,如果没有填写,则默认是default命名空间。然后使用vals函数合并命令行"helm install-f myvalues.yaml"覆盖的参数,这里使用的"-f override.yaml"这种命令行传参方式就是通过vals函数实现的。此函数将valueFiles,values等信息读取出来后,和已经加载到内存的valuesMap做一个对比,用外部传入的参数覆盖当前内存中的参数,这样在继续进行后面的动作时,都是使用的外部命令行的最新参数列表。
2.处理外部介入的template
if i.nameTemplate != "" { i.name, err = generateName(i.nameTemplate) if err != nil { return err } // 打印名称,以便用户知道这个Release的最终名称 fmt.Printf("FINAL NAME: %s\n", i.name) }
如果在执行install命令时指定了template,这里就会根据template的名称使用go template模板库进行读取,同时也会自动渲染该模板,最终返回一个被渲染过的template对象。
3.检查指定的Release名称是否符合DNS命名规范
if msgs := validation.IsDNS1123Subdomain(i.name); i.name != "" && len(msgs) > 0 { return fmt.Errorf("release name %s is invalid: %s", i.name, strings.Join(msgs, ";")) }
这里会检查指定的名称是否符合DNS命名规范,这个规范适用于Kubernetes各个资源的命名,算是Kubernetes各个资源部署的统一标准。
4.加载Chart文件并且初始化为Chart对象
// 检查Chart的要求,以确保所有依赖项都在Chart中 ChartRequested, err := Chartutil.Load(i.ChartPath)
下面就是根据前面返回的Chart本地存储路径加载对应的Chart文件。这里的Chart文件一般都是一个文件夹,里面含有values.yaml、Chart等各种文件和文件夹,该函数读取这些文件的内容后,将其初始化为一个对应的Chart,这样既能校验Chart内容的正确性也方便后面继续调用。当然,如果设置了.helmignore文件,那么这个函数也会略过这些文件,不会将其序列化到Chart对象中。
5.加载requirements.yaml文件内声明的依赖Chart
if req, err := Chartutil.LoadRequirements(ChartRequested); err == nil { if err := renderutil.CheckDependencies(ChartRequested, req); err != nil { if i.depUp { man := &downloader.Manager{ Out: i.out, ChartPath: i.ChartPath, HelmHome: settings.Home, Keyring: defaultKeyring(), SkipUpdate: false, Getters: getter.All(settings), } if err := man.Update(); err != nil { return prettyError(err) } // 更新Charts文件夹下的所有依赖 ChartRequested, err = Chartutil.Load(i.ChartPath) if err != nil { return prettyError(err) } } else { return prettyError(err) } } } else if err != Chartutil.ErrRequirementsNotFound { return fmt.Errorf("cannot load requirements: %v", err) }
有时候我们需要requirements.yaml文件声明一下Chart需要的各种子Chart资源,这里的函数LoadRequirements会检查是否有requirements.yaml文件,并且将声明的文件内容使用上面介绍的Chart重新下载和读取渲染函数来重新运行一遍。当然,全部下载完毕后,还会再使用Load函数加载内容加载。到此,内存中的Chart结构体已经包含所有需要的文本信息。