kubernetes Adminssion Webhook 准入控制器 (ImagePolicyWebhook)

开头语

写在前面:如有问题,以你为准,

目前24年应届生,各位大佬轻喷,部分资料与图片来自网络

介绍 原理 流程

Admission Webhook 准入控制器Vebhook是准入控制插件的一种,用于拦截所有向APISERVER发送的 请求,并且可以修改请求或拒绝请求。

即拦截进出的流量,对k8s来说即为apiserver的请求

Admission webhook 为开发者提供了非常灵活的插件模式,在kubernetes资源持久化,之前,管理员通过程序 可以对指定资源做校验、修改等操作。例如为资源自动打标签、pod设置默认SA,自动注入sidecar容器等。

https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/admission-controllers/

相关Vebhook.准入控制器:

webhook 是一个api,用于处理一个轻量级的事件

  1. MutatingAdmissionWebhook  修改资源,理论上可以监听并修改任何经过ApiServer处理的请求
  2. ValidatingAdmissionWebhook 验证资源
  3. ImagePolicyWebhook              镜像策略,主要验证镜像字段是否满足条件 (仓库,tag)

流程:当 api 接收到这个请求后,并进行身份验证授权(Authentication),通过调用准入控制的接口来处理传入过来的资源,资源会传入到Webhook(Mutating),进行对象架构验证(object),再进行资源验证,查看字段是否符合要求(Validating),最后传入etcd中(Persisted to etcd)

ImagePolicyWebhook

架构

本次示例使用的方法是

通过docker 跑一个能进行api检测的python程序

通过将传给apiserver创建pod api 传到python docker 上进行检测镜像版本标签

如果不带标签则返回给apiserver拒绝语句,如果带标签则返回接收语句

启用

mkdir /etc/kubernetes/image-policy/vim admission_configuration.yaml

apiVersion: apiserver.config.k8s.io/v1kind: AdmissionConfigurationplugins:- name: ImagePolicyWebhookconfiguration:   imagePolicy:kubeConfigFile: /etc/kubernetes/image-policy/connect_webhook.yaml# 链接镜像策略服务器配置文件# 以秒计的时长,控制批准请求的缓存时间allowTTL: 50# 以秒计的时长,控制拒绝请求的缓存时间denyTTL: 50# 以毫秒计的时长,控制重试间隔retryBackoff: 500# 确定 Webhook 后端失效时的行为defaultAllow: true
[root@master opa]# cp /root/.kube/config /etc/kubernetes/image-policy/connect_webhook.yaml[root@master opa]# vim /etc/kubernetes/image-policy/connect_webhook.yaml

zip文件在最顶部

