【Kubernetes】Operator开发之kubebuilder实战(二)

1 解决(一)中的资源删除问题

在Operator开发之kubebuilder实战(一)的最后提到了Demo和Pod删除的问题:

  • 由于DemoController只监听了Demo资源的变化,因此,删除Pod时,DemoController不会创建Pod,同时,在删除Demo时,也不会删除对应的Pod,因为此时已经没有Demo了,而且k8s也不知道该Demo管理了哪些Pod

首先,DemoController需要监听Pod资源的变化,kubebuilder提供了两种监听额外资源的变化的机制,一种是简单粗暴的Watchs

func (r *DemoReconciler) SetupWithManager(mgr ctrl.Manager) error {return ctrl.NewControllerManagedBy(mgr).For(&batchv1.Demo{}).Watches(&corev1.Pod{}, &handler.EnqueueRequestForObject{}).Complete(r)
}

这种方式就可以直接ListAndWatch Pod资源,这种方式的问题是,可以接收到所有命名空间的Pod的变化,但是,在我们的场景中,希望只监听Demo负责创建的Pod。

另一种就是Owns

func (r *DemoReconciler) SetupWithManager(mgr ctrl.Manager) error {return ctrl.NewControllerManagedBy(mgr).For(&batchv1.Demo{}).Owns(&corev1.Pod{}).Complete(r)
}

这种方式就只会监听Demo负责创建的Pod,不过使用这种方式还需要在创建Pod时增加ownerReferences属性,这种方式就跟ReplicaSet类似:当ReplicaSet在创建Pod时,会将自身的信息写入到Pod的ownerReferences字段,当Pod变化时,会根据Pod找到关联的ReplicaSet,然后向ReplicaSet推送Pod变更。这种方式可以让DemoController接收必要的消息,而不需要实现过滤逻辑。

