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.7TRP(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux vma,内存管理 – Linux内核API find_vma

find_vma函数功能描述&#xff1a;find_vma( )函数根据一个属于某个进程的虚拟地址&#xff0c;找到其所属的进程虚拟区间&#xff0c;并返回相应的vma_area_struct结构体指针。find_vma文件包含#includefind_vma函数定义在内核源码中的位置&#xff1a;linux-3.19.3/mm/mmap.c…

医疗:pacs(3)

1简介2简要介绍3主要优点4现状5趋势6标准化进程 1简介 PACS系统是Picture Archiving and Communication Systems的缩写&#xff0c;意为影像归档和通信系统。它是应用在医院影像科室的系统&#xff0c;主要的任务就是把日常产生的各种医学影像&#xff08;包括核磁&#xff0c…

SSM项目中整合WebService

先了解一下WebService的一些相关术语吧&#xff1a; WebService&#xff1a;WebService是一种跨编程语言和跨操作系统平台的远程调用技术。 WSDL(web service definition language)&#xff1a;WSDL是webservice定义语言, 对应.wsdl文档, 一个webservice会对应一个唯一的wsdl文…

搭载鸿蒙的油烟机,华为、美的合作:搭载鸿蒙系统的家电来了 三大亮点

日前&#xff0c;美的与华为在智能家居行业又有大动作&#xff1a;双方将在2021年实现合作规模化&#xff0c;从运营和营销角度开展更多联合合作。美的鸿蒙新家电亮点包括&#xff1a;第一是极速配网&#xff0c;只要用手机碰一碰&#xff0c;基于WiFi Aware配网协议即可实现设…

医疗:CIS(4)

1临床信息系统 HIS是以事务管理为主要内容&#xff0c;它的功能明确&#xff0c;数据易于结构化&#xff0c;其采集、处理方法简单而固定。例如患者的医疗费用管理&#xff0c;药品的库存、发放管理&#xff0c;人事档案管理。 CIS以医疗过程为主要内容&#xff0c;而医疗过程…

BZOJ 5394 [Ynoi2016]炸脖龙 (线段树+拓展欧拉定理)

题目大意&#xff1a;给你一个序列&#xff0c;需要支持区间修改&#xff0c;以及查询一段区间$a_{i}^{a_{i1}^{a_{i2}...}}mod\;p$的值&#xff0c;每次询问的$p$的值不同 对于区间修改&#xff0c;由线段树完成&#xff0c;没什么好说的 对于查询&#xff0c;利用"上帝与…

excel android 公式,两个超实用的Excel万能公式,瞬间提升你10倍工作效率!

相信大家在平时的工作中&#xff0c;都会经常有用到公式的需要&#xff0c;但是下面这些公式你用过吗&#xff0c;今天小编就带大家一起看看吧&#xff01;1. SUM函数这个函数不仅在我们学习的过程中会用到&#xff0c;即便到了工作后&#xff0c;也经常需要对各种数据进行处理…

医疗:EMR(5)

电子病历&#xff08;EMR,Electronic Medical Record&#xff09;&#xff0c;也叫计算机化的病案系统或称基于计算机的病人记录&#xff08;CPR,Computer-Based Patient Record&#xff09;。它是用电子设备&#xff08;计算机、健康卡等&#xff09;保存、管理、传输和重现的…

Linux中常用命令(文件与目录)

1、pwd 查看当前目录&#xff08;Print Working Directory&#xff09;2、cd 切换工作目录&#xff08;Change Directory&#xff09;&#xff08;1&#xff09;格式&#xff1a;cd [目录位置]特殊目录&#xff1a;.当前目录..上一级目录~用户主目录-上个工作目录&#xff08;2…

计算机操作系统(1):OS的作用和目标

OS的目标和作用 操作系统&#xff08;Operating System , OS&#xff09;是计算机硬件上的第一层软件&#xff0c;是计算机必须配置的最基本、最重要的系统软件。 1.1.1 OS的目标 有效性 方便性 可扩展性 开放性 1&#xff0e;有效性(早期OS的主要目标) 有效提高CPU和…

android p 权限控制,android 权限控制

android6 的权限分为几个级别&#xff0c;普通的第三方应用一般会用到 normal dangerous 。系统应用可能会用到 signature|system signature|privileged signature,详细的信息在Manifest中定义vim frameworks/base/core/res/AndroidManifest.xml其中&#xff0c;只有定义为dang…

计算机操作系统(2):OS的发展过程

1.2 OS的发展过程 20世纪50年代中期&#xff0c;第一个简单的批处理系统 60年代中期&#xff0c;多道程序批处理系统&#xff0c;随后出现分时系统 上世纪80年代开始至21世纪初&#xff0c;微型机、多处理机、计算机网络大发展年代→微机OS、多处理机OS和网络OS的形成和大发展…

创建好centos7虚拟机之后连xshell连不上虚机

创建好虚拟机之后配置都已经配置完成了selinux&#xff0c;防火墙都关了准备用xshell 连接虚拟机报出 然后在网上着了各种资料还是不行&#xff0c;最后将网卡修改为&#xff1a; 修改之后就可以连上了。 当然修改之后会出现两个ip 必须得使用圈起来的ip连才可以&#xff0c;用…

android滑动开关框架,Android之实现滑动开关组件

由于Android并未提供滑动开关之类的组件&#xff0c;所以我们需要自己去实现一个自定义的视图组件来实现滑动开关效果。这里有一个示例代码&#xff0c;它包括三个类&#xff1a;开关组件视图、状态监听接口、MainActivity我们先来看看整个demo的效果图&#xff1a;我们先来看看…

计算机操作系统(3):操作系统的基本特征

1.3 操作系统的基本特征 1.3.1 并发&#xff08;Concurrence&#xff09; 并行与并发&#xff1a; 并行性——两个或多个事件在同一时刻发生 并发性——两个或多个事件在同一时间间隔内发生 在多道程序环境下&#xff0c;并发性是指在一段时间内&#xff0c;宏观上有多…

最简单的docker教程:在docker里运行nginx服务器

命令行docker search nginx搜索名为nginx的docker image&#xff0c;返回结果的第一个&#xff0c;github上有10293个star&#xff0c;这就是我们想要搜索的结果&#xff1a; 使用命令docker pull把这个镜像拖下来&#xff1a; docker pull nginx 然后以detach模式运行这个镜像…

okhttp3 请求html页面,OkHttp3源码详解(二) 整体流程

1.简单使用同步&#xff1a;Override public Response execute() throws IOException {synchronized (this) {if (executed) throw new IllegalStateException("Already Executed");executed true;}try {client.dispatcher().executed(this);Response result getRe…

H5实现轮播

页面代码&#xff1a; <div id"body_wrapper" class"container"><article><section id"lunbotu"><div class"wrap"><div id"slide-holder"><div id"slide-runner"><a hre…

计算机操作系统(4):操作系统的重要功能

1.4 操作系统的主要功能 处理机管理功能 存储器管理功能 设备管理功能 文件管理功能 用户接口 1处理机管理功能 也可称为进程管理在传统的多道程序设计系统中&#xff0c;处理机的分配和运行&#xff0c;都是以进为基本单位的&#xff0c;因而对处理机的管理&#xff0…

html5本地存储论坛,Web Storage--HTML5本地存储

什么是Web StorageWeb Storage是HTML5里面引入的一个类似于cookie的本地存储功能&#xff0c;可以用于客户端的本地存储&#xff0c;其相对于cookie来说有以下几点优势&#xff1a;存储空间大&#xff1a;cookie只有4KB的存储空间&#xff0c;而Web Storage在官方建议中为每个网…