[root@master webhook]# unzip image-policy-webhook.zipArchive:  image-policy-webhook.zipcreating: image-policy-webhook/inflating: image-policy-webhook/Dockerfileinflating: image-policy-webhook/main.pyinflating: admission_configuration.yamlinflating: connect_webhook.yamlinflating: image-policy-certs.sh
[root@master image-policy-webhook]# docker pull library/pythonUsing default tag: latestlatest: Pulling from library/python8457fd5474e7: Pull complete13baa2029dde: Pull complete[root@master image-policy-webhook]# docker build -t webhook-python .Sending build context to Docker daemon  3.584kBStep 1/9 : FROM python---> a5d7930b60ccStep 2/9 : RUN useradd python---> Running in 6a893ebbc97e[root@master webhook]# chmod +x image-policy-certs.sh[root@master webhook]# ./image-policy-certs.sh2023/11/15 22:18:52 [INFO] generating a new CA key and certificate from CSR2023/11/15 22:18:52 [INFO] generate received request2023/11/15 22:18:52 [INFO] received CSR2023/11/15 22:18:52 [INFO] generating key: rsa-20482023/11/15 22:18:52 [INFO] encoded CSR2023/11/15 22:18:52 [INFO] signed certificate with serial number 398279219301203323549582120090204513829311272852023/11/15 22:18:52 [INFO] generate received request2023/11/15 22:18:52 [INFO] received CSR2023/11/15 22:18:52 [INFO] generating key: rsa-20482023/11/15 22:18:52 [INFO] encoded CSR2023/11/15 22:18:52 [INFO] signed certificate with serial number 1570856602901045334266404907327489480281091292052023/11/15 22:18:52 [INFO] generate received request2023/11/15 22:18:52 [INFO] received CSR2023/11/15 22:18:52 [INFO] generating key: rsa-20482023/11/15 22:18:53 [INFO] encoded CSR2023/11/15 22:18:53 [INFO] signed certificate with serial number 204521525146112413584953707273934577096910785552023/11/15 22:18:53 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable forwebsites. For more information see the Baseline Requirements for the Issuance and Managementof Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);specifically, section 10.2.3 ("Information Requirements").
[root@master webhook]# lsadmission_configuration.yaml  apiserver-client.pem  ca-key.pem             image-policy-webhook      webhook-key.pemapiserver-client.csr          ca-config.json        ca.pem                 image-policy-webhook.zip  webhook.pemapiserver-client-csr.json     ca.csr                connect_webhook.yaml   webhook.csrapiserver-client-key.pem      ca-csr.json           image-policy-certs.sh  webhook-csr.json[root@master webhook]# cp webhook* image-policy-webhook[root@master webhook]# cd image-policy-webhook/docker run -d -u root --name=webhook-python \-v $PWD/webhook.pem:/data/www/webhook.pem \-v $PWD/webhook-key.pem:/data/www/webhook-key.pem \-e PYTHONUNBUFFERED=1 -p 8080:8080 \webhook-python
[root@master image-policy-webhook]# docker ps -a | grep pythonfe9713e647e8   webhook-python                                      "/bin/sh -c 'python …"   11 seconds ago   Exited (1) 9 seconds ago             webhook-python

[root@master webhook]# cp /root/k8s/cks/webhook/webhook.pem /etc/kubernetes/image-policy/[root@master webhook]# cp /root/k8s/cks/webhook/apiserver-client-key.pem /etc/kubernetes/image-policy/[root@master webhook]# cp /root/k8s/cks/webhook/apiserver-client.pem /etc/kubernetes/image-policy/[root@master webhook]# ls /etc/kubernetes/image-policy/admission_configuration.yaml  apiserver-client-key.pem  apiserver-client.pem  connect_webhook.yaml  webhook.pem

下面文件的 /etc/kubernetes/image-policy 是容器内的路径

apiVersion: v1kind: Configclusters:- cluster:certificate-authority: /etc/kubernetes/image-policy/webhook.pem # 数字证书,用于验证远程服务server: https://192.168.100.53:8080/image_policy # 镜像策略服务器地址,必须是httpsname: webhookcontexts:- context:cluster: webhookuser: apiservername: webhookcurrent-context: webhookpreferences: {}users:- name: apiserveruser:client-certificate: /etc/kubernetes/image-policy/apiserver-client.pem # webhook准入控制器使用的证书client-key: /etc/kubernetes/image-policy/apiserver-client-key.pem # 对应私钥证书

开启插件并使用hostpath 数据卷将宿主机/etc/kubernetes/image-policy目录挂载到容器中

    - --enable-admission-plugins=NodeRestriction,ImagePolicyWebhook - --admission-control-config-file=/etc/kubernetes/image-policy/admission_configuration.yaml# 挂载卷添加- mountPath: /etc/kubernetes/image-policyname: image-policy- hostPath:path: /etc/kubernetes/image-policytype: DirectoryOrCreatename: image-policy

systemctl restart kubelet

测试

是通过python docker 中的python函数进行判断的是否执行创建操作

[root@master image-policy-webhook]# kubectl run web --image=nginxError from server (Forbidden): pods "web" is forbidden: image policy webhook backend denied one or more images: 检查镜像失败!镜像标签不允许使用latest![root@master image-policy-webhook]# kubectl run web --image=nginx:1.17.1pod/web created[root@master image-policy-webhook]# kubectl get podNAME   READY   STATUS    RESTARTS   AGEweb    1/1     Running   0          5s

