Kubernetes ImagePolicyWebhook与ValidatingAdmissionWebhook【3】validating_admission.go源码解析

article/2025/11/11 8:07:02

文章目录

    • 1. 代码依赖
    • 2. handler的validating_admission.go
      • 2.1 metav1.status是什么?
      • 2.2 admissionReview.Response.Result是什么?
    • 3. 总结

相关阅读

  1. Kubernetes ImagePolicyWebhook与ValidatingAdmissionWebhook【1】动手实践感受区别所在
  2. KubernetesImagePolicyWebhook与ValidatingAdmissionWebhook【2】Image_Policy.go源码解析
  3. Kubernetes ImagePolicyWebhook与ValidatingAdmissionWebhook【3】validating_admission.go源码解析
  4. Kubernetes ImagePolicyWebhook与ValidatingAdmissionWebhook【4】main.go源码解析
  5. kubernetes 快速学习手册

1. 代码依赖

https://pkg.go.dev/k8s.io/api/admission/v1beta1#AdmissionReview
https://pkg.go.dev/k8s.io/api/core/v1#PhotonPersistentDiskVolumeSource.XXX_Size
https://pkg.go.dev/k8s.io/api/imagepolicy/v1alpha1#ImageReview

源码:https://github.com/kainlite/kube-image-bouncer

2. handler的validating_admission.go

我们分析完了handlerImage_Policy.go,接下来运用同样的方式分析validating_admission.go

我们看一下报错信息

$ kubectl describe rc nginx-latest  #警告不允许有latest标签的镜像
.....
Warning  FailedCreate  11s (x14 over 53s)  replication-controller  Error creating: admission webhook "image-bouncer-webhook.default.svc" denied the request: Images using latest tag are not allowed

搜索关键词:Images using latest tag are not allowed

我们看的在validating_admission.go的51行找到了

在这里插入图片描述

2.1 metav1.status是什么?

我们首先看一下代码的依赖去向
在这里插入图片描述
metav1是什么包,还记得在上一篇文章我提到过吧
meta 是字面标签的意思,v1表达的是版本。
包v1包含所有版本都通用的API类型,但它们分为两类,一类是对外的,也就是能为我们开发定制的,另一部分是内部的。总之,我们纵观全览,这个包定义了k8s许多资源对象。
在这里插入图片描述
status.message这里描述的是设定操作状态的描述。根据代码功能需求的描述"Images using latest tag are not allowed",正是我们需要表达的。

2.2 admissionReview.Response.Result是什么?

它的来源是"k8s.io/api/admission/v1beta1",地址是https://pkg.go.dev/k8s.io/api/admission/v1beta1,搜索AdmissionReview
在这里插入图片描述

AdmissionReviewImageReview大同小异,这是定义对象类型、请求属性、返回属性。
在这里插入图片描述

admissionReview.Response.Allowed 是一个布尔值
admissionReview.Response.Result代表的是*metav1.Status类型,然而status的结构体又是包含什么呢?如图:
在这里插入图片描述
meta.status.message表达的是对此状态的一种描述。正好对于代码的输出内容:"Images using latest tag are not allowed"

再往上分析一下usingLatest,即假如存在usingLatest,就将是否允许运用拉取的布尔值设置为false,并输出一个关于存在lastest的描述性问题。
在这里插入图片描述
usingLatest来自rules.IsUsingLatestTag(container.Image),根据上篇文章Kubernetes ImagePolicyWebhook与ValidatingAdmissionWebhook【2】Image_Policy.go源码解析,详细的分析,此函数

  • 当镜像仓库名称不对的时候返回:false,err
  • 当存在lastest的时候返回:true,nil
  • 当仓库名正确并且不存在lastest的时候返回:false,nill

这个有一个与Image_Policy.go不一样的地方,即镜像的获取方式。
在这里插入图片描述
那么它们的区别是什么?
pod来自v1.Pod{},依赖包k8s.io/api/core/v1v1代表稳定版本。
imageReview来自v1alpha1.ImageReviewaplha1代表随时可能抛弃或者存在bug的版本,ImageReview这个结构体主要的目的是为了存放检查pod的镜像的各种存在可能性结果。而pod这个结构体主要的目的是为了存放或者说是描述运行pod的各种信息,包括容器一系列的细节。

为什么他们获取的容器镜像不一样呢,自然是针对不同的准入控制对象有已经成熟的依赖包。根据他们各自所需,通过各自的API获取镜像的方式也就大同小异,回想当初我们部署ImagePolicyWebhookValidatingAdmissionWebhook的时候,ImagePolicyWebhook的针对资源对象是image,依赖的包自然是k8s.io/api/imagepolicy/v1alpha1,而ValidatingAdmissionWebhook则是部署一个k8s资源对象pod,自然依赖的包k8s.io/api/admission/v1beta1

