k8s 基于MutatingWebhookConfiguration实现node超卖和sidecar注入

news2024/12/24 11:28:27

k8s 基于MutatingWebhookConfiguration实现node超卖和sidecar注入

源码在:https://github.com/Seaiii/MutatingWebhook我写了几个脚本,可以直接运行。

一、MutatingWebhookConfiguration原理

MutatingWebhookConfiguration 是 Kubernetes 中的一种资源对象,用于配置 Mutating Admission Webhook。Mutating Admission Webhook 是一种 Kubernetes 的扩展机制,用于在对象被持久化到 etcd 存储之前,对其进行动态修改或补充。

MutatingWebhookConfiguration 定义了一个或多个 Mutating Admission Webhook 的配置信息,包括 Webhook 的 URL、服务名称、路径等。当 Kubernetes API Server 接收到创建、更新或删除对象的请求时,它将触发适用于该对象类型的 Mutating Admission Webhook。

Mutating Admission Webhook 在对象持久化之前,对对象进行拦截并进行修改或补充。它可以在不改变原始请求的情况下,通过返回修改后的对象副本来实现动态的对象转换。这使得用户能够通过自定义的逻辑对 Kubernetes 对象进行自动化的修改,例如自动注入额外的标签、注解、容器、卷等。

MutatingWebhookConfiguration 的工作原理如下:

创建 MutatingWebhookConfiguration 对象并将其提交到 Kubernetes 集群。这个对象定义了一个或多个 Mutating Admission Webhook 的配置。

Kubernetes API Server 在接收到创建、更新或删除对象的请求时,会检查适用于该对象类型的 Mutating Admission Webhook 配置。

Kubernetes API Server 将请求发送到 Mutating Admission Webhook 的 Webhook URL。

Mutating Admission Webhook 接收到请求后,根据预定义的逻辑对请求中的对象进行修改或补充,并生成修改后的对象副本。

Mutating Admission Webhook 将修改后的对象副本作为响应返回给 Kubernetes API Server。

Kubernetes API Server 使用修改后的对象副本进行后续的持久化操作。

MutatingWebhookConfiguration 和 Mutating Admission Webhook 提供了一种可扩展的方式,允许用户根据自定义的业务需求对 Kubernetes 对象进行自动化修改。这在实践中被广泛应用于诸如自动注入 sidecar、自动配置密钥等场景中。
在这里插入图片描述

二、超卖/sidecar思路

1.场景
超卖的场景可以很容易避免。只要设置了resource最低和适当的limits,就可以避免超卖。但是有种场景就是用户不知道这个值,本来1M内存使用量,但是设置了resource为3M。这样就导致pod占用了3M的内存,然而有2M是闲置状态。这时候就可以使用动态超卖来把那浪费的2M内存使用出来
2.思路
节点Node的Status种有两个字段,分别是Allocatable(可分配)和Capacity(总量)结构体。实现资源超卖的关键在于动态修改节点Node对象的allocatable字段值。如果使用clinet-go动态的修改这个字段,是无法实现的。因为修改后只是短暂的,Node资源对象比较特殊,计算节点会不断给ApiServer发送心跳(默认每隔10s发一次),将带有Status字段的真实信息发送给ApiServer,并更新到etcd中。也就是无论你怎么通过patch/put方法去修改Node的Status字段,计算节点都会定时通过发送心跳将真实的Status数据覆盖你修改的数据,也就是说我们无法通过直接调用RESTful API修改Node对象中的Status数据。所以这时候需要引入MutatingWebhookConfiguration资源对象,在apiserver发送给etcd之前,会先发送给MutatingWebhookConfiguration。然后通过我们注册的回调函数,来修改status,在发送给etcd,骗过etcd。

三、实现MutatingWebhookConfiguration