策略解析(python)

镜像中的python程序

from flask import Flask,request
import jsonapp = Flask(__name__)@app.route('/image_policy',methods=["POST"])
def image_policy():post_data = request.get_data().decode()#print("POST数据: %s" %post_data)data = json.loads(post_data)for c in data['spec']['containers']:if ":" not in c['image'] or ":latest" in c['image']:  # 如果镜像里不带冒号或者带:latest说明是镜像使用latest标签allowed, reason = False, "检查镜像失败!镜像标签不允许使用latest!"breakelse:allowed, reason = True, "检查镜像通过."print("检查结果: %s" %reason)result = {"apiVersion": "imagepolicy.k8s.io/v1alpha1","kind": "ImageReview","status": {"allowed": allowed,"reason": reason}}return json.dumps(result,ensure_ascii=False)if __name__ == "__main__":app.run(host="0.0.0.0",port=8080,ssl_context=('/data/www/webhook.pem','/data/www/webhook-key.pem'))

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

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

相关文章

超声波清洗机是智商税吗?哪些超声波清洗机值得买?这些值得入手

自打超声波清洗机问世以来,就有非常多朋友会有这个疑问!超声波清洗机到底是不是智商税呢?其实不光是大家,一开始我也有这个疑问,但是通过了解了超声波清洗机的一些工作原理之后,会发现,其实超声…

服务器组网方案

在当今数字化时代,服务器组网方案不仅是企业信息管理的关键,更是支撑业务运作的核心架构 。为了实现高效的数据处理和存储,服务器组网方案成为企业不可或缺的一部分。本文将深入探 讨服务器组网方案的核心要素和实施策略,明确其在…

RTMP vs SRT:延迟与最大带宽的比较

