kubernetes Adminssion Webhook 准入控制器 (ImagePolicyWebhook)

news2024/11/17 7:48:47

开头语

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

目前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/v1

kind: AdmissionConfiguration

plugins:

- name: ImagePolicyWebhook

  configuration:   

    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.zip

Archive:  image-policy-webhook.zip

   creating: image-policy-webhook/

  inflating: image-policy-webhook/Dockerfile

  inflating: image-policy-webhook/main.py

  inflating: admission_configuration.yaml

  inflating: connect_webhook.yaml

  inflating: image-policy-certs.sh
[root@master image-policy-webhook]# docker pull library/python

Using default tag: latest

latest: Pulling from library/python

8457fd5474e7: Pull complete

13baa2029dde: Pull complete

[root@master image-policy-webhook]# docker build -t webhook-python .

Sending build context to Docker daemon  3.584kB

Step 1/9 : FROM python

 ---> a5d7930b60cc

Step 2/9 : RUN useradd python

 ---> Running in 6a893ebbc97e

[root@master webhook]# chmod +x image-policy-certs.sh

[root@master webhook]# ./image-policy-certs.sh

2023/11/15 22:18:52 [INFO] generating a new CA key and certificate from CSR

2023/11/15 22:18:52 [INFO] generate received request

2023/11/15 22:18:52 [INFO] received CSR

2023/11/15 22:18:52 [INFO] generating key: rsa-2048

2023/11/15 22:18:52 [INFO] encoded CSR

2023/11/15 22:18:52 [INFO] signed certificate with serial number 39827921930120332354958212009020451382931127285

2023/11/15 22:18:52 [INFO] generate received request

2023/11/15 22:18:52 [INFO] received CSR

2023/11/15 22:18:52 [INFO] generating key: rsa-2048

2023/11/15 22:18:52 [INFO] encoded CSR

2023/11/15 22:18:52 [INFO] signed certificate with serial number 157085660290104533426640490732748948028109129205

2023/11/15 22:18:52 [INFO] generate received request

2023/11/15 22:18:52 [INFO] received CSR

2023/11/15 22:18:52 [INFO] generating key: rsa-2048

2023/11/15 22:18:53 [INFO] encoded CSR

2023/11/15 22:18:53 [INFO] signed certificate with serial number 20452152514611241358495370727393457709691078555

2023/11/15 22:18:53 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for

websites. For more information see the Baseline Requirements for the Issuance and Management

of 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]# ls

admission_configuration.yaml  apiserver-client.pem  ca-key.pem             image-policy-webhook      webhook-key.pem

apiserver-client.csr          ca-config.json        ca.pem                 image-policy-webhook.zip  webhook.pem

apiserver-client-csr.json     ca.csr                connect_webhook.yaml   webhook.csr

apiserver-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 python

fe9713e647e8   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: v1

kind: Config

clusters:

- cluster:

    certificate-authority: /etc/kubernetes/image-policy/webhook.pem # 数字证书,用于验证远程服务

    server: https://192.168.100.53:8080/image_policy # 镜像策略服务器地址,必须是https

  name: webhook

contexts:

- context:

    cluster: webhook

    user: apiserver

  name: webhook

current-context: webhook

preferences: {}

users:

- name: apiserver

  user:

    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-policy

      name: image-policy

     



  - hostPath:

      path: /etc/kubernetes/image-policy

      type: DirectoryOrCreate

    name: image-policy

systemctl restart kubelet

测试

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

[root@master image-policy-webhook]# kubectl run web --image=nginx

Error 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.1

pod/web created

[root@master image-policy-webhook]# kubectl get pod

NAME   READY   STATUS    RESTARTS   AGE

web    1/1     Running   0          5s

策略解析(python)

镜像中的python程序

from flask import Flask,request
import json

app = 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!"
            break
        else:
            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.coloradmin.cn/o/1368473.html

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

相关文章

企业提升客户体验的实用技巧与策略

什么是客户体验?通俗点说,他是客户和企业在互动过程中收获的感受和印象。这个过程包括接触、预购、购买、使用、售后整个阶段。 联想到我们自己购买产品的过程,对一家店或者品牌的感受,绝不仅仅从产品的功能体验感和质量上获得的…

如何在Android Glide中结合使用CenterCrop和自定义圆角变换(图片部分圆角矩形)

如何在Android Glide中结合使用CenterCrop和自定义圆角变换(图片部分圆角矩形) 在Android开发中,使用Glide加载图片时,我们经常需要对图片进行特定的处理,比如裁剪和圆角变换,特别是一些设计稿,…

【51单片机】点亮第一个LED灯(含创建文件等基础操作)

51单片机现在不仅是电子信息专业学生的必修课,也是进入嵌入式领域的踏脚石。 本系列将会按照江科大的视频进行,也算是相当于一个笔记,进行巩固 实现第一个LED灯的点亮其实并不复杂,重要的是有一些准备工作比较繁琐,就…

关于“Python”的核心知识点整理大全63

