深入剖析Kubernetes
张磊
Kubernetes社区资深成员与项目维护者
立即订阅
22647 人已学习
课程目录
已完结 56 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (5讲)
开篇词 | 打通“容器技术”的任督二脉
免费
01 | 预习篇 · 小鲸鱼大事记(一):初出茅庐
02 | 预习篇 · 小鲸鱼大事记(二):崭露头角
03 | 预习篇 · 小鲸鱼大事记(三):群雄并起
04 | 预习篇 · 小鲸鱼大事记(四):尘埃落定
容器技术概念入门篇 (5讲)
05 | 白话容器基础(一):从进程说开去
06 | 白话容器基础(二):隔离与限制
07 | 白话容器基础(三):深入理解容器镜像
08 | 白话容器基础(四):重新认识Docker容器
09 | 从容器到容器云:谈谈Kubernetes的本质
Kubernetes集群搭建与实践 (3讲)
10 | Kubernetes一键部署利器:kubeadm
11 | 从0到1:搭建一个完整的Kubernetes集群
12 | 牛刀小试:我的第一个容器化应用
容器编排与Kubernetes作业管理 (15讲)
13 | 为什么我们需要Pod?
14 | 深入解析Pod对象(一):基本概念
15 | 深入解析Pod对象(二):使用进阶
16 | 编排其实很简单:谈谈“控制器”模型
17 | 经典PaaS的记忆:作业副本与水平扩展
18 | 深入理解StatefulSet(一):拓扑状态
19 | 深入理解StatefulSet(二):存储状态
20 | 深入理解StatefulSet(三):有状态应用实践
21 | 容器化守护进程的意义:DaemonSet
22 | 撬动离线业务:Job与CronJob
23 | 声明式API与Kubernetes编程范式
24 | 深入解析声明式API(一):API对象的奥秘
25 | 深入解析声明式API(二):编写自定义控制器
26 | 基于角色的权限控制:RBAC
27 | 聪明的微创新:Operator工作原理解读
Kubernetes容器持久化存储 (4讲)
28 | PV、PVC、StorageClass,这些到底在说啥?
29 | PV、PVC体系是不是多此一举?从本地持久化卷谈起
30 | 编写自己的存储插件:FlexVolume与CSI
31 | 容器存储实践:CSI插件编写指南
Kubernetes容器网络 (8讲)
32 | 浅谈容器网络
33 | 深入解析容器跨主机网络
34 | Kubernetes网络模型与CNI网络插件
35 | 解读Kubernetes三层网络方案
36 | 为什么说Kubernetes只有soft multi-tenancy?
37 | 找到容器不容易:Service、DNS与服务发现
38 | 从外界连通Service与Service调试“三板斧”
39 | 谈谈Service与Ingress
Kubernetes作业调度与资源管理 (5讲)
40 | Kubernetes的资源模型与资源管理
41 | 十字路口上的Kubernetes默认调度器
42 | Kubernetes默认调度器调度策略解析
43 | Kubernetes默认调度器的优先级与抢占机制
44 | Kubernetes GPU管理与Device Plugin机制
Kubernetes容器运行时 (3讲)
45 | 幕后英雄:SIG-Node与CRI
46 | 解读 CRI 与 容器运行时
47 | 绝不仅仅是安全:Kata Containers 与 gVisor
Kubernetes容器监控与日志 (3讲)
48 | Prometheus、Metrics Server与Kubernetes监控体系
49 | Custom Metrics: 让Auto Scaling不再“食之无味”
50 | 让日志无处可逃:容器日志收集与管理
再谈开源与社区 (1讲)
51 | 谈谈Kubernetes开源社区和未来走向
答疑文章 (1讲)
52 | 答疑:在问题中解决问题,在思考中产生思考
特别放送 (1讲)
特别放送 | 2019 年,容器技术生态会发生些什么?
结束语 (1讲)
结束语 | Kubernetes:赢开发者赢天下
特别放送 | 云原生应用管理系列 (1讲)
基于 Kubernetes 的云原生应用管理,到底应该怎么做?
深入剖析Kubernetes
登录|注册

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