引言 文来自Haivision的白皮书,比较了RTMP和SRT两种流媒体协议的优缺点,并通过实验测试了两种协议在延迟和最大带宽两方面的表现。 本文福利, 免费领取C音视频学习资料包学习路线大纲、技术视频/代码,内容包括(音视频…

zabbix监控部署

目录 一、什么是zabbix? 二、zabbix监控原理 三、zabbix常见的五个程序 四、zabbix监控mysql实验 1、部署服务端 2、部署客户端 3、自定义监控内容 一、什么是zabbix? zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的…

如何让GPT支持中文

上一篇已经讲解了如何构建自己的私人GPT,这一篇主要讲如何让GPT支持中文。 privateGPT 本地部署目前只支持基于llama.cpp 的 gguf格式模型,GGUF 是 llama.cpp 团队于 2023 年 8 月 21 日推出的一种新格式。它是 GGML 的替代品,llama.cpp 不再…

构建异步高并发服务器:Netty与Spring Boot的完美结合

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 ChatGPT体验地址 文章目录 前言IONetty1. 引入依赖2. 服务端4. 客户端结果 总结引导类-Bootstarp和ServerBootstrap连接-NioSocketChannel事件组-EventLoopGroup和NioEventLoopGroup 送书…

C#之反编译之路(二)

先阅读C#之反编译之路(一)可以增加文章连续性 阅读C#之反编译之路(一) 如何快速定位代码位置 用一个小小的例子举例,用户反馈新能源车牌号无法录入,燃油车牌正常,查看日志报如下错误 拿到关键字车牌号长度错误直接反编译代码 打开dnSpy.exe→加载项目→CtrlF打开搜索框→输入…

学习笔记16——操作系统

学习笔记系列开头惯例发布一些寻亲消息,感谢关注! 链接:https://www.mca.gov.cn/lljz/indexdetail.html?idd0afa7f6f36946319a206d61937f9b63&type0&t10.11199120579373845 八股——操作系统一些基础知识整理 一个java程序对应一个…

极海APM32F003通过IEC 60730/60335功能安全认证,为产品安全保驾护航

近日,极海APM32F003系列工业级超值型MCU,已顺利通过IEC 60730/60335功能安全认证,并可提供符合CLASS B标准的功能安全设计套件,有助于客户减少认证时间与成本,快速推出稳定可靠的终端产品。 *VDE是德国的一个权威性电气…

Spring - 配置支持多数据源

目录 SpringBoot整合多数据源整合步骤具体整合步骤如下:1、在application.properties中配置出多个数据源2、在代码中创建出mapper目录,在mapper目录下创建出不同数据源的目录创建出目录MySQL数据源的MapperSQL Server数据源的Mapper 3、创建config packa…

Excel:通过excel将表数据批量转换成SQL语句

这里有一张表《student》,里面有10条测试数据,现在将这10条测试数据自动生成 insert语句,去数据库 批量执行 P.S. 主要用到excel表格中的 CONCATENATE函数,将单元格里面的内容填入到sql里面对应的位置 1. 先写好一条insert语句&a…

Vue使用printJS导出网页为pdf、printJS导出pdf

先放几个参考链接 感谢! Vue使用PrintJS实现页面打印功能_vue print.js 设置打印pdf的大小-CSDN博客 前台导出pdf经验汇总 (html2canvas.js和浏览器自带的打印功能-print.js)以及后台一些导出pdf的方法_iqc后台管理系统怎么做到导出pdf-CSD…

使用fs.renameSync(oldPath,newPath)方法,报错Error: EPERM: operation not permitted

出错翻译:表示操作被拒绝,因为当前用户没有足够的权限执行该操作。这可能是由于文件或目录 的权限设置不正确或操作系统限制所致 出现错误场景:使用element-plus的Upload 上传功能;后端使用Nodejs提供的fs.renameSync(oldPath,ne…

可碧教你C++——位图

本章节是哈希的延申 可碧教你C——哈希http://t.csdnimg.cn/3R8TU 一文详解C——哈希 位图 位图是基于哈希表的原理产生的一种新的container——bitset 基于哈希映射的原理,我们在查找的时候,可以直接去定址到元素的具体位置,然后直接访问该…

OpenAI ChatGPT-4开发笔记2024-04:Chat之Tool之2:multiple functions

从程序员到ai Expert 1 定义参数和函数2 第一轮chatgpt3 第一轮结果和function定义全部加入prompt再喂给chatgpt4 大结局7 参考资料 上一篇解决了调用一个函数的问题。这一篇扩展为调用3个。n个自行脑补。 1 定义参数和函数 #1.设定目标 import json import openai#1.定义para…

基于JavaWeb+BS架构+SpringBoot+Vue协同推荐的黔醉酒业白酒销售系统的设计和实现

基于JavaWebBS架构SpringBootVue基于协同推荐的黔醉酒业白酒销售系统系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 1.2 国内外研究概况 2 1.3 研究的内容 2 1.4 本章…

mybatisPlus 将List<String>字段转成json字符串,使用JacksonTypeHandler以及自定义类型处理器实现

文章目录 场景使用JacksonTypeHandler实现类型转换自定义StringListTypeHandler处理器实现 场景 项目中经常需要将List转成json存储到配置文件中, mybatisPlus默认实现了JacksonTypeHandler,GsonTypeHandler,FastjsonTypeHandler,也可以自定义…

JAVA基础语句1

目录 前言 一.JAVA特性 简单 面向对象 分布式 多线程 二.关键字 三.对象和类 对象 类 构造方法 创建对象 访问实例变量和方法 源文件声明规则 Java 包 import 语句 总结 前言 这里参考了:Java 教程 | 菜鸟教程 (runoob.com) 第一个必须是: hello world&a…

Github 2024-01-09Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-01-09统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10Jupyter Notebook项目1 Payloads All The Things - 有用的Web应用程序安全负载和绕过列表 创建…

带前后端H5即时通讯聊天系统源码

带有前后端的H5即时通讯聊天系统源码。该源码是一个开源的即时通信demo,需要前后端配合使用。它的主要目的是为了促进学习和交流,并为大家提供开发即时通讯功能的思路。尽管该源码提供了许多功能,但仍需要进行自行开发。该项目最初的开发初衷…