回到validating_admission.go,我们自上而下推断一下这个文件代码的整体流程。

  1. c.bind即是echo web客户端绑定的方法,为了输出打印admissionReview结构体的相关性信息。根据是否报错,输出相关返回结果。
  2. pod := v1.Pod{}是一个获取pod列表的方法。
  3. admissionReview.Response进行初始化,并根据是否有lastest以及是否来自健康的仓库即代码里标注是白名单,修改标志性状态。
  4. 最后打印接受或者拒绝此镜像的信息,并通过http返回admissionReview的json格式。

那么这里有一个问题来了。RegistryWhitelist的逻辑判断是怎么实现的呢?
在这里插入图片描述
rules.IsFromWhiteListedRegistry来自rules目录下from_whitelisted_registry.go,rules目录下的代码是定制逻辑判断规则细节的地方。而validating_admission.go整体看来是对此规则运行的一层包装。
代码如下:
在这里插入图片描述

  • reference.ParseNormalizedNamed(image)在上篇文章中,我们已经做过分析。是对镜像格式严谨式的一次检查,并最终返回它完整的名字。即 r.Name() + ":" + r.tag + "@" + r.digest.String()
  • res := strings.SplitN(named.Name(), "/", 2)指定切割成两个字符串,如果len(res)不等于2表示没有仓库名,返回false
  • 最后如果有仓库名呢,遍历res的字符串,判断是否与whitelist,即符合白名单的仓库名,返回true,nil

终于,validating_admission.go的代码分析结束。我们做一下总结吧。

3. 总结

  1. 关于k8s的包有很多,我们无法记住它全部的使用的方式,但是我们可以先弄清楚知道包名就能推测它的作用,包含了哪些可能的方法。另外,源码包文档有清晰的关于结构体、方法、函数的目录。多看关于项目中涉及到的k8s的应用对提高k8s开发大有裨益,有些常用的方法我可以积累去保存作为笔记,比如:c.Bind(&imageReview)for _, container := range imageReview.Spec.Containersrules.IsUsingLatestTag(container.Image)for _, container := range pod.Spec.ContainersadmissionReview.Response.Result = &metav1.Status等等。
  2. 关于准入控制ImagePolicyWebhookValidatingAdmissionWebhook的开发,目前大概有了个思路,他们有已成熟的API包,根据我们的需求依赖包可以满足我们如何去开发,当然,提供给api-server去调用做出检测,我们就需要一个URL接口,而echo 这个依赖包恰好是非常便利的处理绑定k8s资源信息。除此之外,运用的则是处理输出格式的依赖应用包或者逻辑判断所需的成熟接口方法的包。

http://chatgpt.dhexx.cn/article/FYWPIkDv.shtml

相关文章

Eclipse Validating的作用及优化

今天接手一个小项目,一切导入正常。可是右下角一直出现 28% Validating 项目名 ,如下所示 各种等待有木有,各种崩溃啊有木有,反正我是觉得挺烦的,但是也不知道是干嘛的,如果取消了,造成程序出问…

validating project时间过长,解决办法

validating project时间过长,解决办法 另外,可能有时项目怎么clean也还是原来的样子,可以在浏览器利用快捷键ctrlshiftdelete,清除缓存之后再试试。

解决No validator could be found for constraint ‘javax.validation.constraints.NotBlank‘ validating type

文章目录 1. 复现问题2. 分析问题3. 解决问题4. 重要补充5. 其他说明 1. 复现问题 今天在使用Knife4j调用后端接口,报出如下错误: javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint javax.validation.…

Kubernetes Admission Webhook Validating 与 mutating 实践

Kubernetes Admission Webhook Validating 与 mutating 实践 文章目录 Kubernetes Admission Webhook Validating 与 mutating 实践1. k8s 的配置2. 构建3. 部署服务4. 测试Validating webhook5. 测试 mutating webhook 1. k8s 的配置 启用 MutatingAdmissionWebhook 和 Valid…

Eclipse开发工具中validating长时间卡住不动

编辑Java代码或update 新建Maven项目后,Eclipse开发工具总会停留在validating状态,超长时间的验证代码严重影响程序员心情和工作进度,那么接下来演示如何关闭该功能: 1、点击Window->点击Preferences->点击Validation&#…

validating java_如何禁用Eclipse的Validating

使用Eclipse开发项目,在加载项目、刷新项目、修改了某个代码的时候,经常出现Eclipse正在Validating的提示。项目比较大文件(js)较多的情况下,甚至出现Validating几分钟的盛况。在这几分钟内,性能较差的电脑几乎出现鼠标停滞屏幕僵…

