热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

KubernetesCRD

CRDGitHub地址:https:github.comkubernetes-sigskubebuilderKubernetes里资源类型有如下所示:上述资源类型可以满足大多数分布

CRD

GitHub地址:https://github.com/kubernetes-sigs/kubebuilder

Kubernetes 里资源类型有如下所示:

Kubernetes CRD

上述资源类型可以满足大多数分布式系统部署的需求

但是在不同应用业务环境下,对于平台可能有一些特殊的需求,这些需求可以抽象为 Kubernetes 的扩展资源,而 Kubernetes 的 CRD (CustomResourceDefinition)为这样的需求提供了轻量级的机制,保证新的资源的快速注册和使用。

举个栗子

我希望在 kubernetes 中有 KafkaSource 这个资源, 资源示例 kafka-source.yaml如下:

Kubernetes CRD

我们希望在执行 kubectl create -f kafka-source.yaml 之后,在 kubernetes 里会启动一个 pod,这个 pod 会做下面的事情:

  • 它会从地址是 my-cluster-kafka-bootstrap.kafka:9092,topic 是 knative- demo-topic 的 kafka 机群里读取消
  • 将读到的消息,发送到 kubernetes 的一个 Service 去执行

Kuberentes 里并没有 KafkaSource 这个资源可以使用,所以直接执行 kubectl create -f kafka-source.yaml 的时候,会出错。但是 kubernetes 提供的 CRD 机制可以让我们轻松的把上述功能添加到 kubernetes 里。

CRD 机制以上述 Kafkasource 为例,如下:

  1. 需要把 KafkaSource 这个资源注册到 kubernetes 中,这样 kubernetes 才会知道这个资源
  2. 注册之后,还需要开发一个 controller 组件,来监听用户是否创建了 KafkaSource,也就是部署、更新或者删除如上的 yaml 文件。
  3. Controller 监听到有用户创建了 KafkaSource,就会创建一个 pod 来做相应的工作

归纳一下就是:

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

  1. 将扩展资源的数据存储到 Kubernetes 的 etcd 集群
  2. 借助 Kubernetes 提供的 controller 模式开发框架,实现新的 controller,并借助 APIServer 监听 etcd 集群关于该资源的状态并定义状态变化的处理逻辑

具体流程如下图:

Kubernetes CRD

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

注册使用 CustomResourceDefinition,以如下 kafkasource 的一个简化版本为例,kubectl create -f kafkasource-customresourcedefinition.yaml:

Kubernetes CRD

可能这时候,大家还是不知道如何进行开发,就算好不容易搞清楚了,感觉开发也是很复杂的事情,我们可以使用工具-kubebuilder 来做开发,我们来做一下小的 demo,来看一下 kubebuilder 是如何帮我们进行开发的。

安装

依赖:docker/go/kubebuilder

https://github.com/kubernetes-sigs/kubebuilder/releases

到相应的网址下载相应的二进制包,解压压缩包,并把二进制包放到系统路径里。接下来我们一步一步创建一个自定的 CronJob, 这也是一个比较经典的例子:

第一步:创建项目

kubebuilder init --domain tutorial.kubebuilder.io --license apache2 --owner "Authors"

  • A license. The reference project uses Apache 2.
  • A domain name. This is the unique domain used to identify your project's resources.
  • An author name. This is the copyright owner listed in the copyright notice at the top of each source file.

让我们看一下生成的项目的结构:

Kubernetes CRD

go.mod: 项目第三方依赖

Makefile: 用来构建和部署 controller

PROJECT: metadata

Main.go: 应用执行入口

 

Config目录下目前只包含启动在鸡群里启动controller的文件,还不包含CustomResourceDe nitions, RBAC con guration,and WebhookCon gurations.

config/manager: launch your controllers as pods in the cluster

config/rbac: permissions required to run your controllers under their own service account

main.go 中的 schemeHui 描述 Kinds 的 go types.

到目前这个项目包含:

  1. 设置了 flag
  2. 初始化了一个 manager,它会跟踪所有的 controller
  3. 启动 manager

第二步:创建 API

Groups, Versions and Kinds

Kubernetes CRD

kubebuilder create api --group batch --version v1alpha1 --kind SampleSource

讲解一下自动创建的三个文件

接下来我们看一下,创建好的文件内容,看代码:

api/v1: 只需要修改CronJobSpec和CronJobStatus

+kubebuilder:object:root :表示这是一个Kind

设计 API 的规则:

(1) 变量需要是驼峰,所以需要使用 tag 来标注

(2) 变量的类型也有要求

Numbers: int32、int64和resource.Quantity(举例:resources requests and limits )

Spec:

  • Schedule: 定时
  • Template:pod spec

第三步:创建 controller

Controller 是 kubernetes 的核心,它负责保持集群资源实际状态和期望的状态一致(pod 数量之类的的),这个过程叫做 reconciling.

对某个具体的 Kind 进行 reconciling 的部分,叫做 reconciler.

请看代码:

Import 部分......

会为大家仔细讲解

剩下的主要是编码部分,和部署验证部分

......

具体详情代码


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Python开源库和第三方包的常用框架及库
    本文介绍了Python开源库和第三方包中常用的框架和库,包括Django、CubicWeb等。同时还整理了GitHub中最受欢迎的15个Python开源框架,涵盖了事件I/O、OLAP、Web开发、高性能网络通信、测试和爬虫等领域。 ... [详细]
  • MVC设计模式的介绍和演化过程
    本文介绍了MVC设计模式的基本概念和原理,以及在实际项目中的演化过程。通过分离视图、模型和控制器,实现了代码的解耦和重用,提高了项目的可维护性和可扩展性。详细讲解了分离视图、分离模型和分离控制器的具体步骤和规则,以及它们在项目中的应用。同时,还介绍了基础模型的封装和控制器的命名规则。该文章适合对MVC设计模式感兴趣的读者阅读和学习。 ... [详细]
  • SpringBoot简单日志配置
     在生产环境中,只打印error级别的错误,在测试环境中,可以调成debugapplication.properties文件##默认使用logbacklogging.level.r ... [详细]
  • 【重识云原生】第四章云网络4.8.3.2节——Open vSwitch工作原理详解
    2OpenvSwitch架构2.1OVS整体架构ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-basedswitchin ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
author-avatar
soseast9975
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有