张磊 2018-10-17
你好,我是张磊。今天我和你分享的主题是:深入解析声明式 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入剖析Kubernetes》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(36)

  • 小明root
    我是运维人员,我很心碎.....我不会go语言
    2018-11-22
    17
  • 北卡
    运维人员会心碎?
    我是运维人员,此刻看完我感到很兴奋。

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

    2018-10-18
    17
  • 小金刚
    可以用 kubebuild 自动生成项目框架,添加自己的 CRD 并实现 controller 即可。
    2018-10-28
    7
  • 虎虎❤️
    一般来说,扩展api server (或者说添加自定义 resource )有两种方式:
    1. 通过创建CRDs, 主API server可以处理 CRDs 的 REST 请求(CRUD)和持久性存储。简单,不需要其他的编程。更适用于声明式的API,和kubernetes高度集成统一。
    2. API Aggregation, 一个独立的API server。主API server委托此独立的API server处理自定义resource。 需要编程,但能够更加灵活的控制API的行为,更加灵活的自定义存储,以及与API不同版本之间的转换。一般更适用于命令模式,或者复用已经存在REST API代码,不直接支持kubectl 和 k8s UI, 不支持scope resource in a cluster/namespace.

    自定义 resource 可以使你方便的存取结构化的resource 数据。但是只有和controller组合在一起才是声明式API。声明式API允许你定义一个期望的状态。controller通过解读结构化的resource数据,获得期望状态,从而不断的调协期望状态和实际状态。

    综上,今天文档中的types.go 应该是给controller来理解CRDs的schema用的。只有掌握了resource的schema,才能解释并得到用户创建的resource API object。
    而 kubectl create -f resourcedefinition.yaml 或者 自定义API server, 则定义了RESTful API endpoint. 用于接受 REST 请求,改变 resource 的期望状态。
    2018-10-17
    7
  • 千寻
    我从代码开始,就按着步骤走,最后创建network的CRD和example-network都成功了,
    但是我直接将cdr/network.yml和example/example-network.yml文件单独拿出来,并没有执行代码生成那些步骤,发现也创建成功了,搞得有点懵。
    老师可以说一下这大概是什么回事吗?

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

    2018-10-17
    7
  • Joe
    Generating deepcopy funcs
    F0110 15:05:38.168635 11946 deepcopy.go:866] Hit an unsupported type invalid type.

    按文档走了一半,报错~ 这个是什么问题呀?
    2019-01-10
    4
  • yuanlinios
    ./generate-groups.sh all "$ROOT_PACKAGE/pkg/client" "$ROOT_PACKAGE/pkg/apis" "$CUSTOM_RESOURCE_NAME:$CUSTOM_RESOURCE_VERSION"
    Generating deepcopy funcs
    F1228 01:11:20.543446 2908 deepcopy.go:866] Hit an unsupported type invalid type.
    2018-12-28
    4
  • 小宇宙
    用CRD来开发定义自主化的operator ,将有状态的应用自动化
    2018-10-17
    4
  • Vincen
    从kubernetes用户到kubernetes玩家成长中...
    2018-10-17
    3
  • 疯狂的小企鹅
    提示 Hit an unsupported type invalid type的同学,可以先安装下k8s.io/apimachinery包。应该是deepcopy找不到metav1.ObjectMeta和metav1.TypeMeta
    go get -u k8s.io/apimachinery
    2019-02-09
    2
  • Leon📷
    我是开发人员,会go,也会C++,也自己设计过业务协议,看到这篇异常兴奋
    2019-01-26
    2
  • 圣诞使者
    老师,我照着你的代码敲了一遍,这个pkg/signals目录是自己创建的吗?我这个生成完代码也没有这个目录。

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

    2018-10-22
    2
  • mazhen
    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
    2
  • 骨汤鸡蛋面
    自定义resource的Controller 单独运行,只是通过client-go 与api 交互? 是否可以认为,k8s内建的Resource 对应的Controller,由Controller-manager 统一管理呢?

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

    2019-01-05
    1
  • zz@zz
    报错 Generating deepcopy funcs
    F1109 16:09:50.592462 59073 main.go:81] Error: Failed executing generator: some packages had errors:
    type "vendor/k8s.io/apimachinery/pkg/runtime.Object" in k8s:deepcopy-gen:interfaces tag of type vendor/k8s.io/apimachinery/pkg/runtime.Object is not an interface, but: ""

    go get -u k8s.io/apimachinery 后好了
    2018-11-09
    1
  • 蜗牛
    有一个问题张老师,一直不是特别清楚… 通过 crd 创建的自定义资源我还并没有定义他的结构,为什么就可以通过 kubectl get 拿到这个资源的详情呢?

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

    2018-10-23
    1
  • 小伟
    老师好,作为一个运维,觉得你讲的内容好深,学得好吃力,不知能否分享一些实际生产环境的troubleshooting 的案例和思路?

    作者回复: 建议还是多实践这里讲解的内容

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

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

    2018-10-17
    1
  • Geek_260c9a
    没有弄明白生成这些代码和CRD可以被k8s 识别的必然联系。
    2019-10-20
  • tuyu
    老师你好, 问一下这个metav1是啥意思
    2019-09-26
收起评论
36
返回
顶部