云原生|详解Kubernetes Operator在项目中的开发应用

这篇具有很好参考价值的文章主要介绍了云原生|详解Kubernetes Operator在项目中的开发应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、使用场景

(一)client-go中处理逻辑

(二)controller-runtime中处理逻辑

二、使用controller-runtime开发operator项目

(一)生成框架代码

(二)定义crd字段

(三)生成crd文件

(四)初始化manager

(五)配置controller

(六)配置webhook


一、使用场景

controller-runtime是基于kubernetes控制器模式衍生出来的一套框架。控制回路(Control Loop)是一个非终止回路,用于调节系统状态。一个控制器至少追踪一种类型的 Kubernetes 资源。这些 对象 有一个代表期望状态的 spec 字段。该资源的控制器负责确保其当前状态接近期望状态。

从中,我们可以得出,controller-runtime开发需要遵循以下几点。

  1. controller-runtime需要持续监听kubernetes对象。(通过list/watch机制实现)

  2. controller-runtime需要提供某些机制,Kubernetes对象的status(实际状态)维持到与spec(期望状态)一致。(通过reconcile实现)

(一)client-go中处理逻辑

在client-go中,会将一种Kubernetes对象封装成一个对的informer类型。informer类型中包含Reflector,DeltaFIFO,Indexer,EventHandler。

  • Reflector:用于调用Kubernetes的API接口。informer会通过两个Kubernetes的API接口来实现kubernetes对象的监听。list/watch失败时,会自动重新list/watch

  • list接口:通过http请求,获取informer中定义的全量kubernetes对象数据到deltaFIFO中

  • watch接口:从本地存储的最大resourceVersion开始监听。当发送 watch 请求时,API 服务器会响应更改流。这些更改逐项列出了在你指定为 watch 请求参数的 resourceVersion 之后发生的操作(例如 ADDED、MOD-IFIED、DELETED、BOOKMARK、ERROR)的结果。

  • DeltaFIFO:存储每个待处理的Kubernetes对象。DeltaFIFO中有两个存储kubernetes对象的数据结构,一个是存储对象key值的一维数组,一个存储数据流的map结构。

  • queue: 一维数组,每个kubernetes对象对应一个key(namespace/name)。多次入队的变更数据会合并存储,出队时,处理整个对象。

  • items: 存储kubernetes对象的变更流。(Added,Updated,Deleted,Replaced,Sync)启动informer时,持续从deltaFIFO中读取数据进行处理。

  • Indexer:从DeltaFIFO中获取的Kubernetes对象,存储到内存map中。

  • EventHandler:从DeltaFIFO中获取的Kubernetes对象,根据对象的变更事件类型,来进行不同的处理。一般是将key值传递给工作队列。然后通过custom controller进行处理。

(二)controller-runtime中处理逻辑

根据要监听的Kubernetes对象,定义Informer

定义EventHandler处理逻辑。将informer eventhandler中的key值存入工作队列。该工作队列中会对key值进行去重处理。以避免在一个工作队列出现并发处理同一个对象的情况。

从工作队列中取出key值,在reconcile进行处理。

自定义结构体实现reconcile方法。在该方法中,协调kubernetes对象的状态,使其向期望状态靠拢。

云原生|详解Kubernetes Operator在项目中的开发应用

controller-runtime框架简介 

controller-runtime顶层使用manager进行封装。manager包含以下信息

  • cluster:用于与kubernetes集群通信。包含kubernetes的kubeconfig配置信息,连接kuberenetes的apiserver的客户端信息,注册到operator的kubernetes对象scheme信息,用于获取gvk和gvr的RESTMapper信息,用于informer存储的indexer信息,用于和kubernetes对象读,写和事件发布的客户端信息。

  • controller:用于informer的配置与启动,reconcile的定义

  • cache:缓存informer信息。包含informer的定义和indexer数据读取。

  • webhook:用于发布kubernetes中的三种类型的webhook服务。

  • election:用于operator的主备配置

  • prometheus:用于发布prometheus的数据服务

  • probe:定义operator的探针服务,包含两种探针数据:健康探针和存活探针

二、使用controller-runtime开发operator项目

(一)生成框架代码

官方推荐使用kubebuilder插件来自动生成controller-runtime框架。

生成项目框架:kubebuilder init --domain demo --plugins=go/v4-alpha

生成kubernetes的crd对象对应的api(使用Kubernetes默认的对象可忽略):kubebuilder create api --group webapp --version v1 --kind Guestbook

生成webhook服务代码:kubebuilder create webhook --group webapp --version v1 --kind Guestbook --defaulting --programmatic-validation

