带你读《云原生应用开发 Operator原理与实践》第二章 Operator 原理2.1(二)-阿里云开发者社区

开发者社区> 人民邮电出版社> 正文

带你读《云原生应用开发 Operator原理与实践》第二章 Operator 原理2.1(二)

简介: 带你读《云原生应用开发 Operator原理与实践》第二章 Operator 原理2.1(二)
+关注继续查看

2.1.1      CRD介绍

 

1. 声明式 API

 

什么是声明式 API呢?首先我们需要了解在Kubernetes中,使用 Deployment、DamenSet,StatefulSet等资源来管理应用 Workload,使用 Service、Ingress等来管理应用的访问方式,使用 ConfigMap和 Secret 来管理应用配置。在集群中对这些资源的创建、更新、删除的动作都会被转换为事件(Event),Kubernetes 的 Controller Manager 负责监听这些事件并触发相应的任务来满足用户的期望。这种方式称为声明式,用户只需要关心应用程序的最终状态,其他的过程都通过   Kubernetes来完成,通过这种方式可以大大简化应用配置管理的复杂度。

声明式 API指的是用户提交一个定义好的 API 对象来描述所期望的状态。例如上面创建的Namespace 资源,这个资源类型表明用户期望的结果是创建一个名字为Nginx的命名空间。那么用户无须关心如何创建 Namespaces资源,只需要关注结果即可。

什么是过程式 API呢?过程式 API 一次只能处理一个写请求,否则可能会产生冲突,已不具备合并操作的能力 。

声明式 API的特点是允许有多个 API写端以 PATCH的方式对 API对象进行修改,而无须关心本地原始Yaml 文件的内容。声明式API才是Kubernetes 项目编排能力的核心。对于 API对象的增、删、改、查,可以在完全无须外界干预的情况下,完成对“实际状态”和“期望状态”的调谐(Reconcile)过程。这种调谐过程的实现者则是 Controller的处理逻辑。

当开发者对 Kubernetes 的使用逐渐增多之后,会发现这些默认的资源不足以支撑我们的系统,以 NginxIngress 为例,如果用户想要实现负载均衡限流器功能,目前 NiginxIngress 的配置不支持这样的特性,对于这种非通用的特性,Kubernetes提供了一种扩展性的支撑方式,即自定义资源。

典型地,声明式 API特点如下。

(1)你的 API 包含相对而言为数不多、尺寸较小的对象(资源)。

(2)对象定义了应用或者基础设施的配置信息。

(3)对象更新操作频率较低。

(4)通常需要人来读取或写入对象。

(5) 对象的主要操作是 CRUD风格的(创建、读取、更新和删除)。

(6) 不需要跨对象的事务支持:API 对象代表的是期望状态而非确切实际状态。命令式 API与声明式有所不同。 以下迹象表明你的 API可能不是声明式 API。

(1)客户端发出“做这个操作”的指令,之后在该操作结束时获得同步响应。

(2)客户端发出“做这个操作”的指令,并获得一个操作 ID,之后需要检查一个Operation对象来判断请求是否成功完成。

(3)将你的 API类比为 RPC

(4)需要较高的访问带宽(长期保持每秒数十个请求)。

(5)在对象上执行的常规操作并非是CRUD

(6) API 不太容易用对象来建模。

 

2. CRD场景

 

什么是 CRD呢?为什么要有 CRD资源呢?通过对下面内容的学习,大家会对 CRD有概念性的认识。首先   Kubernetes  为用户提供了丰富的资源,如资源对象、配置对象、存储对象和策略对象,如表 2-1所示。


 

表 2-1资源对象表

类别

名称

资源对象

Pod、ReplicaSet、Deployment、StatefulSet、DammonSet、Job、CronJob

配置对象

Node、Namespace、Service、ConfigMap、Ingress、Label

存储对象

Volume、Persistent Volume

策略对象

SecurityContext、ResourceQuota、LimitRange

 

虽然 Kubernetes 为我们提供了丰富的资源类型,但是在不同应用场景下,某些传统资源类型仍不能满足用户需求,他们对平台可能存在一些特殊的需求,为了满足这些需求,Kubernetes社区为我们提供了一种抽象Kubernetes的扩展资源。这种抽象的资源类型叫作自定义资源定义(CRD,Custom Resource Definition)。CRD为我们提供资源的快速注册和使用的接口。其实在很早的k8s 版本中自定义资源就已经被提出,当时叫作TPR(ThirdPartyResource),这是与CRD类似的概念,但是在1.9以上的版本中被弃用,而 CRD则进入 beta 状态。

(1)什么时候需要添加定制资源?

① 你希望使用 Kubernetes客户端库和 CLI 来创建和更改新的资源。

② 你希望 Kubectl 能够直接支持你的资源。