可以简单介绍下MutatingWebhookConfiguration流程步骤
流程步骤介绍:我们需要创建service、MutatingWebhookConfiguration、deployment来实现流程。当apiserver发起心跳后,在MutatingWebhookConfiguration中rule注册的规则中会触发。然后通过MutatingWebhookConfiguration中的service触发到我们的service,通过service转发到deployment的pod,然后实现回调。

这三个yaml在github中都有存在。

1.需要修改api-server的配置。如果是kubeadm安装的,可以如下修改

vi /etc/kubernetes/manifests/kube-apiserver.yaml 

修改以下配置开启MutatingAdmissionWebhook。
- --enable-admission-plugins=NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook

2.配置签名证书
github中的cfssl.sh已经帮助生产证书(要修改以下你的apiserver的ca位置)

#生成key,用k8s的ca证书进行签名,注意:-ca和-ca-key=的目录是你k8s的master主机存放CA文件的位置

cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -hostname=webhook.default.svc -profile=server server-csr.json | cfssljson -bare server

生成证书后需要生成secret资源,后续deployment需要挂载这个secret

kubectl create secret tls admission-registry-tls  --key=server-key.pem --cert=server.pem

3.生成必要的三个yaml
github中的statr.sh脚本中可以快速运行pod并触发node更新操作。(要修改以下你本机的deployment位置)
MutatingWebhookConfiguration.yaml

apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
  name: demo-webhook
webhooks:
  - sideEffects: None
    admissionReviewVersions:
      - v1
      - v1beta1
    name: webhook.default.svc
    clientConfig:
      service:
        name: webhook#你的server服务的名字
        namespace: default
        path: "/webhook"
      caBundle: #这个是你的api-server的ca
    rules:
      - operations: [ "UPDATE" ]
        apiGroups: [ "*" ]
        apiVersions: [ "v1" ]
        resources: [ "nodes/status"]

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: webhook-example-deployment
  labels:
    app: webhook-example
spec:
  replicas: 1
  selector:
    matchLabels:
      app: webhook-example
  template:
    metadata:
      labels:
        app: webhook-example
    spec:
      nodeName: k8s-master
      containers:
        - name: webhook-example
          image: webhook-example:20230517-144113
          command: [ "/node" ]
          ports:
            - containerPort: 8443
              name: webhook-api
          args:
            - -v=4
            - -log_dir=log -alsologtostderr
          volumeMounts:
            - name: webhook-certs
              mountPath: /etc/webhook/certs
              readOnly: true
            - name: kubeconfig
              mountPath: /etc/
      volumes:
        - name: webhook-certs #这个是上面生成的secret
          secret:
            secretName: admission-registry-tls
        - name: kubeconfig
          hostPath:
              path: /root/.kube/ #这个要改成你本地的kubeconfig的位置,用于client-go的客户端连接
              type: Directory


service.yaml

apiVersion: v1
kind: Service
metadata:
  name: webhook
  labels:
    app: admission-webhook-example
spec:
  ports:
    - port: 443
      targetPort: webhook-api
  selector:
    app: webhook-example

执行github中的start.sh可以一步生成,或者你可以根据里面的步骤手动生成,我都做了注释。
**注:**我们需要获得node的实际使用量,所以需要Metrics,需要跑起来这个pod,后续的代码中才可以使用这个Metrics客户端。百度下载components.yaml执行即可了(可以百度获取很多)。
在这里插入图片描述

四、代码实现

1.代码的逻辑很简单,创建server接受https请求,需要tls校验证书。

cert, err := tls.LoadX509KeyPair("/etc/webhook/certs/tls.crt", "/etc/webhook/certs/tls.key")
	if err != nil {
		glog.Errorf("get cert fail.err is :", err)
		panic(err)
	}

	// Creating a TLS Configuration
	tlsConfig := &tls.Config{
		Certificates: []tls.Certificate{cert},
	}
	// Create an HTTP server
	server := &http.Server{
		Addr:      ":8443",
		TLSConfig: tlsConfig,
	}

	// start services
	http.Handle("/webhook", New(&applyNode{}))
	client.NewClientK8s()
	if err := server.ListenAndServeTLS("", ""); err != nil {
		glog.Errorf("server start fail,err is:", err)
		panic(err)
	}

