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

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

2.1.1      CRD介绍

 

1. 声明式 API

 

什么是声明式 API呢?首先我们需要了解在Kubernetes中,使用 Deployment、DamenSet,StatefulSet等资源来管理应用 Workload,使用 Service、Ingress等来管理应用的访问方式,使用 ConfigMapSecret 来管理应用配置。在集群中对这些资源的创建、更新、删除的动作都会被转换为事件(EventKubernetes    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的扩展资源。这种抽象的资源类型作自定义资源定义CRDCustom  Resource  DefinitionCRD为我们提供资源的速注册和使用的接口。其实在很早的k8s 版本中自定义资源就已经被提出,当时叫作TPRThirdPartyResource,这是与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  自定义字段在自定义对象中设置 CronTabCronTab类型来自上面创建的 CRD对象的规范,然后执行kubectleapply-fmy-crontab.yaml即可。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6月前
|
运维 监控 Cloud Native
【云故事探索】NO.17:国诚投顾的云原生 Serverless 实践
国诚投顾携手阿里云,依托Serverless架构实现技术全面升级,构建高弹性、智能化技术底座,提升业务稳定性与运行效率。通过云原生API网关、微服务治理与智能监控,实现流量精细化管理与系统可观测性增强,打造安全、敏捷的智能投顾平台,助力行业数字化变革。
【云故事探索】NO.17:国诚投顾的云原生 Serverless 实践
|
8月前
|
Kubernetes Cloud Native 安全
云原生机密计算新范式 PeerPods技术方案在阿里云上的落地和实践
PeerPods 技术价值已在阿里云实际场景中深度落地。
|
6月前
|
运维 监控 Cloud Native
【云故事探索】NO.17:国诚投顾的云原生 Serverless 实践
通过与阿里云深度合作,国诚投顾完成了从传统 ECS 架构向云原生 Serverless 架构的全面转型。新的技术架构不仅解决了原有系统在稳定性、弹性、运维效率等方面的痛点,还在成本控制、API 治理、可观测性、DevOps 自动化等方面实现了全方位升级。
|
8月前
|
Kubernetes Cloud Native 安全
云原生机密计算新范式 PeerPods 技术方案在阿里云上的落地和实践
PeerPods 技术价值已在阿里云实际场景中深度落地。
|
4月前
|
人工智能 Cloud Native 算法
拔俗云原生 AI 临床大数据平台:赋能医学科研的开发者实践
AI临床大数据科研平台依托阿里云、腾讯云,打通医疗数据孤岛,提供从数据治理到模型落地的全链路支持。通过联邦学习、弹性算力与安全合规技术,实现跨机构协作与高效训练,助力开发者提升科研效率,推动医学AI创新落地。(238字)
310 7
|
10月前
|
运维 Cloud Native 测试技术
极氪汽车云原生架构落地实践
随着极氪数字业务的飞速发展,背后的 IT 技术也在不断更新迭代。极氪极为重视客户对服务的体验,并将系统稳定性、业务功能的迭代效率、问题的快速定位和解决视为构建核心竞争力的基石。
|
6月前
|
弹性计算 运维 Cloud Native
【云故事探索】NO.17:国诚投顾的云原生Serverless实践
简介: 通过与阿里云深度合作,国诚投顾完成了从传统 ECS 架构向云原生 Serverless 架构的全面转型。新的技术架构不仅解决了原有系统在稳定性、弹性、运维效率等方面的痛点,还在成本控制、API 治理、可观测性、DevOps 自动化等方面实现了全方位升级。
178 1
|
5月前
|
存储 弹性计算 Cloud Native
云原生数据库的演进与应用实践
随着企业业务扩展,传统数据库难以应对高并发与弹性需求。云原生数据库应运而生,具备计算存储分离、弹性伸缩、高可用等核心特性,广泛应用于电商、金融、物联网等场景。阿里云PolarDB、Lindorm等产品已形成完善生态,助力企业高效处理数据。未来,AI驱动、Serverless与多云兼容将推动其进一步发展。
271 8
|
7月前
|
Cloud Native 中间件 调度
云原生信息提取系统:容器化流程与CI/CD集成实践
本文介绍如何通过工程化手段解决数据提取任务中的稳定性与部署难题。结合 Scrapy、Docker、代理中间件与 CI/CD 工具,构建可自动运行、持续迭代的云原生信息提取系统,实现结构化数据采集与标准化交付。
379 1
云原生信息提取系统:容器化流程与CI/CD集成实践

热门文章

最新文章