创建Pod时在metadata部分加入ownerReferences:

        pod := &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Labels:      make(map[string]string),Annotations: make(map[string]string),Name:        name,Namespace:   req.Namespace,OwnerReferences: []metav1.OwnerReference{{APIVersion:         demo.APIVersion,Kind:               demo.Kind,Name:               demo.Name,UID:                demo.UID,Controller:         pointer.Bool(true),  // 为true表示该资源是控制器},},},Spec: *demo.Spec.Template.Spec.DeepCopy(),}

通过这两个改动的结合就可以达到效果:

  • 通过监控Pod的变化,能够在Pod被删除时去判断当前的Pod数量和需要的Pod数量,就可以保证在Pod删除时进行Pod的重建
  • 通过给Pod设置ownerReferences属性,能够将Pod与Demo关联起来,一方面,在Pod变更时能够找到关联的Demo并给Demo推送变更,另一方面,在删除Demo时,可以级联删除Pod

需要注意的是:

  • SetupWithManager里面监听的是Pod,但是调谐函数收到的是Pod关联的Demo的变更,而不像有些文章写的在这里还需要判断收到的变更是Demo还是Pod
  • 删除Demo时,会级联删除Pod

关于级联删除:当删除一个资源时,该如何删除这个资源管理的资源。当使用kubectl delete删除资源时,有个级联删除的选项--cascade,该选项有三个值:

  • background:后台级联删除,是默认的删除策略,k8s立即删除当前资源,然后在后台清理当前资源创建的其他资源(也就是ownerReferences是当前资源的资源)
  • foreground:前台级联删除,kubectl会,k8s会给Demo加上deletionTimestamp属性和finalizers属性,其中finalizers设置为foregroundDeletion,给Pod设置deletionTimestamp,然后去删除Pod,当清理操作完成时,再移除finalizers属性并删除Pod
  • orphan:不进行级联删除,直接删除当前资源,也就是不管当前资源创建的其他资源,跟我们没有用ownerReferences效果一样

这就解释了为什么给Pod加上ownerReferences属性就可以在删除Demo时自动删除Pod。

资源删除过程中还需要提到两个属性:BlockOwnerDeletionFinalizers

  • BlockOwnerDeletion:当在ownerReferences中设置了该选项,说明当删除当前资源时需要确保父资源也在删除
  • Finalizers:当资源设置了Finalizers时,k8s收到删除请求时,不会直接删除资源,而是会添加资源的deletionTimestamp属性,然后返回Accepted,之后FinalizersController会监听该资源,当该资源的条件满足时,就会从Finalizers中删除,资源就会被删除

2 开发Webhook

2.1 什么是Webhook

Webhook是一种可以在请求过程中将请求发送给另一个web服务进行处理的机制,例如,GitLab中的Webhook,当向GitLabe仓库提交代码时,GitLab会产生一些事件,可以让GitLab将这些事件发送给我们的Web程序处理,从而可以实现流程的自动化。与GitLabe中的Webhook类似,k8s中的Webhook也是可以在apiserver处理请求时,将请求发送给其他的web服务处理,区别是,k8s中的Webhook不仅可以收到请求,还能够拦截和拒绝请求。

k8s apiserver在收到请求后,需要对请求进行准入控制,也就是判断请求是否合法,这里面有两种特殊的准入控制可以让开发人员增加自己的准入规则:

  • MutatingAdmissionWebhook:变更准入,可以对资源进行修改,例如,当用户没有设置某个字段时,可以给该字段设置默认值
  • ValidatingAdmissionWebhook:验证准入,可以对资源的字段进行验证,例如,验证某个字段是否在允许的范围内
2.2 基于kubebuilder开发Webhook

在这里我们创建Webhook,且带有变更准入和验证准入的功能:

  • 变更准入:当demo.spec未提供replicas字段时,则将demo.spec.replics设置为1
  • 验证准入:demo.spec.replicas的范围只能在[1,10]之间,如果设置的范围不在这个范围,则拒绝请求

创建Webhook:

// 创建默认和验证的webhook
kubebuilder create webhook --group batch --version v1 --kind Demo --defaulting --programmatic-validation

上述命令分别在api/v1和config增加了以下文件:

  • api/v1:demo_webhook.go、webhook_suit_test.go
  • config/:default/manager_webhook_patch.yaml、default/webhookcainjection_patch.yaml、webhook/service.yaml、

代码逻辑位于demo_webhook.go,其中Default()里面可以对未提供值的字段设置默认值,ValidateCreate()是对创建资源时进行验证,ValidateUpdate()是对更新资源时进行验证,ValidateDelete()是对删除资源时进行验证。

func (r *Demo) Default() {demolog.Info("default", "name", r.Name)// 设置replicas的默认值if r.Spec.Replicas == nil {r.Spec.Replicas = new(int64)*r.Spec.Replicas = 1}
}func (r *Demo) ValidateCreate() (admission.Warnings, error) {demolog.Info("validate create", "name", r.Name)// 创建资源时对replicas的范围进行判断if *r.Spec.Replicas < 1 || *r.Spec.Replicas > 10 {return admission.Warnings{"replicas must greater than 1 and less than 11"}, errors.New("replicas must greater than 1 and less than 11")}return nil, nil
}

3 总结

这里解决了当前资源和子资源的删除问题,并说明了级联删除,并简单讲解了Webhook的开发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/123013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux创建逻辑卷并扩容(超详细)

目录 ​编辑 一、概念解析 1、LV逻辑卷 2、PV物理卷 3、VG卷组 二、扩容前准备 三、创建逻辑卷并扩容 1、打开虚拟机 2、进入root用户 3、查看新加入的硬盘 4、创建主分区 5、创建物理卷 6、打包为一个卷组 7、创建逻辑卷 8、格式化逻辑卷 9、挂载逻辑卷--开机自…

Go学习第十四章——Gin请求与响应

Go web框架——Gin请求与响应 1 响应1.1 String1.2 JSON&#xff08;*&#xff09;1.3 HTML&#xff08;*&#xff09;1.4 XML1.5 文件&#xff08;*&#xff09; 2 请求2.1 请求参数查询参数 (Query)动态参数 (Param)表单参数 (PostForm)原始参数 (GetRawData) 2.2 请求头2.3 …

Ubuntu 22.04 在登录界面循环

问题描述 https://blog.csdn.net/weixin_44023406/article/details/134092271?spm1001.2014.3001.5502 接上一篇&#xff0c;磁盘满了&#xff0c;扩展空间之后能正常开机&#xff0c;进到登录界面&#xff0c;输密码3秒后又回到登录界面 分析解决问题 命令行能登录&#…

Vue 项目中使用 Pinia 状态管理详细教程

Pinia 是一个用于状态管理的现代 Vue 3 库&#xff0c;它提供了强大的工具来管理 Vue 应用程序的状态。以下是在 Vue 项目中使用 Pinia 的详细教程&#xff1a; 步骤 1&#xff1a;安装 Pinia 首先&#xff0c;你需要安装 Pinia。你可以使用 npm 或 yarn 安装它&#xff1a; …

【送书福利-第二十一期】《ChatGPT进阶:提示工程入门》

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号&#xff1a;程序员洲洲。 &#x1f388; 本文专栏&#xff1a;本文…

Java架构师系统安全

目录 1 导学2 信息安全基础知识3 信息安全系统的组成框架4 信息安全技术4.1 加密技术4.2 对称加密技术4.3 非对称加密技术4.4 信息摘要4.5数字签名5 信息安全的抗攻击技术5.1 ARP欺骗的原理5.2 ARP欺骗的防范措施5.3 IP欺骗的原理和流程6 信息安全的保证体系和评估方法7 网络安…

elementUI 特定分辨率(如1920*1080)下el-row未超出一行却换行

在1920*1080分辨率下&#xff0c; el-col 内容未超出 el-col 宽度&#xff0c;el-col 不足以占据一行&#xff0c;el-row 却自动换行了&#xff08;其他分辨率没有这个问题&#xff09;。 截图&#xff1a; 排查&#xff1a; el-col 内容没有溢出&#xff1b;没有多余的 pad…

TELUS Ventures(泰勒斯)

TELUS Ventures&#xff08;泰勒斯&#xff09;高峰论坛于2023年10月28日在南京第5站正式开幕。该论坛是由泰勒斯风险投资公司主办的一项重要活动&#xff0c;旨在促进创新和创业精神的发展 。 这次高峰论坛将汇集来自全球各地的创业者、投资者和行业专家&#xff0c;共同探讨…

Mac 版 WPS 接入 WPS AI,支持内容创作、修改文章、提炼重点等功能

导读近日消息&#xff0c;“WPS 办公助手”公众号发文宣布&#xff0c;Mac 版 WPS 现已接入 WPS AI&#xff0c;将带来内容生成、内容修改、辅助阅读等功能。 汇总 Mac 版 WPS 接入 WPS AI 之后&#xff0c;在文字、PDF 方面的功能如下&#xff1a; 一键生成文章大纲、讲话稿、…

TS中类型别名和接口区别

在很多场景下&#xff0c;interface 和 type都能使用&#xff0c;因此两者在很多时候会被混淆&#xff1a; 接口可以通过之间的继承&#xff0c;实现多种接口的组合 使用类型别名也可以实现多种的&#xff0c;通过&连接,有差异&#xff1a; 子接口中不能重新覆盖父接口中…

UWB室内定位技术

室内定位系统方案中&#xff0c;UWB室内定位技术目前应用较多&#xff0c;得益于UWB室内定位10-30厘米的超高定位精度。 UWB全称是超宽带技术&#xff0c;它是一种无线载波通信技术。 UWB不采用载波&#xff0c;而是利用纳秒至微微秒级的非正弦波窄脉冲传输数据。 目前根据使用…

公众号留言功能有必要开吗?如何开通留言?

为什么公众号没有留言功能&#xff1f;2018年2月12日&#xff0c;TX新规出台&#xff1a;根据相关规定和平台规则要求&#xff0c;我们暂时调整留言功能开放规则&#xff0c;后续新注册帐号无留言功能。这就意味着2018年2月12日号之后注册的公众号不论个人主体还是组织主体&…

队列(8.6)

目录 2.队列 2.1队列的概念及结构 2.2队列的实现 2.2.1初始化队列 2.2.2队尾入队列 2.2.3队头出队列 2.2.4获取队列头部元素 2.2.5 销毁队列 3.栈和队列面试题 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 232. 用栈实现队列 - 力扣&#xff08;LeetC…

力扣每日一题73:矩阵置零

题目描述&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2…

java集成海康预览抓图出现内存一直上涨问题

求助&#xff1a;在java 中集成海康sdk后批量抓图出现内存上涨问题&#xff0c;不论是预览后不关闭继续预览&#xff0c;还是预览后关闭预览&#xff0c;然后重新预览都没有解决这个问题&#xff08;抓图正常&#xff09;&#xff0c;尝试使用第三方解码器ffmpeg来进行解码&…

刀具磨损状态识别(Python代码,MSCNN_LSTM_Attention模型,初期磨损、正常磨损和急剧磨损分类,解压缩直接运行)

1.运行效果&#xff1a;刀具磨损状态识别&#xff08;Python代码&#xff0c;MSCNN_LSTM_Attention模型&#xff0c;初期磨损、正常磨损和急剧磨损&#xff09;_哔哩哔哩_bilibili 环境库&#xff1a; NumPy 版本: 1.19.4 Pandas 版本: 0.23.4 Matplotlib 版本: 2.2.3 Keras …

深圳大学计软《程序设计基础》课后实验二:选择结构

A. ASCII码排序&#xff08;循环&#xff09; 题目描述 输入三个字符后&#xff0c;按各字符的ASCII码从小到大的顺序输出这三个字符。 输入 输入多组数据&#xff0c;每组占一行&#xff0c;有三个字符组成&#xff0c;之间无空格 输出 对于每组输入数据&#xff0c;输出…

Android JNI/NDK 入门从一到二

1. 前言 最基础的创建JNI接口的操作&#xff0c;可以直接看这篇文章 : 第一个Android JNI工程&#xff0c; 本文会基于掌握创建JNI接口的操作的基础之上&#xff0c;来入门JNI/NDK。 2. 在JNI中打印日志 2.1 添加log模块 记得CMake中有log模块&#xff0c;不然编译不过 ta…

正点原子嵌入式linux驱动开发——Linux 多点电容触摸屏

随着智能手机的发展&#xff0c;电容触摸屏也得到了飞速的发展。相比电阻触摸屏&#xff0c;电容触摸屏有很多的优势&#xff0c;比如支持多点触控、不需要按压&#xff0c;只需要轻轻触摸就有反应。ALIENTEK的三款RGB LCD屏幕都支持多点电容触摸&#xff0c;本章就以ATK7016这…

制作电子版宣传画册,抢占线上消费市场

随着互联网和移动设备的普及&#xff0c;企业在如今如此激烈的市场竞争中&#xff0c;怎样才能提高自身的宣传力度&#xff0c;进而让企业在市场中占一席之地呢&#xff1f;现在大多数企业都青睐于借助电子画册的形式来实现。 如何制作电子版宣传画册&#xff0c;抢占市场消费资…