带你读《云原生应用开发 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即可。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
13天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
55 2
|
16天前
|
监控 Kubernetes Cloud Native
云原生之旅:从理论到实践的探索
【10月更文挑战第34天】本文将引导你走进云原生的世界,从基础概念出发,逐步深入到实际的应用部署。我们将探讨云原生技术如何改变现代软件开发和运维的方式,并展示通过一个简单应用的部署过程来具体理解服务编排、容器化以及自动化管理的实践意义。无论你是云原生技术的初学者还是希望深化理解的开发者,这篇文章都将为你提供有价值的视角和知识。
28 3
|
12天前
|
运维 Kubernetes Cloud Native
云原生技术入门及实践
【10月更文挑战第39天】在数字化浪潮的推动下,云原生技术应运而生,它不仅仅是一种技术趋势,更是企业数字化转型的关键。本文将带你走进云原生的世界,从基础概念到实际操作,一步步揭示云原生的魅力和价值。通过实例分析,我们将深入探讨如何利用云原生技术提升业务灵活性、降低成本并加速创新。无论你是云原生技术的初学者还是希望深化理解的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
2天前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
4天前
|
Cloud Native 安全 Docker
云原生技术在现代应用部署中的实践与思考
本文深入探讨了云原生技术如何在现代应用部署中发挥关键作用,并提供了具体的代码示例来展示其实现。通过分析云原生的核心概念和优势,我们将了解如何利用这些技术来提高应用的可扩展性、可靠性和安全性。文章还将讨论云原生技术的未来发展趋势,以及如何将其应用于实际项目中,以实现更高效和灵活的应用部署。
|
11天前
|
Cloud Native 安全 API
云原生架构下的微服务治理策略与实践####
—透过云原生的棱镜,探索微服务架构下的挑战与应对之道 本文旨在探讨云原生环境下,微服务架构所面临的关键挑战及有效的治理策略。随着云计算技术的深入发展,越来越多的企业选择采用云原生架构来构建和部署其应用程序,以期获得更高的灵活性、可扩展性和效率。然而,微服务架构的复杂性也带来了服务发现、负载均衡、故障恢复等一系列治理难题。本文将深入分析这些问题,并提出一套基于云原生技术栈的微服务治理框架,包括服务网格的应用、API网关的集成、以及动态配置管理等关键方面,旨在为企业实现高效、稳定的微服务架构提供参考路径。 ####
38 5
|
13天前
|
运维 Cloud Native 安全
云原生技术在现代软件开发中的实践与挑战####
【10月更文挑战第21天】 本文将深入探讨云原生技术在现代软件开发中的应用,分析其带来的优势及面临的挑战。通过案例分析和数据支持,揭示云原生化转型的关键因素,并展望未来发展趋势。 ####
33 7
|
12天前
|
负载均衡 监控 Cloud Native
云原生架构下的微服务治理策略与实践####
在数字化转型浪潮中,企业纷纷拥抱云计算,而云原生架构作为其核心技术支撑,正引领着一场深刻的技术变革。本文聚焦于云原生环境下微服务架构的治理策略与实践,探讨如何通过精细化的服务管理、动态的流量调度、高效的故障恢复机制以及持续的监控优化,构建弹性、可靠且易于维护的分布式系统。我们将深入剖析微服务治理的核心要素,结合具体案例,揭示其在提升系统稳定性、扩展性和敏捷性方面的关键作用,为读者提供一套切实可行的云原生微服务治理指南。 ####
|
12天前
|
消息中间件 缓存 Cloud Native
云原生架构下的性能优化实践与挑战####
随着企业数字化转型的加速,云原生架构以其高度解耦、弹性伸缩和快速迭代的特性,成为现代软件开发的首选模式。本文深入探讨了云原生环境下性能优化的关键策略与面临的主要挑战,通过案例分析,揭示了如何有效利用容器化、微服务、动态调度等技术手段提升应用性能,同时指出了在复杂云环境中确保系统稳定性和高效性的难题,为开发者和架构师提供了实战指南。 ####
27 3
|
13天前
|
运维 Kubernetes Cloud Native
深入理解云原生架构:从理论到实践
【10月更文挑战第38天】本文将引导读者深入探索云原生技术的核心概念,以及如何将这些概念应用于实际的软件开发和运维中。我们将从云原生的基本定义出发,逐步展开其背后的设计哲学、关键技术组件,并以一个具体的代码示例来演示云原生应用的构建过程。无论你是云原生技术的初学者,还是希望深化理解的开发者,这篇文章都将为你提供有价值的见解和实操指南。

热门文章

最新文章

下一篇
无影云桌面