Kubernetes CRD(CustomResourceDefinition)概览

Kubernetes CRD 系列(一):CRD 介绍 CR(Custom Resource)其实就是在 Kubernetes 中定义一个自己的资源类型,是一个具体的 “自定义 API 资源” 实例,为了能够让 Kubernetes 认识这个 CR,就需要让 Kubernetes 明白这个 CR 的宏观定义是什么,也就是需要创建所谓的 CRD(Custom Resource Definition)来表述。 可能这么说并不是太直观,换个方式表达一下,我们想要创建一个 Pod 的时候,那么会编写一个 YAML 配置,然后前两行一般会这么写: [root@l 阅读详情

一、前言

Kubernetes平台对于分布式服务部署的很多重要的模块都有系统性的支持,借助如下一些平台资源可以满足大多数分布式系统部署和管理的需求:

但是在不同应用业务环境下,对于平台可能有一些特殊的需求,这些需求可以抽象为Kubernetes的扩展资源,而Kubernetes的CRD(CustomResourceDefinition)为这样的需求提供了轻量级的机制,保证新的资源的快速注册和使用。在更老的版本中,TPR(ThirdPartyResource)是与CRD类似的概念,但是在1.9以上的版本中被弃用,而CRD则进入的beta状态。

转载自https://blog.youkuaiyun.com/cloudvtech

二、CRD的基本概念

CRD的工作步骤如下:

用户向Kubernetes API服务注册一个带特定schema的资源,并定义相关API

注册一系列该资源的实例
在Kubernetes的其它资源对象中引用这个新注册资源的对象实例
用户自定义的controller例程需要对这个引用进行释义和实施,让新的资源对象达到预期的状态
从基本原理上来讲,CRD定义的Kubernetes扩展资源:

借助Kubernetes RBAC和authentication机制来保证该扩展资源的security、access control、authentication和multitenancy。
将扩展资源的数据存储到Kubernetes的etcd集群
借助Kubernetes提供的controller模式开发框架,实现新的controller,并借助APIServer监听etcd集群关于该资源的状态并定义状态变化的处理逻辑


在实现自定义controller的时候,蓝色的部分是client-go中经为用户提供的框架和逻辑,可以直接使用,红色的部分就是用户需要实现的关于该扩展资源的业务逻辑。informer会借助APIServer跟踪该扩展资源定义的变化,一旦被触发就会调用回调函数,并把变更的具体内容放到Workqueue中,自定义controller里面的worker会获取Workqueue里面内容,并进行相应的业务处理。

转载自https://blog.youkuaiyun.com/cloudvtech

三、CRD的配置和使用

借助kubernetes的例子可以了解一下CRD配置的方式

3.1 crd的定义

crd.yaml

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: foos.samplecontroller.k8s.io
spec:
  group: samplecontroller.k8s.io
  version: v1alpha1
  names:
    kind: Foo
    plural: foos
  scope: Namespaced


运行如下命令建立一个种类为Foo的CRD

kubectl create -f crd.yaml


3.2 定义这个种类的CRD的验证schema

crd-validation.yaml

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: foos.samplecontroller.k8s.io
spec:
  group: samplecontroller.k8s.io
  version: v1alpha1
  names:
    kind: Foo
    plural: foos
  scope: Namespaced
  validation:
    openAPIV3Schema:
      properties:
        spec:
          properties:
            replicas:
              type: integer
              minimum: 1
              maximum: 10

 

kubectl create -f crd-validation.yaml


3.3 定义一个Foo CRD的资源实例

example-foo.yaml

apiVersion: samplecontroller.k8s.io/v1alpha1
kind: Foo
metadata:
  name: example-foo
spec:
  deploymentName: example-foo
  replicas: 1
kubectl create -f example-foo.yaml

转载自https://blog.youkuaiyun.com/cloudvtech

四、CRD contorller的实现

这个例子主要的作用时定义一个Foo CRD,这个CRD的资源实例可以定义一个replica的值,后端controller读取这个值,并且建立包含这个数目replica POD的nginx deployment。两个主要的实现controller的文件是:

https://github.com/kubernetes/sample-controller/blob/master/main.go

https://github.com/kubernetes/sample-controller/blob/master/controller.go

4.1 初始化CDR controller

在main.go里面使用了如下package:

    kubeinformers "k8s.io/client-go/informers"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"


实例化kubeinformer、informer等对象,运行CRD controller:

    ...
    kubeInformerFactory := kubeinformers.NewSharedInformerFactory(kubeClient, time.Second*30)
    exampleInformerFactory := informers.NewSharedInformerFactory(exampleClient, time.Second*30)
    controller := NewController(kubeClient, exampleClient, kubeInformerFactory, exampleInformerFactory)
    ...
    go kubeInformerFactory.Start(stopCh)
    go exampleInformerFactory.Start(stopCh)
    ...
    controller.Run(2, stopCh)  

     
4.2 获取informer并注册处理函数

在controller初始化的时候获取Deployment和Foo两个资源的informer并注册处理函数:

    // obtain references to shared index informers for the Deployment and Foo
    // types.
    deploymentInformer := kubeInformerFactory.Apps().V1().Deployments()
    fooInformer := sampleInformerFactory.Samplecontroller().V1alpha1().Foos()
    ...
    // Set up an event handler for when Foo resources change
    fooInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
        AddFunc: controller.enqueueFoo,
        UpdateFunc: func(old, new interface{}) {
            controller.enqueueFoo(new)
        },
    })
    ...
    deploymentInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
        AddFunc: controller.handleObject,
        UpdateFunc: func(old, new interface{}) {
            newDepl := new.(*appsv1.Deployment)
            oldDepl := old.(*appsv1.Deployment)
            if newDepl.ResourceVersion == oldDepl.ResourceVersion {
                // Periodic resync will send update events for all known Deployments.
                // Two different versions of the same Deployment will always have different RVs.
                return
            }
            controller.handleObject(new)
        },
        DeleteFunc: controller.handleObject,
    })    