eclipse 的validating长时间卡住不动

方法一、直接关闭 每次maven的update project之后或者是从外部导入一个文件时,总是在validating,超长时间的验证代码,尤其是动态css和JavaScript,让程序员等待久严重影响心情和工作进度,所以将其关闭或是禁用。 如何…

关于eclipse 的validating

一、关闭 每次maven的update project之后,总是在validating,超长时间的验证代码,尤其是动态css和JavaScript,让程序员等待久严重影响心情和工作进度,所以将其关闭或是禁用。 如何关闭,操作步骤如下&#xf…

Eclipse使用时遇到一直在Validating中的解决办法

第一次从服务器检出大型web项目时出现了validating中,一直卡死不动,因此百度查找了很多说法和解决方案,先总结如下: 一、什么是Eclipse的Validating? Eclipse安装之后一般是默认设置好了validation,允许软件对当前项…

LabVIEW编程LabVIEW开发研华通用驱动XNavi 例程与相关资料

LabVIEW编程LabVIEW开发研华通用驱动XNavi 例程与相关资料 研华通用驱动XNavi,XNavi支持DAQNavi的所有产品,提供驱动,并包括多种语言的例程,当然也包括LabVIEW。联网的计算机在安装XNavi后,可直接下载安装。同时也有离…

LabVIEW串口通信

目录 1、串口写入数据 2、串口读取数据 3、清除缓存区 4、设置缓存区 5、数据超时 6、数据终止符 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节的通信方式。在LabVIEW中串口通信…

下载安装LabVIEW

下载安装LabVIEW 介绍下载安装流程下载安装 后续 介绍 LabVIEW 是 工程 师 用来 开发 自动 化 研究、 验证 和 生产 测试 系统 的 图形 化 编 程 环境。Labview作为图形化编程语言,图形控件拖拽式编程,显得更加直观形象,也很容易上手学习。 …

labview自制对话框

自制对话框 前言一、环境二、实现1.找图标2.新建VI,并进行以下设置3.界面布局3.1.放置一个字符串控件用于消息提示3.2.放置一个“确定”和一个“取消”按钮3.3.添加图标显示---画龙点睛3.4.适当调整布局 4.封装4.1.程序框图4.2接口 三、效果 前言 labview提供的对话…

LabView 下载与安装

labview2014是目前labview软件的最新版本,新版本增加了多个VI服务器对象,增加了多个vi脚本对象,增加了labview第三方许可和激活工具包,同时针对程序框图、编辑环境、应用程序生成器、web服务、触摸面板功能、前面板等进行了改进和优化,让用户可以更好的随时随地快速采集、…

labview 各版本及其模块工具下载汇总

labview 各版本模块工具汇总: http://download.ni.com/#evaluation/labview/ekit/other/downloader/http://download.ni.com/#evaluation/labview/ekit/other/downloader/—————————————————————————————————————————— …

VIPM安装超时无法连接到LabVIEW

首先,在LabVIEW中完成以下步骤以配置与VI服务器的连接。 单击工具选项以启动“选项”对话框。从左侧的“类别”部分中选择VI服务器 。勾选“协议”部分的TCP / IP复选框。记住端口号 。3363是默认端口号。您不需要使用默认值,但LabVIEW和VIPM必须被设置…

Labview2015安装教程

1、下载解压文件后,点进去刚刚解压的文件中,找到2015 LV这个软件,右键以管理员身份运行。 2、进去后,点击确定后就可以运行 3、选择第一个Unzip,勾选这两个选择 4、之后弹出这个确认消息,点击确定 5、点…

LabView2019的安装与卸载

LabView2019的安装 注:此版本为英文版,如需要要中文版的请参考LabView2018的安装 1. 下载网盘里面的LabView2019.zip压缩包 百度网盘链接:https://pan.baidu.com/s/1gyiFn5nOdPkLdp-1kRwwHA 提取码:labv    阿里云盘链接&…

labview 界面乱码问题解决

labview 界面乱码问题解决 **首先,打开控制面板的时钟、语言和区域,然后点击更改显示语言 ** 接着分别在格式、位置、管理这三个地方更改为中文(简体,新加坡)、新加坡、中文(简体,新加坡&#…

ubuntu下,下载及安装labview(涉及挂载.iso文件)的方法

在ubuntu环境下安装labview,本文总结了自己在安装过程中遇到的一些问题及解决方法,作为学习记录的同时,也分享一下供大家参考。主要涉及以下几个方面: 1、下载linux系统的安装包 2、.iso安装包的挂载及“只读权限”问题处理 3、…