Kubernetes 源码剖析与实战
孔令飞
前腾讯云专家工程师
1444 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已更新 34 讲/共 55 讲
Kubernetes 源码剖析与实战
15
15
1.0x
00:00/00:00
登录|注册

32|Kubernetes版本转换源码剖析

你好,我是孔令飞。
通过上一节课的学习,我们知道随着 Kubernetes 功能的新增、变更等,API 接口会进行一些兼容性或不兼容性变更,这些变更会导致 API 接口的版本号往前增加,出现同一个资源多个版本并存的情况。
那么,Kubernetes 是如何处理这么多的 API 版本带来的复杂度问题的呢?Kubernetes 引入了奇妙的内部版本概念,简化多版本带来的代码处理复杂度。另外,为了确保 API 接口是向后兼容的,还需要进行多版本之间的 API 转换。
本节课,我们就来看下 Kubernetes 各种类型的版本之间是如何进行相互转换的。

Kubernetes 版本转换机制

Kubernetes 有 3 大版本号类型:
外部版本号(External Version):Kubernetes 对外暴露的版本号,具有明确的版本标识,如 v1/v2beta1 等。在实际开发中,使用者可以根据需要选择指定的版本号。
内部版本号(Internal Version):Kubernetes 内部使用的版本号,不直接暴露给用户。内部版本号对应的请求参数,是同类资源所有版本参数字段的超集。默认是最新的外部版本号所定义的参数字段。
存储版本号(Storage Version):etcd 中使用的版本号,通常是外部版本中稳定的版本,比如 v1/v2 等。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

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
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部