目录 20.2.11 使用 Git 跟踪项目文件 1. 安装Git 2. 配置Git 3. 忽略文件 .gitignore 注意 4. 提交项目 20.2.12 推送到 Heroku 注意 20.2.13 在 Heroku 上建立数据库 20.2.14 改进 Heroku 部署 1. 在Heroku上创建超级用户 注意 注意 20.2.11 使用 Git 跟踪项目文件…

两种方式实现mysql截取年月日

select date_format(now(), %Y-%m-%d) select substring(now(), 1, 10)

MySQL面试题(下)

一.面试题案例 二.思维导图 一.面试题案例 1.查询学过「张三」老师授课的同学的信息 select s.*,c.cname,t.tname,sc.score from t_mysql_teacher t, t_mysql_course c, t_mysql_student s, t_mysql_score sc where t.tidc.cid and c.cidsc.cid and sc.sids.sid and t.tnam…

使用 TypeVar 创建 Self 类型变量,方便用户在 Pycharm 编辑器中链式调用校验方法

目录 一、前置说明1、总体目录2、相关回顾3、本节目标 二、操作步骤1、项目目录2、代码实现3、测试代码4、日志输出 三、后置说明1、要点小结2、下节准备 一、前置说明 1、总体目录 《 pyparamvalidate 参数校验器,从编码到发布全过程》 2、相关回顾 使用 Raise…

linux centos 账户管理命令

在CentOS或其他基于Linux的系统上,账户管理涉及到用户的创建、修改、删除以及密码的管理等任务。 linux Centos账户管理命令 1 创建用户: useradd username 这将创建一个新用户,但默认不会创建家目录。如果想要创建家目录,可以…

Mac电脑好用的修图软件:Affinity Photo 2中文 for Mac

Affinity Photo 2提供了广泛的图像编辑和调整工具,使用户能够对照片进行精确的编辑和改进。它支持图像裁剪、旋转、缩放、变形等操作,以及曝光、色彩、对比度、饱和度等调整。 非破坏性编辑:软件采用非破坏性编辑方式,即对原始图…

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-2(1) 质量刚体的在坐标系下运动

本文仅供学习使用,总结很多本现有讲述运动学或动力学书籍后的总结,从矢量的角度进行分析,方法比较传统,但更易理解,并且现有的看似抽象方法,两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有…

【高效开发工具系列】idea注释设置

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【idea】idea 开发快捷键

在Java开发中,有一些常用的快捷键和工具,可以提高开发效率。以下是一些常见的Java开发常用到的功能和快捷键: IDE快捷键: 代码大小写切换: ctrlshiftu 格式化代码:Ctrl Alt L,会让代码更整…

GC9118S—低压 5V 全桥驱动芯片,可替代TMI8118,应用于摄像机,机器人技术等产品上

GC9118S 是一款低压 5V 全桥驱动芯片,为摄像机、消费类产品、玩具和其他低压或者电池供电的运动控制类应用提供了集成的电机驱动解决方案。 GC9118S 能提供高达 1.1A 的持续输出电流。可以工作在 2~6V 的电源电压上。具有 PWM(IN/IN)输入接口…

UE5 C++(十四)— Interface的使用

文章目录 接口(Interface)介绍接口在C中的应用接口在UE中的使用 接口(Interface)介绍 接口是一系列抽象方法的声明,是一些方法特征的集合,这些方法都应该是抽象的,需要由具体的类去实现&#x…

Linux进程通信之管道

目录 1、无名管道 1.无名管道的特点 2.pipe函数创建管道 3.图例 2、命名管道(FIFO) 1.命名管道的特点 2.mkfifo 函数-创建命名管道 3.示例 1.循环读取数据 2.循环写入数据 1、无名管道 管道通常指的就是无名管道, 1.无名管道的特点…

Support Vector Machine 建模(基于三种数据集)

目录 一、 SVM 对于 Iris 数据集的处理 建模: 二、 SVM 对于 弯月数据集的处理 建模: 三、 SVM 对于 direct marketing campaigns (phone calls)数据集的处理 建模: Support Vector Machine (SVM)是一种机器学习算法,属于监…

数据结构排序——选择排序与堆排序(c语言实现)

数据结构排序——选择排序与堆排序(c语言实现) 今天继续排序的内容: 文章目录 1.选择排序1.1基本介绍1.2代码实现1.2.1基础款1.2.2进阶款 2.堆排序2.1基本介绍2.2代码实现 1.选择排序 1.1基本介绍 选择排序(Selection Sort&#…

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

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

Labelimg打标工具编译版使用介绍——免安装conda等python虚拟环境,简单易用上手快,不容易报错

首先直接给出免积分的下载地址,开源软件,直接共享给csdn的各位开发者,求个三连不过分吧。点赞关注收藏。谢谢各位支持 资源地址如下 1 打开D:\xxxxx\labelImg\data内的predefined_classes.txt文件, 修改其中的类别为自己需要的…

JavaWeb——后端之登录功能

6. 登录功能 6.1 登录认证 只进行用户名和密码是否存在的操作 Slf4j RestController public class LoginController {Autowiredpublic EmpService empService;PostMapping("/login")public Result login(RequestBody Emp emp) {log.info("{}员工登录", …