③ 你希望构造新的自动化机制,监测新对象的更新事件,并对其他对象执行 CRUD(增加、检索、更新、删除)操作,或者监测后者更新前者。

④ 你希望编写自动化组件来处理对对象的更新。

⑤ 你希望使用 KubernetesAPI对诸如 .spec、.status和 .metadata 等字段进行约定。

⑥ 你希望对象是对一组受控资源的抽象,或者对其他资源的归纳提炼。

(2)  如何定义一个 CRD?

我们通过代码清单 2-3中的 Yaml文件来创建一个 AppconfigCRD资源。

apiVersion:apiextensions.k8s.io/v1kind:CustomResourceDefinitionmetadata:

名称必须符合下⾯的格式 :<plural>.<group>

name:crontabs.stable.example.comspec:

# RESTAPI使⽤的组名称 :/apis/<group>/<version>

group:stable.example.com

# RESTAPI使⽤的版本号 :/apis/<group>/<version>versions:

-name:v1

可以通过served来开关每个版本

served:true

有且仅有⼀个版本开启存储

storage:trueschema:

openAPIV3Schema:

type:objectproperties:

spec:

type:objectproperties:

cronSpec:type:string

image:

type:stringreplicas:

type: integer# NamespacedCluster

scope:Namespacednames:

URL中使⽤的复数名称/apis/<group>/<version>/<plural>

plural:crontabs

CLI中使⽤的单数名称

singular:crontab

CamelCased格式的单数类型。在清单⽂件中使⽤

kind:CronTab

CLI中使⽤的资源简称

shortNames:


-ct

 

首先我们解释一下创建的 CRD 的参数。

① 第一行和第二行我们定义了 CRD的版本。

② metadata定义了访问的 CRD资源的名称,名称必须与下面的 spec字段匹配。

③ Spec.group 定义了资源属于什么组,这里我们定义成 stable.example.com。

④ Spec.versions 定义了资源存储的版本,这里定义为 v1。

⑤ scope定义了我们创建的资源的作用范围?这里定义成Namespace范围。

⑥ pluralsingular 定义了资源的单复数形式,这个根据实际情况命名即可。


我们执行 kubectlapply-fcrd.yaml就可以创建名称为 appconfig 的 CRD 资源了。同时我们定义的 CRD资源 RESTfulAPI将会定义成 /apis/stable.example.com/v1/namespaces/*/crontabs/。

(3)  如何创建一个CRD 实例对象?

首先定义一个符合上面CRD资源的apiVersion和资源类型(kind(见代码清单2-4)。

apiVersion:"stable.example.com/v1"kind:CronTab

metadata:

name:my-new-cron-objectspec:

cronSpec:"*****/5"

image:my-awesome-cron-image

 

创建 CRD对象后,可以创建自定义对象,自定义对象可包含自定义字段。这些字段可以包含任意  JSON。如代码清单2-4所示,cronSpec 和 image 自定义字段在自定义对象中设置 CronTab。CronTab类型来自上面创建的 CRD对象的规范,然后执行kubectleapply-fmy-crontab.yaml即可。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
带你读《中老年人学智能手机应用全攻略》之一:安全放心地使用手机
本书根据中老年人的学习特点,采用图文解说的形式进行讲解,清晰明了,并提供全程语音教学视频,非常适合想要用好智能手机的中老年人阅读。
1695 0
阿里巴巴的云原生与开发者 | 10月15号栖夜读
今天的首篇文章,讲述了 : 利用云原生技术构建应用简便快捷,部署应用轻松自如,运行应用按需伸缩。如今,云原生已经成为下一代技术发展的趋势。在 2019 杭州云栖大会开发者峰会上,阿里巴巴资深技术专家李响就为大家分享了阿里巴巴的云原生技术与开发者的那些故事。
2880 0
数十万应用结点全息监控,ARMS新上线的应用监控神器到底有多牛?
就在不久前,2017年阿里双11刚刚创下电商史上的新销售奇迹,24小时交易金额达1682亿,每秒交易创建峰值325000,每秒支付峰值256000!在这个海量交易背后是数十万个结点规模的应用的高效运行。
6685 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
7751 0
extjs desktop 应用项目:教学资源库云平台
采用extjs desktop  界面截图网址: http://www.linbsoft.com/LinBSoft/zykpreview/ demo网址: http://demo.
950 0
Elasticsearch Top5典型应用场景
题记 刚接触Elasticsearch的朋友,或多或少会遇到一个问题,Elasticsearch在实际公司应用中除了搜索到底能做什么? 本文给出了答案。 除了“You Know, for Search”,Elasticsearch的使用会不断增长和变化。ObjectRocket作为一家托管云计算公司,已经在ObjectRocket平台上提供托管Elasticsearch一段时间了,并且能够看到我们客户之间的一些明确趋势以及他们如何使用该产品。以下是我们在平台上看到的Top5场景用例:
8 0
472
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载