前言
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/cli-runtime@v0.17.3/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
}