32|Kubernetes版本转换源码剖析

Kubernetes 版本转换机制
- 深入了解
- 翻译
- 解释
- 总结

1. Kubernetes 引入了内部版本概念,简化多版本带来的代码处理复杂度。 2. Kubernetes 版本转换函数是由工具自动生成的,包括生成 `zz_generated.conversion.go` 文件、添加自定义版本转换代码和注册资源版本转换函数。 3. 生成 `zz_generated.conversion.go` 文件的过程是通过 `conversion-gen` 工具根据特定注释来判断是否为所在包的资源定义生成版本转换函数。 4. 注册版本转换函数是通过在 `zz_generated.conversion.go` 文件中生成的 `RegisterConversions` 函数来将版本转换方法注册到资源注册表中的 `Scheme` 中。 5. Kubernetes 为了解决同一资源多版本并存带来的复杂度,引入了“内部版本”(Internal Version)的概念,简化了处理链路中的转换关系。 6. kube-apiserver 在处理请求时,利用 runtime.Scheme、serializer 以及 convertor 组件完成版本转换,将外部对象解码成内部对象,再根据需要转换成目标外部版本或存储版本。 7. 版本转换的核心代码在 Scheme 的 Convert 和 ConvertToVersion 两个方法中,其中 Convert 负责字段级拷贝,ConvertToVersion 负责对象转换并自动创建目标对象、填充 TypeMeta。 8. 大量的字段拷贝函数由 code-generator 子工具 conversion-gen 自动生成,开发者可以手写同名 Convert_* 函数覆盖默认行为。 9. 课后练习包括阅读 kube-apiserver 源码探索 `c.convertor` 类型的实例以及阅读 Scheme.ConvertToVersion 的源码流程,说明当目标 GroupVersion 与输入对象已有的 GVK 完全一致时,函数为什么仍然会执行一次 `copyAndSetTargetKind` 而不是直接返回原对象。
《Kubernetes 源码剖析与实战》,新⼈⾸单¥68