生成的代码目录结构如下

云原生|详解Kubernetes Operator在项目中的开发应用

  • api:包含crd的api定义,webhook文件,需在guestbook_types.go中补充需要的字段。然后通过Makefile中的命令生成所需要的文件(可部署到kubernetes集群的yaml文件,实现client-go中定义的object方法的go文件)

  • bin:生成文件时,用到的工具。controller-gen(生成crd关联文件)和kustomize(生成opertor项目的部署文件)

  • config:kustomize执行时用到的配置文件。

  • controllers:controllers示例文件。包含自定义的Reconcile结构体,实现了Reconcile方法用于协调kubenetes资源,和用于定义informer的方法。

  • hack:controller-gen执行时用到的配置文件。

  • dockerignore Dockerfile:生成operator项目镜像文件

  • main.go:启动文件

  • Makefile:封装一些make命令。包含生成代码命令,部署operator项目命令等

  • PROJECT:执行kubebuider命令后生成的项目配置信息文件

(二)定义crd字段

补充guestbook_types.go文件。该文件中,需要补充两类数据。

  • struct中的字段

spec中定义期望状态字段。status中定义实际状态字段。

字段后的json标签用于生成kubernetes中crd文件对应的字段。omitepty表示该字段是否该字段是否必填。

  • kubebuilder注释

用于生成crd文件和实现了client-go中定义的runtime.Object的deepcopy文件。

官网中kubebuilder注释展示了注释的4种用法:

- Validation(定义在字段上,用于生成crd文件的字段验证)

- Additional Printer Columns(定义在结构体上,对应crd文件中的spec.ver-sions.additionalPrinterColumns)

- Subresources(定义在结构体上,对应crd文的.spec.version.subresources)

- Multiple Versions(定义在结构体上,在多版本的中定义指定版本,对应crd文件中的spec.versions.storage字段定义)

⚠️定义在结构体上的注释与注释之间不能有空行

(三)生成crd文件

执行make manifest生成WebhookConfiguration,ClusterRole,Custom-ResourceDefinition

  • WebhookConfiguration:根据//+kubebuilder:webhook注释生成,一般定guestbook_webhook.go文件中
  • ClusterRole:根据//+kubebuilder:rbac注释生成,一般定义controllers/guestbook_controller.go文件中
  • CustomResourceDefinition:根据guestbook_types.go和groupversion_in-fo.go文件生成。

执行make generate生成实现zz_generated.deepcopy.go文件

zz_generated.deepcopy.go文件:实现了runtime.Object中的方法,用于client-go依赖包中的类型转换。根据//+kubebuilder:object注释生成。

(四)初始化manager

在main.go文件中对manager进行初始化。

mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
   Scheme: scheme,
   MetricsBindAddress:     metricsAddr,
   Port:                   9443,
   HealthProbeBindAddress: probeAddr,
   LeaderElection: enableLeaderElection,
   LeaderElectionID: "aefd3536.demo",
})

配置controller

if err = (&controllers.GuestbookReconciler{
   Client: mgr.GetClient(),
   Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
   setupLog.Error(err, "unable to create controller", "controller", "Guestbook")
   os.Exit(1)
}

配置webhook

if err = (&webappv1.Guestbook{}).SetupWebhookWithManager(mgr); err != nil {
   setupLog.Error(err, "unable to create webhook", "webhook", "Guestbook")
   os.Exit(1)
}

配置探针

if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil {
   setupLog.Error(err, "unable to set up health check")
   os.Exit(1)
}
if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil {
   setupLog.Error(err, "unable to set up ready check")
   os.Exit(1)
}

启动manager

if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
   setupLog.Error(err, "problem running manager")
   os.Exit(1)
}

(五)配置controller

guestbook_controller.go文件中定义了两个方法。

func (r *GuestbookReconciler) SetupWithManager(mgr ctrl.Manager) error {
   return ctrl.NewControllerManagedBy(mgr).
      For(&webappv1.Guestbook{}).
      WithEventFilter(predicate.Funcs{
         CreateFunc: func(_ event.CreateEvent) bool {
            return false
         },
      }).
      WithOptions(controller.Options{MaxConcurrentReconciles: 2}).
      Complete(r)
}

在main.go文件中调用,用于定义informer并将informer配置到manager中

  • informer中kubernetes对象

框架对对象类型的定义提供了三种方法:

  • Watches(source.Source, handler.EventHandler, ...WatchesOption)
  • For(client.Object,...ForOption)
  • Owns(client.Object,...OwnsOption)

