自定义资源CRD使用介绍

目录
  • 介绍
  • 定义

介绍

Custom Resource Define简称 CRD,是 Kubernetes(v1.7+)为提高可扩展性,让开发者去自定义资源的一种方式。

CRD 资源可以动态注册到集群中,注册完毕后,用户可以通过 kubectl 来创建访问这个自定义的资源对象,类似于操作 Pod 一样。

不过需要注意的是 CRD 仅仅是资源的定义而已,需要一个对应的控制器去监听 CRD 的各种事件来添加自定义的业务逻辑。

定义

如果说只是对 CRD 资源本身进行 CRUD 操作的话,不需要 Controller 也是可以实现的,相当于就是只有数据存入了 etcd 中,而没有对这个数据的相关操作而已。

比如我们可以定义一个如下所示的 CRD 资源清单文件:

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  # name 必须匹配下面的spec字段:<plural>.<group>
  name: foos.crd.example.com
  # for more information on the below annotation, please see
  # https://github.com/kubernetes/enhancements/blob/master/keps/sig-api-machinery/2337-k8s.io-group-protection/README.md
  annotations:
    "api-approved.kubernetes.io": "unapproved, experimental-only; please get an approval from Kubernetes API reviewers if you're trying to develop a CRD in the *.k8s.io or *.kubernetes.io groups"
spec:
  # group 名用于 REST API 中的定义: /apis/<group>/<version>
  group: crd.example.com
  # 列出自定义资源的所有 API 版本
  versions:
    - name: v1  # 版本名称,比如v1,v1beta1
      served: true  # 是否开启通过 REST APIs访问 `/apis/<group>/<version>/...`
      storage: true # 必须将一个且只有一个版本标记为存储版本
      schema: # 定义自定义对象的声明规范
        # schema used for validation
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                deploymentName:
                  type: string
                replicas:
                  type: integer
                  minimum: 1
                  maximum: 10
            status:
              type: object
              properties:
                availableReplicas:
                  type: integer
  names:
    # kind 是 sigular 的一个驼峰形式的定义,在资源清单中会使用
    kind: Foo
    # plural 名字用于 REST API 中的定义:/apis/<group>/<version>/<plural>
    plural: foos
    # singular 名称用于 CLI 操作或显示的一个别名
    singular: foo
    # shortNames 相当于缩写形式
    shortNames:
    - fo
  scope: Namespaced

这个地方的定义和我们定义普通的资源对象比较类似,我们可以随意定义一个自定义的资源对象,但是在创建资源的时候,肯定不是任由我们随意去编写 YAML 文件的,当我们把上面的 CRD 文件提交给 Kubernetes 之后,Kubernetes 会对我们提交的声明文件进行校验,从定义可以看出 CRD 是基于OpenAPI v3 schem进行规范的。

当然这种校验只是对于字段的类型进行校验,比较初级,如果想要更加复杂的校验,这个时候就需要通过 Kubernetes 的 admission webhook 来实现了。关于校验的更多用法,可以前往官方文档查看。

现在我们可以直接使用kubectl来创建这个CRD资源清单:

$  kubectl apply -f crd.example.com_foos.yaml
customresourcedefinition.apiextensions.k8s.io/foos.crd.example.com created

这个时候我们可以查看到集群中已经有我们定义的这个CRD资源对象了:

$ kubectl get crd | grep example
foos.crd.example.com                                  2022-05-11T05:28:51Z

这个时候一个新的 namespace 级别的 RESTful API 就会被创建:

