云原生应用管理:原理与实践
上QQ阅读APP看书,第一时间看更新

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结构体已经包含所有需要的文本信息。