深入剖析 Kubernetes
张磊
Kubernetes 社区资深成员与项目维护者
116705 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
再谈开源与社区 (1讲)
结束语 (1讲)
深入剖析 Kubernetes
15
15
1.0x
00:00/00:00
登录|注册

24 | 深入解析声明式API(一):API对象的奥秘

管理自定义API对象
创建Network对象
创建Network对象的CRD
代码生成工具
CRD的定义方法
添加自定义的API对象
Custom Resource Definition (CRD)
APIServer创建API对象的流程
Kubernetes对Resource、Group和Version的解析
API对象的组织方式
API对象在Etcd里的完整资源路径
使用CRD描述现实中的实体的思路
Kubernetes API编程库的工作原理
实现业务逻辑
编写自定义控制器
创建和管理自定义API对象
API插件机制:CRD
Kubernetes声明式API的工作原理
Kubernetes声明式API的设计、特点和使用方式
思考题
下一步计划
深入解析声明式API
深入解析声明式API之API对象的奥秘

该思维导图由 AI 生成,仅供参考

你好,我是张磊。今天我和你分享的主题是:深入解析声明式 API 之 API 对象的奥秘。
在上一篇文章中,我为你详细讲解了 Kubernetes 声明式 API 的设计、特点,以及使用方式。
而在今天这篇文章中,我就来为你讲解一下 Kubernetes 声明式 API 的工作原理,以及如何利用这套 API 机制,在 Kubernetes 里添加自定义的 API 对象。
你可能一直就很好奇:当我把一个 YAML 文件提交给 Kubernetes 之后,它究竟是如何创建出一个 API 对象的呢?
这得从声明式 API 的设计谈起了。
在 Kubernetes 项目中,一个 API 对象在 Etcd 里的完整资源路径,是由:Group(API 组)、Version(API 版本)和 Resource(API 资源类型)三个部分组成的。
通过这样的结构,整个 Kubernetes 里的所有 API 对象,实际上就可以用如下的树形结构表示出来:
在这幅图中,你可以很清楚地看到 Kubernetes 里 API 对象的组织方式,其实是层层递进的。
比如,现在我要声明要创建一个 CronJob 对象,那么我的 YAML 文件的开始部分会这么写:
apiVersion: batch/v2alpha1
kind: CronJob
...
在这个 YAML 文件中,“CronJob”就是这个 API 对象的资源类型(Resource),“batch”就是它的组(Group),v2alpha1 就是它的版本(Version)。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入解析了Kubernetes声明式API的工作原理和CRD机制,为读者提供了全面的技术指导和实践参考。文章首先介绍了Kubernetes声明式API对象在Etcd中的资源路径构成,以及API对象的组织方式。接着详细解释了Kubernetes是如何解析API对象的组、版本和资源类型,并通过流程图展示了创建API对象的过程。随后,文章介绍了CRD(Custom Resource Definition)的作用和使用方法,以及如何让Kubernetes认识和处理自定义API资源类型的YAML文件。最后,文章以一个实际的例子展示了如何创建自定义API资源类型,并提供了相关的代码示例。通过自动生成代码和创建自定义API对象的实例操作,读者可以深入了解Kubernetes声明式API的工作原理和CRD机制。整体而言,本文内容涵盖了Kubernetes声明式API对象的组织结构、CRD的使用方法以及自定义API资源类型的创建过程,为读者提供了深入的技术指导和实践示例。文章内容丰富,适合对Kubernetes声明式API和CRD机制感兴趣的读者阅读学习。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入剖析 Kubernetes》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(68)

  • 最新
  • 精选
  • 北卡
    运维人员会心碎? 我是运维人员,此刻看完我感到很兴奋。

    作者回复: 没错。我觉得这部分才是运维最喜欢的。谁不喜欢写代码呢?

    2018-10-18
    3
    72
  • 千寻
    我从代码开始,就按着步骤走,最后创建network的CRD和example-network都成功了, 但是我直接将cdr/network.yml和example/example-network.yml文件单独拿出来,并没有执行代码生成那些步骤,发现也创建成功了,搞得有点懵。 老师可以说一下这大概是什么回事吗?

    作者回复: 因为生成的代码是给下一篇写控制器代码用的,哈哈

    2018-10-17
    7
    30
  • 虎虎❤️
    好好好。之前学习过这些内容,但是很不系统,只是大概知道怎么回事,很多细节没有穿起来。跟老师比起来,我太不善于总结了。 磊哥大神,等我把你的课都学会了,能跟着你干吗? 另外我看到有人问需要把代码重新编译进k8s中么?不需要。作为插件应该是可以热插拔的。比如service catalog,flannel,都不要求你重启k8s。 在k8s里定义了你的CR后,controller可以作为一个container跑在k8s集群里,来响应CR的增删改。

    作者回复: 当然!

    2018-10-17
    3
    15
  • 骨汤鸡蛋面
    自定义resource的Controller 单独运行,只是通过client-go 与api 交互? 是否可以认为,k8s内建的Resource 对应的Controller,由Controller-manager 统一管理呢?

    作者回复: 对的,内置和外挂的区别

    2019-01-05
    11
  • Pixar
    有一个问题张老师,一直不是特别清楚… 通过 crd 创建的自定义资源我还并没有定义他的结构,为什么就可以通过 kubectl get 拿到这个资源的详情呢?

    作者回复: 你提交了一个CR yaml了不是?反正是存在etcd里,给你返回即可。不过kubernetes 并不懂字段的意思。

    2018-10-23
    10
  • swordholder
    register.go会将自定义Type注册到APIServer,那register.go本身是怎么交给APIServer,然后被APIServer调用注册过程的? $ kubectl apply -f crd/network.yaml $ kubectl apply -f example/example-network.yaml 执行完这两步,自定义的Newwork对象被创建出来,怎么感觉register.go并没有被用到

    作者回复: 因为你还没有调用生成的client,register.go是客户端用来进行初始化的代码的一部分。你这两步做完,服务端已经知道这个crd了,客户端也得有办法知道啊。

    2018-10-18
    4
    7
  • 圣诞使者
    老师,我照着你的代码敲了一遍,这个pkg/signals目录是自己创建的吗?我这个生成完代码也没有这个目录。

    作者回复: 这是个自己的帮助库

    2018-10-22
    4
  • Joe Black
    这章会让运维人员心碎的...幸好俺会Go语言! 请教下这个生成的代码,还得合并到apiserver的代码树中吧?还是得重新编译apiserver吧?毕竟Go目前还没有动态加载机制。

    作者回复: 当然不需要。你就按文章里的步骤来就全妥了。

    2018-10-17
    2
    3
  • swordholder
    怎么感觉register.go没有用到,它是什么时机把自定义Type注册到APIServer的?

    作者回复: 你仔细看一下apiserver那张图?

    2018-10-17
    1
  • mgxian
    请问老师 通过那个CustomResourceDefinition相关的ymal文件已经可以正常定义查看crd了 为什么还需要写相关的go代码呢?生成的clients又是给谁用的呢?

    作者回复: 当然是给下一篇写controller用的

    2018-10-17
    1
收起评论
显示
设置
留言
68
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部