Helm Namespace设置原理

前言

Helm chart里的资源设置命名空间为demo,然后helm install demo podinfo -n test安装chart,运行结果会怎样?

Helm的release信息保存在demo ns,具体的资源在test空间创建。

实现

Install 核心流程

  • renderResources会将template下的模板文件进行渲染,

  • Build解析渲染文件,将文件转换为k8s的资源对象。

pkg/action/install.go:Run

//渲染文件
rel.Hooks, manifestDoc, rel.Info.Notes, err = i.cfg.renderResources(chrt, valuesToRender, i.ReleaseName, i.OutputDir, i.SubNotes, i.UseReleaseName, i.IncludeCRDs, i.PostRenderer)
if manifestDoc != nil {
   rel.Manifest = manifestDoc.String()
}
rel.SetStatus(release.StatusPendingInstall, "Initial install underway")
// 解析资源
resources, err := i.cfg.KubeClient.Build(bytes.NewBufferString(rel.Manifest), !i.DisableOpenAPIValidation)

Builder创建

pkg/kube/client.go:142

// newBuilder returns a new resource builder for structured api objects.
func (c *Client) newBuilder() *resource.Builder {
   return c.Factory.NewBuilder().
      ContinueOnError().
      // 设置默认的namespace
      NamespaceParam(c.namespace()).
      // 打开默认设置开关
      DefaultNamespace().
      Flatten()
}

// Build validates for Kubernetes objects and returns unstructured infos.
func (c *Client) Build(reader io.Reader, validate bool) (ResourceList, error) {
   schema, err := c.Factory.Validator(validate)
   if err != nil {
      return nil, err
   }
   result, err := c.
      // 创建builder
      newBuilder().
      Unstructured().
      Schema(schema).
      Stream(reader, "").
      // 执行处理逻辑
      Do().Infos()
   return result, scrubValidationError(err)
}

资源解析

如果资源没有设置ns,使用builder的默认ns。

k8s.io/[email protected]/pkg/resource/builder.go:1098

func (b *Builder) Do() *Result {
   r := b.visitorResult()
   helpers := []VisitorFunc{}
   // 设置默认namespace
   if b.defaultNamespace {
      helpers = append(helpers, SetNamespace(b.namespace))
   }
   return r
}

你可能感兴趣的:(Helm Namespace设置原理)