K8s: Kubernetes扩展之自定义资源

自定义资源

  • 自定义资源是 K8s 的扩展,有时候需要对K8s进行一个扩展
  • 在默认的K8s集群里面提供的资源对象是一个有限的集合
  • 比如常用的pod, deployment, service,这些都是K8s原生的资源
  • 之所以它资源,是因为它能够对外提供API接口变成一个resource进行访问
  • 通过 kubectl 创建,也能把这些资源创建出来
  • 当有限的K8s的资源,不能满足你的需求的情况下
  • 就需要通过 Custom Resource 来实现自定义的这个资源
  • 实现了自定义资源之后,就可以使用 kubectl 来访问和创建其中的对象
  • 为什么需要有这个应用场景
    • 比如K8s提供了这个job类型的这个资源
    • 它能够去按照这个任务的一次性的任务的方式去执行或者多次任务去执行某一个任务
    • 它是没有提供一个 CronJob,类似于这样的一个定时任务的这么一个资源对象
    • 那么在这个时候就需要我们自行来扩展K8s对象
    • 自己去创建一个叫 CustomerResource 这种类型的资源,去满足我们自己的业务需求
    • 所以, 这样的业务需求,在企业落地开发的时候是非常常见的
  • 什么时候应该使用自定义资源
    • 你希望使用 K8s 客户端库和 CLI 来创建和更改新的资源
    • 你希望 kubectl 能够直接支持你的资源;例如,kubectl get my-object object-name
    • 你希望构造新的自动化机制,监测新对象上的更新事件
    • 并对其他对象执行 CRUD 操作,或者监测后者更新前者
    • 你希望编写自动化组件来处理对对象的更新
    • 你希望使用 K8s API 对诸如 .spec、.status 和 .metadata 等字段的约定
    • 你希望对象是对一组受控资源的抽象,或者对其他资源的归纳提炼
  • 这个看起来似乎有些像 ConfigMap, 我们来看下何时使用 ConfigMap
    • 存在一个已有的,文档完毕的配置文件格式约定,如 mysql.cnf 或 pom.xml
    • 你希望将整个配置文件放到某 configMap 中的一个主键下面
    • 配置文件的主要用途是针对运行在集群中 Pod 内的程序,供后者依据文件数据配置自身行为
    • 文件的使用者期望以 Pod 内文件或者 Pod 内环境变量的形式来使用文件数据, 而不是通过 K8s API
    • 你希望当文件被更新时通过类似 Deployment 之类的资源完成滚动更新操作

创建一个 CRD


1 )概述

  • 当你创建新的 CustomResourceDefinition(CRD)时
  • Kubernetes API 服务器会为你所指定的每一个版本生成一个 RESTful 的 资源路径
  • CRD 可以是命名空间作用域的,也可以是集群作用域的取决于 CRD 的 scope 字段设置
  • 和其他现有的内置对象一样,删除一个命名空间时,该命名空间下的所有定制对象也会被删除
  • CustomResourceDefinition 本身是不受命名空间限制的,对所有命名空间可用