其中For和Owns是等同与Watches。For的第二个参数默认为EnqueueRequestForObject。Owns的第二个参数默认为EnqueueRequestForOwner

方法参数说明

  • Source:第一个参数,kubernetes对象类型
  • EventHandler:第二个参数,从DeltaFIFO中取出来的数据,在进入工作队列前进行的操作。EnqueueRequestForObject表示不做任何处理,直接进入工作队列。EnqueueRequestForOwner需要和For方法配合使用,Owns中的对象中ownerReference引用的对象类型需要和For中定义的对象类型相同,且ownerReference中的controller为true。
  • Predicate:第三个参数,从工作队列取出来的数据,在进行reconcile处理前进行的操作。通过builder的WithEventFilter可以给所有的对象添加Predicate。

EventHandler和Predicate方法说明

Create:kubernetes对象新增时调用

Update:kubernetes对象更新时调用

Delete:kubernetes对象删除时调用

Generic:未知的操作。非kubernetes集群的变更事件。在operator中自行使用

  • controller配置

通过builder.WithOptions定义配置。controller中有以下配置可定义。

  • MaxConcurrentReconciles:从工作队列取出的数据,可使用几个协程进行处理。默认一个
  • Reconciler:协调器,需要实现Reconciler方法。默认为guest-book_controller.go文件中定义的Reconcile
  • RateLimiter:工作队列的限流策略。默认有两种限流策略。令牌桶策略(BucketRateLimiter):默认100个令牌数量。每秒可取10个令牌。退避策略(ItemExponentialFailureRateLimiter):reconcile返回失败时,重新入队。下次出队时间按2的指数次方增长。初始5ms,最大1000s。
  • LogConstructor:reconcile中从context中取到的日志logr。默认是mgr中定义的日志。
  • CacheSyncTimeout:informer同步超时时间。在informer进行list/watch时,只有当list接口调用的数据全部同步到informer的indexer后,才算informer同步成功。
  • RecoverPanic:reconcile异常时是否自动恢复。
func (r *GuestbookReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
   _ = log.FromContext(ctx)
 
   // TODO(user): your logic here
 
   return ctrl.Result{}, nil
}

Reconcile方法为自定义的逻辑。在实现自定义逻辑时,不需要太过于关注中间状态的影响,只需要保证当前状态应该尽量往期望状态靠拢。Reconcile返回值的Result中,也可以定义是否重新入队与出队时间。

(六)配置webhook

框架提供了三种webhook:

Defaulter

func (r *Guestbook) Default() {
   guestbooklog.Info("default", "name", r.Name)
 
   // TODO(user): fill in your defaulting logic.
}

对应kubernetes中的MutatingAdmissionWebhook对象。

Validator

func (r *Guestbook) ValidateCreate() error {
   guestbooklog.Info("validate create", "name", r.Name)
 
   // TODO(user): fill in your validation logic upon object creation.
   return nil
}
 
// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type
func (r *Guestbook) ValidateUpdate(old runtime.Object) error {
   guestbooklog.Info("validate update", "name", r.Name)
 
   // TODO(user): fill in your validation logic upon object update.
   return nil
}
 
// ValidateDelete implements webhook.Validator so a webhook will be registered for the type
func (r *Guestbook) ValidateDelete() error {
   guestbooklog.Info("validate delete", "name", r.Name)
 
   // TODO(user): fill in your validation logic upon object deletion.
   return nil
}

对应kuberenetes中的ValidatingWebhookConfiguration对象。

convertion.Webhook

对应crd中的spec.convertion中定义的webhook

中心版本

// Hub 标注为中心版本
func (r *Guestbook) Hub() {
 
}

其他版本

func (r *Guestbook) ConvertTo(dst conversion.Hub) error {
   // todo 当前版本向中心版本转换
   return nil
}
func (r *Guestbook) ConvertFrom(src conversion.Hub) error {
   // todo 中心版本向当前版本转换
   return nil
}

那么以上就是k8s operator在项目中的开发应用啦,希望对你有所帮助~

本次分享就到这里啦,更多技术干货小知识欢迎关注“神州数码云基地”公众号

版权声明:文章由神州数码武汉云基地团队实践整理输出,转载请注明出处。文章来源地址https://www.toymoban.com/news/detail-439469.html