/apis/crd/example.com/v1/namespaces/*/foos/...

接着我们就可以使用这个 API 端点来创建和管理自定义的对象,这些对象的类型就是上面创建的 CRD 对象规范中的foo

现在在 Kubernetes 集群中我们就多了一种新的资源叫做foos.crd.example.com,我们就可以使用它来定义一个Foo资源对象了,这个自定义资源对象里面可以包含的字段我们在定义的时候通过schema进行了规范,比如现在我们来创建一个如下所示的资源清单:

apiVersion: crd.example.com/v1
kind: Foo
metadata:
  name: example-foo
spec:
  deploymentName: example-foo
  replicas: 1

创建完成后我们就可以用kubectl来管理我们这里创建的Foo对象了,比如:

kubectl get foo
NAME          AGE
example-foo   20m

在使用 kubectl 的时候,资源名称是不区分大小写的,我们可以使用 CRD 中定义的单数或者复数形式以及任何简写。

kubectl get foo example-foo -o yaml
apiVersion: crd.example.com/v1
kind: Foo
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"crd.example.com/v1","kind":"Foo","metadata":{"annotations":{},"name":"example-foo","namespace":"default"},"spec":{"deploymentName":"example-foo","replicas":1}}
  creationTimestamp: "2022-05-11T05:40:38Z"
  generation: 1
  name: example-foo
  namespace: default
  resourceVersion: "37605212"
  uid: 56d5b1d3-f6f9-4106-90c4-a0e3c7d130c0
spec:
  deploymentName: example-foo
  replicas: 1

就如上面我们说的,现在我们自定义的资源创建完成了,但是也只是单纯的把资源清单数据存入到了 etcd 中而已,并没有什么其他用处,因为我们没有定义一个对应的控制器来处理相关的业务逻辑。

以上就是自定义资源CRD使用介绍的详细内容,更多关于自定义资源CRD的资料请关注我们其它相关文章!

(0)

相关推荐

  • 使用client go实现自定义控制器的方法

    目录 介绍 具体实现 测试 介绍 我们已经知道,Service对集群之外暴露服务的主要方式有两种:NodePort和LoadBalancer,但是这两种方式,都有一定的缺点: NodePort方式的缺点是会占用很多集群机器的端口,那么当集群服务变多的时候,这个缺点就愈发明显. LoadBalancer的缺点是每个Service都需要一个LB,浪费,麻烦,并且需要Kubernetes之外的设备的支持. 基于这种现状,Kubernetes提供了Ingress资源对象,Ingress只需要一个Node

  • 从生成CRD到编写自定义控制器教程示例

    目录 介绍 CRD定义 生成客户端相关代码 编写控制器 测试 介绍 我们可以使用code-generator 以及controller-tools来进行代码自动生成,通过代码自动生成可以帮我们自动生成 CRD 资源对象,以及客户端访问的 ClientSet.Informer.Lister 等工具包,接下来我们就来了解下如何编写一个自定义的控制器. CRD定义 首先初始化项目: $ mkdir operator-crd && cd operator-crd $ go mod init ope

  • 自定义资源CRD使用介绍

    目录 介绍 定义 介绍 Custom Resource Define简称 CRD,是 Kubernetes(v1.7+)为提高可扩展性,让开发者去自定义资源的一种方式. CRD 资源可以动态注册到集群中,注册完毕后,用户可以通过 kubectl 来创建访问这个自定义的资源对象,类似于操作 Pod 一样. 不过需要注意的是 CRD 仅仅是资源的定义而已,需要一个对应的控制器去监听 CRD 的各种事件来添加自定义的业务逻辑. 定义 如果说只是对 CRD 资源本身进行 CRUD 操作的话,不需要 Co

  • 如何使用Kubernetes自定义资源(CRD)详解

    目录 什么是CRD CRD使用 小结 总结 什么是CRD CRD的全称为 CustomResourceDefinitions,即自定义资源.k8s拥有一些内置的资源,比如说Pod,Deployment,ReplicaSet等等,而CRD则提供了一种方式,使用户可以自定义新的资源,以扩展k8s的功能. 使用CRD可以在不修改k8s源代码的基础上方便的扩展k8s的功能,比如腾讯云TKE使用CRD:logcollectors.ccs.cloud.tencent.com以添加日志收集服务,而Istio也

  • Spring Security 自定义资源服务器实践过程

    目录 前言 最小化配置 安装资源服务器 配置资源服务器 配置客户端 整流程体验 总结 前言 在前面我们使用最小化配置的方式搭建了自己的授权服务器,现在我们依旧用最小化的方式配置自己的资源服务器.资源服务器负责scope的鉴权.authorities的鉴权.基于用户角色的鉴权等. 最小化配置 安装资源服务器 1. 新建一个Spring Boot项目,命名为spring-security-resource-server2.引入pom.xml依赖 <dependency> <groupId&g

  • Smarty使用自定义资源的方法

    本文实例讲述了Smarty使用自定义资源的方法.分享给大家供大家参考.具体如下: <?php // put these function somewhere in your application function db_get_template ($tpl_name, &$tpl_source, &$smarty_obj) { // do database call here to fetch your template, // populating $tpl_source $sq

  • VC对自定义资源加密解密(AES)的详解

    加密解密exe算法可能AES加密解密算法别人已经实现过,也有一些关于如何操纵自定义资源的VC代码,我只是将它们进行了组合,运用到了一起,并运用了一些操纵内存的小技巧,今天将以前做的这个功能总结了一下--在网上搜了一下,好像很少有相关的这种用法,算是原创吧,有兴趣的朋友可以看一下,以下是源码和EXE文件下载地址:点击下载来两张截图: 图1-1 输出资自定义资源的内容,我的自定义资源是"TEXT" 图1-2 这是加密后再输出的结果

  • ASP.NET Core MVC自定义Tag Helpers用法介绍

    介绍 在之前的内容中,我们谈到了Tag Helpers,我们还谈到了 caching Tag Helpers和form Tag Helpers. 通过创建自定义Tag Helpers,我们可以扩展现有元素或创建我们自己的元素. Tag Helper是实现ITagHelper接口类的统称.MVC为我们提供了该接口的抽象类TagHelper,它位于 Microsoft.AspNetCore.Razor.Runtime 程序集中.因此,我们可以直接从TagHelper类继承,我们主要需要实现以下方法:

  • Sqlserver 自定义函数 Function使用介绍

    一.FUNCTION: 在sqlserver2008中有3中自定义函数:标量函数/内联表值函数/多语句表值函数,首先总结下他们语法的异同点: 同点: 1.创建定义是一样的: a, CREATE FUNCTION F_NAME(传入的参数名称 传入参数的类型) b,RETURNS 返回值类型 c,AS 异点:1.标量函数返回的是一个数据类型值,内联表值函数返回的是一个table,而多语句返回的是一个table的变量(类似前面两个的结合): 2.语法的结构:标量函数和多语句函数都是要有begin,,

  • 基于JSP 自定义标签使用实例介绍

    添加JSP自定义标签: 先添加一个tld文件到WEB-INF文件夹中<?xml version="1.0" encoding="UTF-8" ?><taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://

  • Android 自定义View的使用介绍

    在项目开发中,可能系统自带的一些widget不能满足我们的需求,这时就需要自定义View. 通过查看系统中的常用widget如Button,TextView,EditText,他们都继承自View,所以我们在继承自定义View的时候也自然的需要继承View.1.首先新建一个类LView继承自View 复制代码 代码如下: public class LView extends View { private Paint paint; public LView(Context context) {  

  • 支持SpEL表达式的自定义日志注解@SysLog介绍

    目录 序言 预期 思路 过程 结果 序言 之前封装过一个日志注解,打印方法执行信息,功能较为单一不够灵活,近来兴趣来了,想重构下,使其支持表达式语法,以应对灵活的日志打印需求. 该注解是方法层面的日志打印,如需更细的粒度,还请手撸log.xxx(). 预期 通过自定义注解,灵活的语法表达式,拦截自定义注解下的方法并打印日志 日志要支持以下内容: 方法执行时间 利用已知信息(入参.配置.方法),书写灵活的日志SpEL表达式 打印方法返回结果 按照指定日志类型打印日志 思路 定义自定义注解 拦截自定

随机推荐