2 )创建

  • $ vi rd-demo1.yaml
    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:name: crontabs.stable.example.com
    spec:group: stable.example.comversions:- name: v1# Each version can be enabled/disabled by Served flag.served: true# One and only one version must be marked as the storage version.storage: trueschema:openAPIV3Schema:type: objectproperties:spec:type: objectproperties:cronSpec:type: stringimage:type: stringpattern: '^(\d+|\*)(/\d+)?(\s+(\d+|\*)(/\d+)?){4}$' # 数据校验replicas:type: integerminimum: 1maximum: 10
    scope: Namespaced
    names:plural: crontabssingular: crontabkind: CronTabshortNames:- ct
    
  • 在这里面,它是基于这个 openAPIV3Schema 这个版本的schema去定义比如类型,属性
  • 相当于有一个类似于面向对象的这么一个定义方式描述这个对象应该长成什么样,有什么字段
  • 这里面值得一提的就是说在这个 scope 字段, 它的scope 可以被限定在 namespace 的这么一个范围
  • 也就是说,如果你scope设置了 namespace 之后, 当你删除某一个namespace名字空间的时候
  • 空间下所有的定制对象也会被删除, 如果你不定义的话,那个 custom resource 不受命名名间的限制
  • 在所有命名空间生效,这里声明一个名字叫 crontabs 的对象,这个版本的版本是 v1
  • group 是这个网站: stable.example.com, metadata 名称叫 crontabs.stable.example.com
  • schema 下的 cronSpec 就是定时任务的一个规范,可以输入一些正则表达式
  • 还定义了的镜像字段,副本数字段,有了这样的文件后,可进行创建
  • 可定制资源是通过OpenAPI v3模式定义来执行合法性检查的
  • 模式定义是在 CustomResourceDefinition 中设置的
  • 在下面的例子中, CustomResourceDefinition 对定制对象执行
  • 以下是合法性检查:
    • spec.cronSpec 必须是一个字符串,必须是正则表达式所描述的形式
    • spec.replicas 必须是一个整数,且其最小值为 1、最大值为 10
  • 执行 $ kubectl apply -f rd-demo1.yaml
    customresourcedefinition.apiextensions.k8s.io/crontabs.stable.example.com created
    
  • $ kubectl get crd 获取资源类型
    NAME                            CREATED AT
    crontabs.stable.example.com     2024-04-30T13:05
    
  • 现在定义好了资源,我们还要创建这个资源的对象
    • 在创建了 CustomResourceDefinition 对象之后
    • 你可以创建定制对象(Custom Objects)定制对象可以包含定制字段
    • 这些字段可以包含任意的 JSON 数据
    • 在下面的例子中,在类别为 CrontTab 的定制对象中,设置了cronSpec 和 image 定制字段
    • 类别 CronTab 来自你在上面所创建的 CRD 的规约
  • 创建对象 $ vi my-crontab.yaml
    apiVersion: "stable.example.com/v1"
    kind: CronTab
    metadata:name: my-new-cron-object
    spec:cronSpec: "* * * * */5"image: my-awesome-cron-image # 这个可以是任意的镜像
    
  • $ kubectl apply -f my-crontab.yaml
    crontabs.stable.example.com/my-new-cron-object created
    
  • $ kubectl get crontab 获取实例
    NAME                  AGE
    my-new-cron-object    8s
    
  • $ kubectl get crontab -o yaml 可以输出实例,可以看到很多细节
  • 所以通过简单的定义就发现,通过 K8s 我能自己实现一个 crontab 这么一个类型的一个任务
  • 然后有这个对象之后,就能实现 crontab 的这个命令
  • 这就是一个最简单的 chrome type 任务的一个定义
  • 有了这样的能力之后,对 K8s 进行一个很好的扩展

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

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

相关文章

Java-异常处理-定义三角形类Triangle和异常三角形IllegalTriangleException类 (1/2)

任意一个三角形,其任意两边之和大于第三边。当三角形的三条边不满足前述条件时,就表示发生了异常,将这种异常情况定义为IllegalTriangleException类。 自定义异常类IllegalTriangleException: 当三角形的三条边不满足条件&#x…

[随记]Mac安装Docker及运行开源Penpot

下载Docker Desktop for Mac:https://www.docker.com/products/docker-desktop/ 安装Docker Desktop for Mac,安装完成后,启动Docker,然后在终端输入: docker version 在Mac电脑的Desktop,随便创建一个文…

零代码编程:用通义千问免费批量翻译英文文档

首先,在阿里云的dashScope灵积模型服务中,申请一个API-key,有挺多免费token的。 然后,在通义千问中输入提示词: 你是一个Python编程专家,现在要完成一个编写基于qwen-turbo模型API和dashscope库的程序脚本…

UML图(总结)

一、静态建模 1、类图: 展现了一组对象、接口、协作和它们之间的关系。 2、对象图 展现了某一时刻一组对象以及它们之间的关系。 3、用例图 展现了用例、参与者(Action)以及它们之间的关系。 二、动态建模 1、序列图(顺序图,时序图) 描述了以…

Android Handler用法

Android Handler用法 为什么要设计Handler机制?Handler的用法1、创建Handler2、Handler通信2.1 sendMessage 方式2.2 post 方式 Handler常用方法1、延时执行2、周期执行 HandlerThread用法主线程-创建Handler子线程-创建Handler FAQMessage是如何创建主线程中Looper…

云端芳华、运维之美

今天,在我们享受互联网服务带来的便利与高效的同时,有一群人默默地在幕后为我们提供支持,他们就是云端运维人员。 值此五一国际劳动节来临之际,我们要真诚感谢他们辛勤的劳动和奉献!

vue2集成ElementUI编写登录页面

