kubernetes1.9管中窥豹-CRD概念、使用场景及实例
欢迎访问网易云社区,了解更多网易技术产品运营经验。
前言
默认读者有kubernetes基础概念的背景知识,因此基础概念例如有状态、pod、Replica Sets、Deployments、statefulsets等不在此文详细阐述。 可以看我之前的一些关于kubernetes的文章:
kubernetes 1.3管中窥豹- RS(Replica Sets)
kubernetes pod&container生命周期浅析
kubernetes1.6管中窥豹-StatefulSets概念、约束、原理及实例
本文主要介绍一个1.7+以后出现的新概念CRD(CustomResourceDefinition )的概念、使用场景及实例。
CRD历史来源 | |
---|---|
k8s1.6~1.7 | TRP(CRD的前身):Third Party Resource。 |
k8s1.7+ | CRD: Custom Resource Definition。 |
CRD的概念
Custom resources:是对K8S API的扩展,代表了一个特定的kubetnetes的定制化安装。在一个运行中的集群中,自定义资源可以动态注册到集群中。注册完毕以后,用户可以通过kubelet创建和访问这个自定义的对象,类似于操作pod一样。
Custom controllers:Custom resources可以让用户简单的存储和获取结构化数据。只有结合控制器才能变成一个真正的declarative API(被声明过的API)。控制器可以把资源更新成用户想要的状态,并且通过一系列操作维护和变更状态。定制化控制器是用户可以在运行中的集群内部署和更新的一个控制器,它独立于集群本身的生命周期。 定制化控制器可以和任何一种资源一起工作,当和定制化资源结合使用时尤其有效。
Operator模式 是一个customer controllers和Custom resources结合的例子。它可以允许开发者将特殊应用编码至kubernetes的扩展API内。
如何添加一个Custom resources到我的kubernetes集群呢? kubernetes提供了两种方式将Custom resources添加到集群。
1. Custom Resource Definitions (CRDs):更易用、不需要编码。但是缺乏灵活性。
2. API Aggregation:需要编码,允许通过聚合层的方式提供更加定制化的实现。
本文重点讲解Custom Resource Definitions (CRD)的使用方法。
CRD使用场景
假设需要在原生kubernetes完成一些额外的功能开发,而且想使用restful风格的API 去调用这个功能。比如像开发容器保存镜像或者重启镜像等操作(一般都通过命令发送给容器内部完成)。就可以在原生kubernetes上增加一个CRD,命名为task。通过task触发一些逻辑。当使用apiserver下发这个task创建时,Custom controllers watch到这个task就开始处理相关业务逻辑,然后通过agent调用docker命令完成容器保存镜像功能并且重启容器。当Custom controllers watch到pod重新运行的时候,本次操作完成。 流程图如下:
CRD使用示例
如果想要完成上述场景的功能,需要定义一个CRD,并且创建出来。 举例如下,以下是一个可以在1.9集群环境中创建成功的crd yaml文件。
apiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata:# name must match the spec fields below, and be in the form: <plural>.<group> name: tasks.163yun.comspec:# group name to use for REST API: /apis/<group>/<version> group: 163yun.com# version name to use for REST API: /apis/<group>/<version> version: v1# either Namespaced or Cluster scope: Namespaced names:# plural name to be used in the URL: /apis/<group>/<version>/<plural> plural: tasks# singular name to be used as an alias on the CLI and for display singular: task# kind is normally the CamelCased singular type. Your resource manifests use this. kind: Task# shortNames allow shorter string to match your resource on the CLI shortNames:- task
其中几个关键要素是name、group、scope以及names里面的一些定义。
name:用于定义CRD的名字,后缀需要跟group一致,例如tasks.163yun.com,前缀需要跟names中的plural一致。
group以及version用于标识restAPI:即/apis//。 上文中的接口前面一部分就是/apis/163yun.com/v1
scope: 表明作用于,可以是基于namespace的,也可以是基于集群的。 如果是基于namespace的。则API格式为:/apis/{group}/v1/namespaces/{namespace}/{spec.names.plural}/… 如果是基于cluster的。则API格式为:/apis/{group}/v1/{spec.names.plural}/… 上文创建的CRD的API则为:/apis/163yun.com/v1/namespaces/{namespace}/tasks
names:描述了一些自定义资源的名字以及类型的名字(重点是plural定义以及kind定义,因为会在url或者查询资源中用的到)。
当以上面的模板创建出来一个CRD后,可以查到crd的信息:
root@hzyq-k8s-qa-16-master:~/cxq# kubectl get CustomResourceDefinition tasks.163yun.com -o yaml apiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata: creationTimestamp: 2018-03-16T06:17:03Z generation: 1 name: tasks.163yun.com resourceVersion: "35442027" selfLink: /apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions/tasks.163yun.com uid: a538030c-28e1-11e8-b047-fa163ef9812dspec: group: 163yun.com names: kind: Task listKind: TaskList plural: tasks shortNames:- task singular: task scope: Namespaced version: v1status: acceptedNames: kind: Task listKind: TaskList plural: tasks shortNames:- task singular: task conditions:- lastTransitionTime: 2018-03-16T06:17:03Z message: no conflicts found reason: NoConflicts status: "True" type: NamesAccepted- lastTransitionTime: 2018-03-16T06:17:03Z message: the initial names have been accepted reason: InitialNamesAccepted status: "True" type: Established
这时查询crd中定义的task类型的资源,是空的:
root@hzyq-k8s-qa-16-master:~/cxq# kubectl get task -o yaml apiVersion: v1items: []kind: Listmetadata: resourceVersion: "" selfLink: ""
这时需要自定义一个task类型的模板,创建,以使得task可以触发自定义的一些事件
root@hzyq-k8s-qa-16-master:~/cxq# cat cxq-task.yaml apiVersion: "163yun.com/v1"kind: Taskmetadata: name: cxq-nce-taskspec: cronSpec: "* * * * /5" image: my-awesome-cron-image root@hzyq-k8s-qa-16-master:~/cxq# kubectl create -f cxq-task.yaml task "cxq-nce-task" created root@hzyq-k8s-qa-16-master:~/cxq# kubectl get task -o yamlapiVersion: v1items:- apiVersion: 163yun.com/v1 kind: Task metadata: clusterName: "" creationTimestamp: 2018-03-16T06:43:10Z labels: {} name: cxq-nce-task namespace: default resourceVersion: "35444352" selfLink: /apis/163yun.com/v1/namespaces/default/tasks/cxq-nce-task uid: 4ad237aa-28e5-11e8-b047-fa163ef9812d spec: cronSpec: '* * * * /5' image: my-awesome-cron-imagekind: Listmetadata: resourceVersion: "" selfLink: ""
注意由于CRD和自定义的Task资源本身是namespace无关的,因此对所有namespace都可见。如果指定了scope为namespace。那么创建的自定义task也需要指定namespace,如果不指定的话,系统会自动将task分配到default 的namespace下。
这时可以通过task的url去对自定义的task资源进行操作,或者watch。结合上一节的流程图来完成实现自定义功能的目的。以下是调用watch接口对task资源进行长连接监控(变化)。
root@hzyq-k8s-qa-16-master:~/cxq# curl http://10.180.156.79:8080/apis/163yun.com/v1/namespaces/default/tasks?watch=true {"type":"ADDED","object":{"apiVersion":"163yun.com/v1","kind":"Task","metadata":{"clusterName":"","creationTimestamp":"2018-03-16T06:43:10Z","labels":{},"name":"cxq-nce-task","namespace":"default","resourceVersion":"35444352","selfLink":"/apis/163yun.com/v1/namespaces/default/tasks/cxq-nce-task","uid":"4ad237aa-28e5-11e8-b047-fa163ef9812d"},"spec":{"cronSpec":"* * * * /5","image":"my-awesome-cron-image"}}}
总结
CRD提供了一种无须编码就可以扩展原生kubenetes API接口的方式。很适合在云应用中扩展kubernetes的自定义接口和功能。在一些无须太多定制和灵活的开发场景下,CRD的方式已经足够使用。如果想更为灵活的添加逻辑就需要参考API Aggregation的使用了。
网易云容器服务为用户提供了无服务器容器,让企业能够快速部署业务,轻松运维服务。容器服务支持弹性伸缩、垂直扩容、灰度升级、服务发现、服务编排、错误恢复及性能监测等功能。点击免费试用
相关阅读:浅谈 kubernetes service 那些事(上篇)
浅谈 kubernetes service 那些事 (下篇)
本文来自网易实践者社区,经作者崔晓晴授权发布。
相关文章:
【推荐】 聊一聊整车厂的那些事——售后配件业务
【推荐】 演讲实录!谷得技术总监陈镇洪教你打造游戏研发流水线
【推荐】 知物由学 | 见招拆招,Android应用破解及防护秘籍
转载于:https://www.cnblogs.com/zyfd/p/10000945.html
kubernetes1.9管中窥豹-CRD概念、使用场景及实例相关推荐
- 【贪玩巴斯】Unity3D初学圣经(三)—— unity中的基础概念——scene场景,component组件,assets文件夹和Material材质,Mesh Renderer与shader
[贪玩巴斯]Unity3D初学圣经 三-- unity中的基础概念--scene场景,component组件与assets文件夹和Material材质以及Mesh Renderer 和 shader ...
- redis应用场景及实例
redis应用场景及实例 前言 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.在这篇文章中,我们将阐述 Re ...
- Python面向对象-概念、类、实例
Python面向对象-概念.类.实例 OOP--Object Oriented Programming,面向对象编程,是一种程序设计思想.该思想将对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...
- Git的基本概念/常用命令及实例
Git的基本概念/常用命令及实例 什么是仓库 在 Git 的概念中,仓库,就是你存在.git目录的那个文件夹内的所有文件,包括隐藏的文件,Git程序会再当前目录以及上级目录查找是否存在.git文件,如 ...
- Redis项目应用场景与实例(三):队列(List)
文章目录 一.背景 二.项目需求 三.环境配置 四.项目代码 4.1 Redis工具类增加队列操作方法 4.2 图片上传服务增加Redis队列 五.测试与验证 六.源码 一.背景 在前两篇文章 < ...
- Unity 3D 环境特效||Unity 3D 游戏场景设计实例
Unity 3D 环境特效 一般情况下,要在游戏场景中添加雾特效和水特效较为困难,因为需要开发人员懂得着色器语言且能够熟练地使用它进行编程. Unity 3D 游戏开发引擎为了能够简单地还原真实世界中 ...
- 【设计模式】适配器模式 ( 概念 | 适用场景 | 优缺点 | 外观模式对比 | 适配器模式相关角色 | 类适配器 | 对象适配器 | 实现流程 )
文章目录 I . 适配器模式概念 II . 适配器模式 适用场景 III . 适配器模式 优缺点 IV . 适配器模式 与 外观模式对比 V . 适配器模式 相关角色 ( 重点 ) VI . 适配器模 ...
- 【设计模式】装饰者模式 ( 概念 | 适用场景 | 优缺点 | 与继承对比 | 定义流程 | 运行机制 | 案例分析 )
文章目录 I . 装饰者模式概念 II . 装饰者模式适用场景 III . 装饰者模式优缺点 IV . 装饰者模式与继承对比 V . 装饰者模式相关设计模式 VI . 装饰者模式四个相关类 VII . ...
- 从大数据+AI 谈谈概念与场景
前端时间跟朋友吐槽,吹牛逼,我说我生不逢时啊. 2005年,在百度做数据分析,商业数据,搜索数据,社交产品数据,联盟数据,客户端数据,各种数据反正都拿来搞每天处理几亿条日志吧,自己写代码,搞几台服务器 ...
最新文章
- jQuery $.post $.ajax用法
- Quartus II 15.0详细安装步骤
- VQEG(视频质量专家组)
- datagridview滚动条自动滚动_掘金上摸鱼的新发现,无限滚动(infinitescroll)
- 什么是 css,关于css是什么
- linux 监控键盘,如何在Linux中使用“LogKeys”监视键盘敲键
- 在 Vs2013中查看类的内部布局
- tensorflow 版本列表_最新|谷歌发布TensorFlow 1.3.0版本,都更新了哪些内容?
- mac os x 10.11 php7,mac osx 10.11.2安装PHP7提示“configure: error: libcrypto not found!”
- 最近面试 Java 后端开发的感受!现在的环境太。。。
- 精选|2018年8月R新包推荐
- roboware studio教程_Roboware 常见操作和问题
- 【obs-studio开源项目从入门到放弃】windows 窗口采集和桌面采集的解决方案
- 申请 app store 退款
- 【已解决】python 使用xlrd,xlwt 修改execl单元格的背景色
- 如何将kindle上的书导出成epub格式
- 如何修改word2016模板
- 修改C盘用户的中文名为英文名
- Redis( 缓存篇 ==> 互斥锁解决缓存击穿
- 抖音商务团队三面java_腾讯抖音iOS岗位三面面经
热门文章
- USB连接TF卡 SD卡硬件电路
- h5 nan_h5页面在不同ios设备上的问题总结
- Xpath语法学习记录
- Day 14 20190129 老男孩python学习第14天 内容整理
- DCF:A Dataflow-Based Collaborative Filtering Trainging Algorithm
- 重构指南 - 引入参数对象(Introduce Parameter Object)
- c++11 lambda
- [转]Eclipse Java注释模板设置详解
- sublime text3下BracketHighlighter的配置方法
- javascript 获取上一页的url