Foo的informer的处理函数借助enqueueFoo将状态变动事件加入到队列,deployment的Informer借助handleObject函数处理状态变动事件,可以看到最后也是将必要的事件放入队列。这里参考了controller模式的开发指导,借助这个开发模式框架,CDR的controller可以获取任何感兴趣的Kubernetes资源的事件进行相关处理;在这个例子中,CDR controller感兴趣的只有两个资源的事件,一个是Foo这个资源的实例的加入事件,另外一个是deployment的变化事件(应为这里的Foo CRD的作用实际上是新建一个Foo资源实例所定义的replica的nginx deployment),处理这个事件的handleObject要对deployment进行过滤,只将Foo资源实例对应的nginx部署过滤出来,并将对应的事件加入到队列。

4.3 队列处理

是一个队列驱动的loop:

// processNextWorkItem will read a single work item off the workqueue and
// attempt to process it, by calling the syncHandler.
func (c *Controller) processNextWorkItem() bool {
...
        // Run the syncHandler, passing it the namespace/name string of the
        // Foo resource to be synced.
        if err := c.syncHandler(key); err != nil {
            return fmt.Errorf("error syncing '%s': %s", key, err.Error())
        }
...


每个事件object都要经由syncHandler进行处理,主要包括建立deployment、更新deployment等行为:

...
deployment, err = c.kubeclientset.AppsV1().Deployments(foo.Namespace).Create(newDeployment(foo))
...
deployment, err = c.kubeclientset.AppsV1().Deployments(foo.Namespace).Update(newDeployment(foo))
...
err = c.updateFooStatus(foo, deployment)
...


每次的deployment事件操作都会先产生一个新的deployment配置:

// newDeployment creates a new Deployment for a Foo resource. It also sets
// the appropriate OwnerReferences on the resource so handleObject can discover
// the Foo resource that 'owns' it.
func newDeployment(foo *samplev1alpha1.Foo) *appsv1.Deployment {
    labels := map[string]string{
        "app":        "nginx",
        "controller": foo.Name,
    }
    return &appsv1.Deployment{
        ObjectMeta: metav1.ObjectMeta{
            Name:      foo.Spec.DeploymentName,
            Namespace: foo.Namespace,
            OwnerReferences: []metav1.OwnerReference{
                *metav1.NewControllerRef(foo, schema.GroupVersionKind{
                    Group:   samplev1alpha1.SchemeGroupVersion.Group,
                    Version: samplev1alpha1.SchemeGroupVersion.Version,
                    Kind:    "Foo",
                }),
            },
        },
        Spec: appsv1.DeploymentSpec{
            Replicas: foo.Spec.Replicas,
            Selector: &metav1.LabelSelector{
                MatchLabels: labels,
            },
            Template: corev1.PodTemplateSpec{
                ObjectMeta: metav1.ObjectMeta{
                    Labels: labels,
                },
                Spec: corev1.PodSpec{
                    Containers: []corev1.Container{
                        {
                            Name:  "nginx",
                            Image: "nginx:latest",
                        },
                    },
                },
            },
        },
    }
}


4.4 总结

所以这个example-controller可以根据Foo资源实例定义的replica,创建或者更新由controller管理的一个nginx deployment的replica。
--------------------- 
作者:cloudvtech 
来源:优快云 
原文:https://blog.youkuaiyun.com/cloudvtech/article/details/80277960 
版权声明:本文为博主原创文章,转载请附上博文链接!

Kubernetes组件_CRD自定义资源 CRD自定义资源 阅读详情

相关推荐

Kubernetes CRD(自定义资源,CustomResourceDefinition)详解

Kubernetes CRD(CustomResourceDefinition)详解:自定义资源扩展指南 摘要:Kubernetes CRD允许用户在不修改核心代码的情况下扩展API,创建自定义资源类型。CRD定义了新的资源元数据,而CR则是根据该定义创建的具体实例。通过创建CRD YAML并提交到集群,API Server会动态注册新资源类型。自定义资源数据存储在etcd中,可配合控制器实现声明式API逻辑。典型CRD包含API组、版本、结构验证规则等配置,支持子资源和状态管理,是构建云原生应用的关键技术

guigenyi的专栏 999

【K8s】Kubernetes CR、CRD 介绍(控制器)

CR(Custom Resource)其实就是在 Kubernetes 中定义一个自己的资源类型,是一个具体的 “自定义 API 资源” 实例,为了能够让 Kubernetes 认识这个 CR,就需要让 Kubernetes 明白这个 CR 的宏观定义是什么,也就是需要创建所谓的 CRD(Custom Resource Definition)来表述。kind: Pod。

m0_45406092的博客 1万+

Kubernetes 实战 一 CRD 自定义资源

文章目录1. CRD 简介2. 使用场景3. 操作环境4. 自定义资源5. 自定义资源-validations6. 自定义资源-additionalPrinterColumns7. 自定义资源-subresources 1. CRD 简介 Custom resources:是对K8S API的扩展,代表了一个特定的kubetnetes的定制化安装。在一个运行中的集群中,自定义资源可以动态注册到集...

xiliangMa的博客 1万+

kubernetes系列之十四:Kubernetes CRD(CustomResourceDefinition)概览

content

cloudvtech的博客 2万+

什么是 Kubernetes 自定义资源定义 (CRD)?

Kubernetes资源定义了可以存储在集群中的数据类型。它们是通过KubernetesAPI访问的,该API提供了用于在每种资源类型中创建、列出和修改项目的端点。您可以添加自定义资源以在集群中存储您自己的任意数据。您创建的项目将由etcd控制平面组件与内置资源的实例一起存储。API会自动显示自定义资源,因此您无需设置自己的工具来创建项目实例。默认情况下,CRD充当简单的数据结构。虽然野外的CRD通常有自己的行为,但这不是CRD机制提供的。...

学海无涯苦作舟的博客 1326

Kubernetes CRD 介绍

CR(Custom Resource)其实就是在 Kubernetes 中定义一个自己的资源类型,是一个具体的 “自定义 API 资源” 实例,为了能够让 Kubernetes 认识这个 CR,就需要让 Kubernetes 明白这个 CR 的宏观定义是什么,也就是需要创建所谓的 CRD(Custom Resource Definition)来表述。这里的 Resource 就是 Pod,我们可以它通过在 Kubernetes 中创建一个真实的 Pod,但是这个 Pod 要运行哪些 Container?

专注基础架构领域 1088

【kubernetes/k8s概念】CRD CustomResourceDefinition 自定义资源类型

当看istio源码时,发现使用CRD,本文分析Custom Resource Definition WHY CRD? 一些特殊的需求,现有资源类型(deploy service statefulset等)满足不了,可以抽象Kubernetes 自定义资源满足需求, WHAT CRD ? k8s1.7 +增加了CRD 二次开发能力来扩展 API...

zhonglinzhang 8009

OpencvSharp学习笔记(一):图片的打开,保存灰度化,保存

近来萌生了学习OpenCv的想法,经过度娘得知老夫会的C#不能直接用OpenCv,只能用他的儿子OpenCvSharp与EmguCV,奈何奈何,这两玩意的资料少的出奇,只能慢慢的摸索了,EmguCV先不说,老夫找到了牛批的资料,先摸索OpencvSharp吧 首先打开VS通过Nuget安装 选择版本后点击安装就OK了. 安装完成后,引用里面就有以下的玩意儿了… 废话不多说了,在写程序前先 using OpenCvSharp 图片打开,灰度化,保存代码如下: static void Main(strin

猥琐de专注 7188

Kubernetes CRD 完全指南:使用 CustomResourceDefinition 扩展 Kubernetes API

本文以 kubernetes-handbook 仓库中的 [CRD 教程](https://link.gitcode.com/i/a33f88fc2262e44e96085dc3b48f04b6) 为核心,系统讲解如何通过 CustomResourceDefinition(CRD)扩展 Kubernetes API:从创建 CRD 与自定义对象、删除清理,到 Finalizer 终结器、OpenA

gitblog_00302的博客 411

从入门到精通:MediaGo跨平台部署全攻略,Docker+NAS实战案例深度拆解!

本篇将深入解析开源媒体处理工具MediaGo的运作机制,该软件具备跨平台兼容性,支持Windows、MacOS及Linux三大主流操作系统。其核心创新在于采用模块化架构设计,用户无需额外依赖任何插件即可完成快速部署。作为GitHub平台上的开源项目,该工具特别注重用户体验设计,通过Docker容器化方案可无缝接入各类网络存储设备,显著优化系统资源占用并提升数据处理效率。以飞牛云NAS系统为实施案例,本文将详细展示本地化部署全流程。

Yawesh的博客 1954

IDEA中Maven工具栏与命令执行全攻略:高效开发必备技巧

IntelliJ IDEA 作为强大的 Java 开发工具,其 Maven 功能独具优势。Maven 工具栏位于工作区右侧,图标功能丰富,涵盖项目导入、源码处理、依赖操作等。执行 Maven 命令有多种途径,Run Anything 窗口可输入或选目标执行,上下文菜单能右键运行目标,还可创建运行配置,指定命令参数后运行,为开发者高效管理 Maven 项目、便捷执行命令提供有力支持。

2301_82300081的博客 2031

K8S CRD简介

KBS CRD简介

weixin_41636021的博客 6951

记录汇川:自由口通信-梯形图

最常见的就是MODBUS通信协议,指令主要通过RS232和RS485端口进行报文发送,所以通信报文格式可以选择MODBUS RTU通信格式或MODBUS ASCII通信格式。255---Y10-Y17:ON(1111 1111)指令进行报文的发送与接收,但是报文内部的数据格式不是由主站PLC决定, 而是由。修改从站一个保持寄存器数据。修改从站多个保持寄存器数据。读取从站的输出信号状态。读取从站的输入信号状态。读取从站保持寄存器数据。读取从站输入寄存器数据。

m0_61837027的博客 4915

k8s的API资源对象CustomResourceDefinition(CRD)

和我们定义普通的资源对象比较类似,这里可以随意定义一个自定义的资源对象,但是在创建资源的时候,肯定不是任由我们随意去编写 YAML 文件的,当我们把上面的 CRD 文件提交给 Kubernetes 之后,Kubernetes 会对我们提交的声明文件进行校验,从定义可以看出 CRD 是基于。在Kubernetes中,像Pod、Service和Deployment这样的资源是由内置的资源类型如Pod、Service和Deployment表示的。一旦创建完自定义的CRD,那么就会生成一个自定义的API。

weixin_44681307的博客 928

雷电模拟器+Python 3.11:手把手教你用Frida-dexdump给安卓APK脱壳(附GDA查壳)

本文详细介绍了如何使用雷电模拟器和Python 3.11配合Frida-dexdump工具进行安卓APK脱壳的全流程。从环境配置、工具安装到脱壳操作和问题排查,提供了包含30+关键截图的保姆级教程,适合零基础用户快速上手。重点讲解了Frida工具链的使用技巧和GDA查壳方法,帮助读者掌握移动应用安全分析的基础技能。

weixin_42568801的博客 328

MCGS触摸屏Modbus TCP通讯实战:从寄存器写入到字符串处理的完整代码解析

本文详细解析了MCGS触摸屏通过Modbus TCP协议实现寄存器写入和字符串处理的完整代码,涵盖单寄存器写入、多寄存器写入及字符串传输等核心技术。文章还提供了MCGS组态环境中的实战配置步骤和常见问题排查方法,帮助开发者快速掌握工业自动化通讯的关键技术。

study的专栏 755

Kubernetes资源对象:CustomResourceDefinition

CustomResourceDefinition CustomResourceDefinition(CRD)是 无需改变代码就可以扩展 Kubernetes API 的机制,用来管理自定义对象。 CustomResourceDefinition demo apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefini...

琦彦 2162

学Simulink——十二脉波整流电路(移相变压器)谐波抵消仿真

Y:Δ = 1:√3(若 DC 同压)— 此处同相电压故 220V(Y)=220V(Δ phase)Y(相电压=220V)、Δ(线电压=380V ⇒ 相=220V,30° 移相)可经 Lbal​=0.5mH(平衡电抗)或直接短(大 L_dc 下均流尚可)✅ 直流输出纹波频率 = 12·f_line(vs 6·f_line)直流输出 → Ldc​=50mH→Cdc​=2200µF→R=30Ω。Line‑Line RMS = 380 V(⇒ 相=220V)Vdc​≈1.35⋅380≈513V(同 6‑脉波)

xiaoheshang_123的博客 59

k8s CRD相关

Kubernetes 1.7之后,提供了CRD(CustomResourceDefinitions)自定义资源的二次开发能力来扩展kubernetes API,通过此扩展可以向kubernetes API中增加新的资源类型,会比修改kubernetes apiserver的源代码或创建自定义的apiserver来的更加的简洁和容易。

王大阳的博客 2244

GEE聚类分析:基于sentinel-2 影像进行 K-Means 聚类分析

这篇博客介绍了如何使用 Google Earth Engine (GEE) 进行 K-Means 聚类分析,以识别感兴趣区域(ROI)内的不同地表覆盖类型。文章详细说明了从定义用户参数、准备参考区域、加载和预处理 Sentinel-2 图像,到训练 K-Means 聚类器并对图像进行聚类的完整流程。代码示例展示了如何设置参数、采样像素数据、训练聚类器,并将结果可视化。最后,还提供了将聚类结果导出到 Google Drive 的选项。通过该教程,用户可以掌握在 GEE 平台上进行地理数据聚类分析的基本方法。

此星光明博客 263

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Kubernetes CRD (CustomResourceDefinition) 自定义资源类型及源码分析

1、CRD (CustomResourceDefinition) 介绍 我们知道,Kubernetes 中一切都可视为资源,它提供了很多默认资源类型,如 Pod、Deployment、Service、Volume等一系列资源,能够满足大多数日常系统部署和管理的需求。但是,在一些特殊的需求场景下,这些现有资源类型就满足不了,那么这些就可以抽象为 Kubernetes 的自定义资源,在 Kuberne...

fy_long的博客 1407

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【云原生】Kubernetes CRD 详解(Custom Resource Definition)

本身是一种 Kubernetes 内置的资源类型,即自定义资源的定义,用于描述用户定义的资源是什么样子。CRD 是v1.7 +新增的无需改变代码 就可以扩展 Kubernetes API 的机制,用来管理自定义对象。它实际上是ThirdPartyResources(TPR) 的升级版本,而 TPR 已经在 v1.8 中删除。从 Kubernetes 的用户角度来看,所有东西都叫资源 Resource,就是 Yaml 里的字段 Kind 的内容,例如 Service、Deployment 等。

匠人精神,持之以恒! 3670

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

k8s crd 自定义资源详解

文章目录1. 创建 CustomResourceDefinition2. 创建定制对象3. 删除 CustomResourceDefinition4. crd参数4.1 自定义资源-validations4.2 自定义资源-additionalPrinterColumns4.3 自定义资源-subresources 1. 创建 CustomResourceDefinition 创建自定义资源,即自定义 restful api 当你创建新的 CustomResourceDefinition(CRD)时,Kub

爱死亡机器人 5030

Kubernetes学习——CRD

CRD是什么 Custom Resource Definition,k8s允许用户自定义资源。定义CRM对象会创建一个具有您指定的名称和架构的新定义资源。Kubernetes API 提供并处理您的自定义资源的存储。 CR是什么 Custom Resouce,自定义资源,CRM的具体实例。CR是Kubernetes API的扩展。自定义资源可以通过动态注册在正在运行的集群中出现和消失,并且集群管理员可以独立于集群本身更新自定义资源。安装自定义资源后,用户可以使用kubectl创建和访问其对​​象.

chenxy02的博客 1533

Kubernetes operator(二)CRD篇

本文是 Kubernetes operator学习 系列第二篇,主要对 CRD 进行学习

a1369760658的博客 1788

K8s: Kubernetes扩展之自定义资源

自定义资源是 K8s 的扩展,有时候需要对K8s进行一个扩展在默认的K8s集群里面提供的资源对象是一个有限的集合比如常用的pod, deployment, service,这些都是K8s原生的资源之所以它资源,是因为它能够对外提供API接口变成一个resource进行访问通过 kubectl 创建,也能把这些资源创建出来当有限的K8s的资源,不能满足你的需求的情况下就需要通过 Custom Resource 来实现自定义的这个资源。

Wang的专栏 2341
上一篇: 【golang】巧用select {}
下一篇: [Kubernetes] CRI 的设计与工作原理
cbmljs
博客等级 码龄10年 329粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值