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.com
      versions:
      - 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: true
        schema:
          openAPIV3Schema:
            type: object
            properties:
              spec:
                type: object
                properties:
                  cronSpec:
                    type: string
                  image:
                    type: string
                    pattern: '^(\d+|\*)(/\d+)?(\s+(\d+|\*)(/\d+)?){4}$' # 数据校验
                  replicas:
                    type: integer
                    minimum: 1
                    maximum: 10
    scope: Namespaced
    names:
      plural: crontabs
      singular: crontab
      kind: CronTab
      shortNames:
      - 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.mfbz.cn/a/586265.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vulnhub-DIGITALWORLD.LOCAL: VENGEANCE渗透

文章目录 前言1、靶机ip配置2、渗透目标3、渗透概括 开始实战一、信息获取二、smb下载线索三、制作字典四、爆破压缩包密码五、线索分析六、提权!!! Vulnhub靶机:DIGITALWORLD.LOCAL: VENGEANCE ( digitalworld.local: VENGEANCE …

chrome和drive安装包路径

Chrome for Testing availability (googlechromelabs.github.io) 下载Stable下面的包哈

【Leetcode每日一题】 分治 - 排序数组(难度⭐⭐)(69)

1. 题目解析 题目链接:912. 排序数组 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 归并排序(Merge Sort)是一种采用“分而治之”(Divide and Conquer)策略…

LLM之RAG实战(三十八)| RAG分块策略之语义分块

在RAG应用中,分块是非常重要的一个环节,常见的分块方法有如下几种: Fixed size chunkingRecursive ChunkingDocument Specific ChunkingSemantic Chunking a)Fixed size chunking:这是最常见、最直接的分块方法。我们…

C/C++基础语法练习 - 计算阶乘(新手推荐阅读✨)

题目链接:https://www.starrycoding.com/problem/160 题目描述 给定一个整数 n n n,输出阶乘 n ! n! n!。 输入格式 一个整数 n ( 1 ≤ n ≤ 20 ) n(1 \le n \le 20) n(1≤n≤20)。 输出格式 一个整数 n ! n! n!。 输入样例1 16输出样例1 20922…

树的中心 树形dp

#include<bits/stdc.h> using namespace std; int n; const int N 100005; // 无向边 int ne[N * 2], e[N * 2], idx; int h[N]; int vis[N];int ans 0x7fffffff;void add(int a, int b) {e[idx] b, ne[idx] h[a], h[a] idx; }int dfs(int u) { // 作为根节点vis[u]…

机器学习:基于Sklearn,使用随机森林分类器RandomForestClassifier检测信用卡欺诈

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

分享一份物联网 SAAS 平台架构设计

一、架构图**** 二、Nginx**** 用于做服务的反向代理。 三、网关**** PaaS平台所有服务统一入口&#xff0c;包含token鉴权功能。 四、开放平台**** 对第三方平台开放的服务入口。 五、MQTT**** MQTT用于设备消息通信、内部服务消息通信。 六、Netty**** Socket通信设…

IoTDB 入门教程①——时序数据库为什么选IoTDB ?

文章目录 一、前文二、性能排行第一三、完全开源四、数据文件TsFile五、乱序数据高写入六、其他七、参考 一、前文 IoTDB入门教程——导读 关注博主的同学都知道&#xff0c;博主在物联网领域深耕多年。 时序数据库&#xff0c;博主已经用过很多&#xff0c;从最早的InfluxDB&a…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-9.1-LED灯(模仿STM32驱动开发实验)

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

IDEA:Server‘s certificate is not trusted(服务器的证书不受信任)

IDEA&#xff1a;Server‘s certificate is not trusted&#xff08;服务器的证书不受信任&#xff09; 打开idea&#xff0c;发现一个莫名其妙的证书弹出来&#xff0c;还关不掉发现组织名是 Doctorcom LTD.百度了下 不知道是什么东西 这也不是下面这种破解了idea的情况 30069…

Ajax.

目录 1. 服务器相关的基础概念 1.1 服务器 1.2 客户端 1.3 服务器对外提供的资源 1.4 数据也是资源 1.5 资源与 URL 地址 1.6 什么是 Ajax 2. Ajax 的基础用法 2.1 POST 请求 2.2 GET 请求 2.3 DELETE 请求 2.4 PUT 请求 2.5 PATCH 请求 3. axios 3.1 axios 的基…

IoTDB 入门教程 问题篇①——内存不足导致datanode服务无法启动

文章目录 一、前文二、问题三、分析四、继续分析五、解决问题 一、前文 IoTDB入门教程——导读 二、问题 执行启动命令&#xff0c;但是datanode服务却无法启动&#xff0c;查询不到6667端口 bash sbin/start-standalone.sh 进而导致数据库连接也同样失败 [rootiZ2ze30dygwd6…

Go 语言(三)【面向对象编程】

1、OOP 首先&#xff0c;Go 语言并不是面向对象的语言&#xff0c;只是可以通过一些方法来模拟面向对象。 1.1、封装 Go 语言是通过结构体&#xff08;struct&#xff09;来实现封装的。 1.2、继承 继承主要由下面这三种方式实现&#xff1a; 1.2.1、嵌套匿名字段 //Add…

实操——使用uploadify插件(php版和Java版) 与 Dropzone.js插件分别实现附件上传

实操——使用uploadify插件&#xff08;php版和Java版&#xff09;与 Dropzone.js插件分别实现附件上传 1. 使用uploadify插件上传1.1 简介1.1.1 简介1.1.2 参考GitHub 1.2 后端PHP版本的uploadify1.2.1 下载项目的目录结构1.2.2 测试看界面效果1.2.3 附页面代码 和 PHP代码 1.…

ctfshow——SQL注入

文章目录 SQL注入基本流程普通SQL注入布尔盲注时间盲注报错注入——extractvalue()报错注入——updataxml()Sqlmap的用法 web 171——正常联合查询web 172——查看源代码、联合查询web 173——查看源代码、联合查询web 174——布尔盲注web 176web 177——过滤空格web 178——过…

LLM 构建Data Multi-Agents 赋能数据分析平台的实践之③:数据分析之二(大小模型协同)

一、概述 随着新一代信息技术在产业数字化中的应用&#xff0c;产生了大量多源多模态信息以及响应的信息处理模式&#xff0c;数据孤岛、模型林立的问题也随之产生&#xff0c;使得业务系统臃肿、信息处理和决策效率低下&#xff0c;面对复杂任务及应用场景问题求解效率低。针…

【iOS】消息流程分析

文章目录 前言动态类型动态绑定动态语言消息发送objc_msgSendSEL&#xff08;selector&#xff09;IMP&#xff08;implementation&#xff09;IMP高级用法 MethodSEL、IMP、Method总结流程概述 快速查找消息发送快速查找的总结buckets 慢速查找动态方法解析resolveInstanceMet…

如何远程访问服务器?

在现代信息技术的快速发展下&#xff0c;远程访问服务器已成为越来越多用户的需求。远程访问服务器能够让用户随时随地通过网络连接服务器&#xff0c;实现数据的传输和操作。本文将介绍远程访问服务器的概念&#xff0c;以及一种广泛应用于不同行业的远程访问解决方案——【天…

软考之零碎片段记录(二十九)+复习巩固(十七、十八)

学习 1. 后缀式&#xff08;逆波兰式&#xff09; 2. c/c语言编译 类型检查是语义分析 词法分析。分析单词。如单词的字符拼写等语法分析。分析句子。如标点符号、括号位置等语言上的错误语义分析。分析运算符、运算对象类型是否合法 3. java语言特质 即时编译堆空间分配j…
最新文章