目录 1. 整理目录文件: a. app.vue文件如下: b. Login.vue文件如下: c. router/index.js文件如下: d. 删除components中的文件: e. 最终项目目录整理如下: 2. 集成ElementUI编写登录页面 a. 安装ElementUI: b. 在main.js

springcloud自定义全局异常

自行创建一个实体类 /*** 全局异常处理类**/ ControllerAdvice public class GlobalExceptionHandler {ExceptionHandler(Exception.class) ResponseBody public Result error(Exception e){e.printStackTrace(); return Result.fail();}/*** 自定义异常处理方法* param e * re…

MyBatis-plus笔记——分页插件

插件配置 插件配置类,拦截器添加PaginationInnerInterceptor Configuration MapperScan("com.zxb.mp.mapper") // 扫描指定mapper接口路径 public class MyBatisConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisP…

2023-2024年汽车行业报告/方案合集(精选345份)

汽车行业报告/方案(精选345份) 2023-2024年 来源:2023-2024年汽车行业报告/方案合集(精选345份) 【以下是资料目录】 2023中国汽车科技50强 2023中国智能汽车产业发展与展望 2023比亚迪海豹汽车拆解报告 2023新能…

unity制作app(3)--gps定位

1.unity中定位Unity之GPS定位(高德解析)_unity gps定位-CSDN博客 代码需要稍微修改一下,先把脚本绑到一个button上试一试! 2.先去高德地图认证(app定位) 创建应用和 Key-Web服务 API | 高德地图API (ama…

[C++基础学习]----03-程序流程结构之跳转语句详解

前言 在C程序中,跳转语句break和continue是两种用于控制程序流程的关键字,常用于循环语句(如for循环、while循环)中。 正文 01-简介 1、break关键字: 当程序执行到break语句时,会立即跳出当前所在的循环&…

C#知识|汇总方法重载与静态方法应用技巧

哈喽,你好,我是雷工! 今天学习C#方法重载与静态方法应用技巧的相关内容。 01 方法重载有什么好处? 1.1、可以有效的减少类的对外接口(只显示一个方法比较简洁),从而降低类的复杂度。 1.2、方便…

【Vue 2.x】学习vue之二组件

文章目录 Vue二组件第五章es6文件导入出1、导出export 组件(component)1、定义2、模块化与组件化3、组件的分类1、非单文件组件非单文件三步骤创建组件标准写法简化写法组件的嵌套非单文件的不足之处 2、单文件组件vue单文件组件的使用脚手架创建项目重点…

C++@vscode配置C++开发环境常见问题和实践经验

文章目录 abstractvscode配置C/C开发环境常见问题 FAQC/C共用一组tasks.json/launch.json文件?关于配置文件中的注释更快地编译运行调试时调用外部终端控制台二次编译失败问题编译多个源文件😊源文件组织 编译出的可执行文件名中文乱码😊修改tasks.json…

Django框架之视图层

一、三板斧的原理介绍 1、HttpResponse 在Django中,HttpResponse是一个类,用于构建HTTP响应并返回给客户端。当视图函数处理完请求后,需要返回一个响应时,就会使用HttpResponse对象。 (1)创建HttpRespon…

C语言随笔集

注意 strlen 和 sizeof 的区别 strlen计算的是第一个 ‘\0’ 前面的字符的个数sizeof计算的是占用的内存空间的大小只和定义时有关C语言中,输出double类型(双精度)和float(单精度)时, 编译器默认精确到小数点后六位输出 默认输出的是6位小数,不足6位,以0补齐,超过6位按…

leetcode1329--将矩阵按对角线排序

1. 题意 对角线排序 2. 题解 2.1 直接模拟 跟螺旋输出数组实际上有点像&#xff0c;这里需要枚举对角线数组的起始值。 class Solution { public:void sort_dia(int br, int bc, vector<vector<int>> &mat) {vector<int> tmp;int r mat.size();int…

Java解决除自身以外数组的乘积

Java解决除自身以外数组的乘积 01 题目 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 **不要…

数据库的嵌套查询(子查询),分组查询和统计查询—学生选课

学生选课数据库中的表的结构参考学生选课数据库的定义和维护 1.嵌套查询 1.1查询选修了数据库原理与应用课程的学生学号和姓名 SELECT sno 学号, sname 姓名 FROM student WHERE sno IN(SELECT snoFROM SCINNER JOIN Course c ON c.cno SC.cno AND c.cname 数据库原理与应…