2.证书校验成功后,将收到apiserver发过来的消息,对接受消息进行校验,并拿到Node.Status.Capacity的值和MetricsApi的值

	//...省略
	node := corev1.Node{}
	obj, _, err := Codecs.UniversalDecoder().Decode(admissionReviewReq.Request.Object.Raw, nil, &node)
	//...省略
    if _, ok := obj.(*corev1.Node); ok {
		bytes, err = nodePatch(admissionReviewReq, node)
	}

3.拿到我们该有的数据后,做校验和自己的业务就可以了。
全部代码在github中。感兴趣的可以给个stat

五、sidecar注入pod
代码中并没有介绍sidecar模式,其实看到这里相信也都明白原理了,只要在MutatingWebhookConfiguration.yaml中的resources中加入“pods”,operations加入“CREATE”即可。这样当pod有创建时候,就会调用MutatingWebhookConfiguration的回调。

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

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

相关文章

【代码随想录】刷题Day31

1.分发饼干 455. 分发饼干 贪心的思路就是:小的饼干尽量去匹配胃口小的孩子,这样才能实现尽可能多孩子吃到。 那么代码就很好写了: 1.排序g和s,这样方便查找小的数 2.饼干的位置不停遍历,对应我们需要一个ret代表当前…

语义分割mask转json

文章目录 1 mask2json ——代码实现1.1 通过mask获取每个类别对应的灰度值1.2 mask 转 json 2 mask2json ——利用工具转2.1支持数据增强2.2 支持多种格式转换 本文介绍两种语义分割mask转json的方法: 方法1:是参考语义分割mask转json(改进版…

教你用python的Streamlit库制作可视化网页应用

目录 步骤1:安装 Streamlit步骤2:创建一个新的 Python 文件步骤3:导入必要的库步骤4:编写应用程序代码步骤5:运行应用程序常用组件 当涉及到编写交互式应用程序时,Streamlit 是一个非常流行和强大的 Python…

图神经网络:处理点云

文章说明: 1)参考资料:PYG官方文档。超链。 2)博主水平不高,如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook和有关文献。超链。提取码8848。 文章目录 简单前置工作学习文献阅读Point的实现模型问题 简单前置工作学…

用项目管理思维来过5·20,真实太酷啦!

明天就是一年一度的520啦,阿道单身多年的同事刚京在四月成功使用SWOT分析模型相亲成功,牵手女嘉宾。二人眼看着就要迎来在一起后的第一个节日520,刚京却因为没有头绪而陷入了不知所措的焦虑。 团队成员齐上阵,用项目管理思维&…

使用 Apache Flink 开发实时 ETL

Apache Flink 是大数据领域又一新兴框架。它与 Spark 的不同之处在于,它是使用流式处理来模拟批量处理的,因此能够提供亚秒级的、符合 Exactly-once 语义的实时处理能力。Flink 的使用场景之一是构建实时的数据通道,在不同的存储之间搬运和转…

<组件封装:Vue + elementUi 通过excel文件实现 “ 批量导入 ” 表单数据,生成对应新增信息 >

Vue elementUi 通过excel文件实现 “ 批量导入 ” 表单数据,生成对应新增信息 👉 前言👉 一、封装组件对应API及绑定事件> Attributes> Event 👉 二、实现案例> HTML父组件模板> 子组件模板 👉 三、效果演…

线程相关基础知识

一、相关概念 1.1 cpu 中央处理器(central processing unit, 简称cpu ),计算机系统的 运算 和 控制 核心 1.2 cpu核心数和线程数 cpu核心数指cpu 内核数量,如双核、四核、八核。 cpu线程数是一种逻辑的概念,就是模…