到了这里,关于云原生|详解Kubernetes Operator在项目中的开发应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【云原生|Kubernetes】15-Kubernetes的污点和容忍详解

    ​ 污点(Taint)是指标记节点的一种机制,用于告诉 Kubernetes 集群这个节点上的 Pod 是有问题的,例如某些节点资源已经不足等。当节点被标记为污点时,Kubernetes 调度器将不会将新的 Pod 分配到这个节点上,除非这个 Pod 明确地声明了它可以容忍这个节点上的污点。污点通常

    2024年02月12日
    浏览(50)
  • 【云原生|Kubernetes】08-Pod中的Init容器

    Init 容器是一种特殊容器,在 Pod内的应用容器启动之前运行。Init 容器可以包括一些应用镜像中不存在的实用工具和安装脚本。 你可以在 Pod 的spec中与用来描述应用容器的 containers 数组平行的位置指定 Init 容器。 Init 容器的状态在 status.initContainerStatuses 字段中以容器状态数组

    2024年02月09日
    浏览(54)
  • 【云原生】Kubernetes应用包管理器Helm

    目录 一、Helm概述 1.1 为什么需要Helm? 1.2 Helm 介绍 1.3 Helm v3 变化 1.4 Helm客户端 1.4.1、部署Helm客户端 1.4.2、Helm常用命令 1.4.3、配置国内Chart仓库 二、Helm基本使用 2.1 Helm基本使用 2.1.1、使用chart部署一个应用 2.1.2、安装前自定义chart配置选项 2.1.3、构建一个Helm Chart 2.1.4、升级、

    2024年02月08日
    浏览(47)
  • 不用懂 Kubernetes 的 云原生应用管理平台

    官网 Rainbond 是一个云原生应用管理平台,使用简单,不需要懂容器、Kubernetes和底层复杂技术,支持管理多个Kubernetes集群,和管理企业应用全生命周期。主要功能包括应用开发环境、应用市场、微服务架构、应用交付、应用运维、应用级多云管理等。 Rainbond 遵循 以应用为中

    2024年02月12日
    浏览(38)
  • 【云原生丶Kubernetes】从应用部署的发展看Kubernetes的前世今生

    在了解 Kubernetes 之前,我们十分有必要先了解一下应用程序部署的发展历程,下面让我们一起来看看! 我们先来看看应用程序部署的3个阶段:从物理机部署到虚拟机部署,再到容器化部署,他们之间有何优劣势呢? 1、物理机部署 :多个应用进程部署在同一个物理机上,但

    2024年02月12日
    浏览(39)
  • 云原生之在kubernetes集群下部署Mysql应用

    数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。MySQL是一种开源的关系型数据库管理系统,可将数据保存在不同的表中,而不是将所有数据放在一个大的仓库内,从而加快了访问速度并提高了灵活性。MySQL 使用了标准的 SQL 语言形式。支持大型的数据库,可

    2024年02月12日
    浏览(44)
  • 【云原生】kubernetes应用程序包管理工具Helm

        什么是 Helm 安装 Helm 重要概念 使用 Helm 1 简介 官网地址: Helm Helm是一个Kubernetes应用程序包管理工具,它允许你轻松管理和部署Kubernetes应用程序。Helm通过使用称为Charts的预定义模板来简化Kubernetes应用程序的部署和管理。Chart包含了一组Kubernetes对象定义,可以描述一个应用

    2024年02月09日
    浏览(41)
  • kubernetes operator解析

    您是否想过站点可靠性工程 (SRE) 团队如何有效地成功管理复杂的应用程序? 在 Kubernetes 生态中,只有一个答案:Kubernetes Operators! 在本文中,我们将研究它们是什么以及它们是如何工作的。 Kubernetes Operator 概念由 CoreOS 的工程师于 2016 年开发,作为一种在 Kubernetes 集群上构建

    2024年02月10日
    浏览(32)
  • Redis在项目开发中的应用

    在这个示例中,我们将展示如何使用Spring Boot和Redis构建一个简单的博客应用,包括文章发布、点赞和评论功能。 1. 添加依赖 首先,我们需要在 pom.xml 文件中添加Spring Boot和Redis的依赖项。 2. 配置Redis连接 在 application.properties 或 application.yml 文件中,我们需要配置Redis连接信息

    2024年02月01日
    浏览(68)
  • Flink Kubernetes Operator 介绍

    Flink Kubernetes Operator是针对在Kubernetes上运行Apache Flink应用程序而设计的工具。它充分利用了Kubernetes的优势,实现了对Flink集群的弹性管理和自动化操作,通过扩展Kubernetes API的方式,提供了管理和操作Flink部署的功能。 1.部署和监控 Flink 应用程序和会话部署:Flink Kubernetes Ope

    2024年01月21日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包