基于 SpringBoot + Redis 实现分布式锁

大家好,我是余数,这两天温习了下分布式锁,然后就顺便整理了这篇文章出来。文末附有源码链接,需要的朋友可以自取。 至于什么是分布式锁,这里不做赘述,不了解的可以自行去查阅资料。 文章目录 实现要点项目…

android13 FLAG_BLUR_BEHIND 壁纸高斯模糊,毛玻璃背景方案设计-千里马framework实战

hi,粉丝朋友们! 今天有个学员朋友,问到了一个高斯模糊相关问题,这个高斯模糊相关的需求我相对还是比较熟悉,下面来重点讲解一下新版本高斯模糊相关的实现。 更多framework干货知识手把手教学 Log.i("qq群",“422901085…

[230528] 托福阅读真题|TPO66 13/30|整卷得分22/30|9:45~10:45|15:40~16:40

The Actor and the Audience P1 rehearsev 排练;排演anticipate v 预期;预料;预见 audiencen 观众brilliantadj 灿烂的;绝妙的rehearsaln 排练;预演;排演crumblev 崩塌stage frightn 怯场(演员…

自动化测试框架?这应该是全网最全自动化框架总结了,你要的都有...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Python自动化测试&…

学术加油站|基于LSM-tree存储系统的内存管理,最大限度降低I/O成本

本文系北京理工大学科研助理牛颂登所著,本篇也是 OceanBase 学术系列稿件第 10 篇。欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/ 「牛颂登:北京理工大学科研助理,硕士期间在电子科技大学网络空间安全研究院从…

资深老鸟总结,Selenium自动化测试实战小技巧,不要再走弯路了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Selenium4自动化测…

数据库小技能:数据报表

文章目录 I 需求1.1 补贴II 实现思路2.1 生成资金调节报表数据III Dto3.1 报表基本查询IV 接口I 需求 代理商调节活动汇总商户调节活动汇总激励金日月汇总数据源:活动流水表(上游回调) 1.1 补贴 调节活动补贴= D0补贴+T1补贴。(比如交易金额满足1000,转T1) 补贴金额 =…

图扑数字孪生智慧灯杆,“多杆合一”降本增效

前言 随着智慧城市建设的不断深入,智慧灯杆作为城市基础设施的重要组成部分,正在成为城市智能化和绿色化的重要手段之一。 效果展示 图扑智慧灯杆系统在城市道路照明领域引入信息化手段,通过构建路灯物联网,实现了现代化的路灯按…

线性代数 --- Gram-Schmidt, 格拉姆-施密特正交化(下)

Gram-Schmidt正交化过程 到目前为止,我们都是在反复强调“对于无解的方程组Axb而言,如果矩阵A是标准正交矩阵的话,就怎么怎么好了。。。。”。因为,不论是求投影还是计算最小二乘的正规方程,他们都包含了。当A为标准正…

yolov4论文解读

数据层面上的数据增强 四张照片拼接成一张进行训练 相当于增大了batch-size,更适合于单GPU。 Mosaic data augmentation 马赛克数据增强 self-adversarial training(SAT) 自我对抗训练 DropBlock Label Smoothing 损失函数 由IOU改进到CIOU 网络结构 CSPNet&…

Win10 WLAN驱动正常但仍然不显示无线网络解决办法

Win10 WLAN驱动正常但仍然不显示无线网络解决办法 写作背景过程解决方案结尾 写作背景 本菜鸡重置了电脑的网络,然后重新启动后 WLAN 不见了,连不了 WIFI 了,很疑惑,后来经过一番搜索找到了问题所在,写下本篇文章以记…

Spark/Flink广播实现作业配置动态更新

前言 在实时计算作业中,往往需要动态改变一些配置,举几个栗子: 实时日志ETL服务,需要在日志的格式、字段发生变化时保证正常解析;实时NLP服务,需要及时识别新添加的领域词与停用词;实时风控服…