目录

1.什么是 Mutating Admission Webhook?

2.如何用 Mutating Admission Webhook 实现超卖? 

3.实现超卖

3.1 理解目标

3.2 前置准备

3.3 开发 Mutating Webhook

3.4 配置 Webhook Server TLS 认证

3.5 注册 MutatingWebhookConfiguration

3.6 部署 Webhook 到集群

3.7 测试功能 

3.8 监控与告警


1.什么是 Mutating Admission Webhook?

  • 定义:是一种拦截 Kubernetes API 请求的插件,在对象被持久化之前对其进行修改。
  • 典型用途:
  1. 注入默认资源请求/限制(如 CPU/Memory)
  2. 修改 Pod Spec(如注入 sidecar 容器)
  3. 实现多租户资源配额控制

2.如何用 Mutating Admission Webhook 实现超卖? 

场景目标

允许 requests.cpu 超出节点实际物理容量(如 64 核),但通过策略控制其不超过一定比例(如 110%)。

实现思路

1.拦截 Pod 创建请求

使用 Mutating Webhook 拦截所有 Pod 的创建或更新请求。

2.读取当前节点已分配资源

获取该 Pod 即将调度到的节点上已有的 requests.cpu 总和。
可以通过 kubelet 或 metrics-server 获取。

3.判断是否超出超卖上限

若总请求 + 当前 Pod 请求 > Allocatable * OvercommitRatio,则拒绝或自动调整请求值。

4.自动设置默认值(可选)

如果未设置 requests.cpu,可以自动注入一个合理默认值(例如 500m)。

5.返回修改后的 Pod Spec

在 Admission Response 中返回修改后的 Pod Spec。

3.实现超卖

3.1 理解目标


我们希望达到的效果是:

  • 允许 Pod 的 requests.cpu 超出节点实际可分配资源(如 Allocatable=64核)
  • 但限制其总和不超过一定比例(例如:110%)
  • 在 Pod 创建/更新时动态拦截并验证或修改请求内容

3.2 前置准备


环境要求

  • Kubernetes 集群(v1.20+)
  • 启用 MutatingAdmissionWebhook 控制器(默认启用)
  • 安装 kubebuilder 或使用 Go 开发
  • TLS 证书用于 webhook server(可通过 cert-manager 自动生成) 

3.3 开发 Mutating Webhook

1. 初始化项目(使用 kubebuilder)

kubebuilder init --domain example.com
kubebuilder create api --group admission --version v1 --kind OvercommitWebhook

2. 编写 Webhook 核心逻辑

a. 拦截 Pod 创建请求

func (r *PodWebhook) Default(ctx context.Context, obj runtime.Object) error {pod := obj.(*corev1.Pod)// 如果未设置 CPU request,则注入默认值if pod.Spec.Containers != nil {for i := range pod.Spec.Containers {if _, ok := pod.Spec.Containers[i].Resources.Requests[corev1.ResourceCPU]; !ok {pod.Spec.Containers[i].Resources.Requests = corev1.ResourceList{corev1.ResourceCPU: resource.MustParse("500m"),}}}}return nil
}

b. 判断是否超出超卖限制

func checkOvercommit(pod *corev1.Pod, nodeName string) bool {nodeInfo, err := getNodeAllocatable(nodeName)if err != nil {log.Error(err, "无法获取节点信息")return false}totalRequestedCPU := getCurrentTotalCPURequests(nodeName)newRequestCPU := getResourceMilliCPU(pod)overcommitRatio := 1.1 // 110%maxAllowedCPU := nodeInfo.Allocatable.Cpu().MilliValue() * int64(overcommitRatio)return (totalRequestedCPU + newRequestCPU) <= maxAllowedCPU
}// 获取当前 Pod 请求的 CPU 总量
func getResourceMilliCPU(pod *corev1.Pod) int64 {var total int64for _, container := range pod.Spec.Containers {cpuReq := container.Resources.Requests.Cpu()if cpuReq != nil {total += cpuReq.MilliValue()}}return total
}

c. 修改或拒绝请求

func mutatePod(pod *corev1.Pod) ([]byte, error) {// 示例:自动注入 sidecar 或修改 requestspod.Spec.Containers[0].Resources.Requests[corev1.ResourceCPU] = resource.MustParse("700m")return json.Marshal(pod)
}

3.4 配置 Webhook Server TLS 认证

1. 使用 cert-manager 自动生成证书(推荐)

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:name: webhook-cert
spec:secretName: webhook-server-certissuerRef:name: selfsigned-issuerkind: ClusterIssuerdnsNames:- webhook-service.default.svc- webhook-service.default.svc.cluster.local

2. 配置 Webhook Server 使用证书

server := &webhook.Server{Host:    "0.0.0.0",Port:    443,CertDir: "/tmp/cert",TLSOpts: []func(*tls.Config){func(config *tls.Config) {config.ClientAuth = tls.NoClientCert},},
}

3.5 注册 MutatingWebhookConfiguration

apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:name: overcommit-mutating-webhook
webhooks:- name: mutating.overcommit.example.comrules:- operations: ["CREATE"]apiGroups: [""]apiVersions: ["v1"]resources: ["pods"]clientConfig:service:namespace: defaultname: webhook-servicecaBundle: <base64 encoded CA cert>admissionReviewVersions: ["v1"]sideEffects: NonetimeoutSeconds: 5

caBundle 是你的 CA 证书的 base64 编码。 

3.6 部署 Webhook 到集群

1. 构建镜像并推送到仓库

make docker-build docker-push IMG=myregistry/overcommit-webhook:latest

2. 部署 Deployment 和 Service

apiVersion: apps/v1
kind: Deployment
metadata:name: webhook-deployment
spec:replicas: 1selector:matchLabels:app: webhooktemplate:metadata:labels:app: webhookspec:containers:- name: webhookimage: myregistry/overcommit-webhook:latestports:- containerPort: 443
---
apiVersion: v1
kind: Service
metadata:name: webhook-service
spec:ports:- port: 443targetPort: 443selector:app: webhook

3.7 测试功能 

1. 创建一个 Pod

apiVersion: v1
kind: Pod
metadata:name: test-pod
spec:containers:- name: nginximage: nginxresources:requests:cpu: 500m

2. 查看是否被拦截并修改

kubectl describe pod test-pod

查看是否注入了新的 CPU 请求或被拒绝创建。

3.8 监控与告警

建议结合 Prometheus + Grafana:

  • 监控指标:

container_cpu_usage_seconds_total
kube_node_allocatable_cpu_cores
kube_pod_container_resource_requests_cpu_cores

  • 告警规则示例:
groups:- name: cpu-overcommitrules:- alert: HighCpuRequestUsageexpr: sum(kube_pod_container_resource_requests_cpu_cores) by (node) / kube_node_allocatable_cpu_cores > 1.1for: 5mlabels:severity: warningannotations:summary: Node {{ $labels.node }} CPU 请求已超过 110%

如果你正在构建一个支持 CPU 、内存资源超卖 的 Kubernetes 平台,建议将此 Mutating Webhook 与调度器插件(如 Kube-scheduler 插件或调度器扩展)配合使用,以实现更精细的资源管理策略。

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

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

相关文章

为 Go-llm-cpp 接入 Web API 接口,创建 Chatbot 聊天机器人

接续上一篇&#xff0c;用 Go 打造本地 LLM 聊天机器人&#xff1a;整合 llm-go 与 go-llama.cpp&#xff0c;此篇开始建构前端与 API 接口 执行环境需求 • ✅ Go 1.20 • ✅ C toolchain&#xff08;macOS: Xcode Command Line Tools / Linux: g&#xff09; • ✅ GGUF 格式…

Docker笔记-Docker Compose

Docker笔记-Docker Compose Compose 是用于定义和运行多容器 Docker 应用程序的工具&#xff0c;通过 Compose 您可以使用 YML 文件来配置应用 程序需要的所有服务。然后&#xff0c;使用一个命令&#xff0c;就可以从 YML 文件配置中创建并启动所有服务。 Compose 使用的三个步…

n1 armbian 安装桌面环境并启用xrdp远程登录

armbian-config armbian-software201frpcrootarmbian:~# armbian-software [ STEPS ] Start selecting software [ Current system: ubuntu/noble ]... ──────────────────────────────────────────────────────────…

从传统到智能:地质灾害风险评估、易发性分析与灾后重建;AI大语言模型DeepSeek、ChatGPT、GIS、Python和机器学习深度融合

地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。在降水、地震等自然诱因的作用下&#xff0c;地质灾害在全球范围内频繁发生。我国不仅常见滑坡灾害&#xff0c;还包括崩塌、泥石流…

便捷的电脑自动关机辅助工具

软件介绍 本文介绍的软件是一款电脑上实用的倒计时和关机助手。 软件特性 这款关机助手十分贴心&#xff0c;它是一款无需安装的小软件&#xff0c;体积仅60KB&#xff0c;不用担心占用电脑空间&#xff0c;打开即可直接使用。 操作方法 你只需设置好对应的关机时间&#x…

Fiddler-关于抓取Android手机包,安装证书后页面加载失败,提示当前证书不可信存在安全风险的问题

Fiddler-关于抓取Android手机包&#xff0c;安装证书后页面加载失败&#xff0c;提示当前证书不可信存在安全风险的问题Fiddler-关于抓取Android手机包&#xff0c;安装证书后页面加载失败&#xff0c;提示当前证书不可信存在安全风险的问题原因解决方法Fiddler-关于抓取Androi…

Apache Spark 4.0:将大数据分析提升到新的水平

Apache Spark 4.0 带来了 PySpark 画图、多态 UDTF、改进的 SQL 脚本和 Python API 更新&#xff0c;以增强实时分析和可用性。 Apache Spark 4.0 于 2025 年发布&#xff0c;它通过增强性能、可访问性和开发者生产力的创新&#xff0c;重新定义了大数据处理。在 Databricks、A…

手机解压软件 7z:高效便捷的解压缩利器

在当今数字化时代&#xff0c;手机已经成为人们生活和工作中不可或缺的工具。随着文件传输和存储需求的不断增加&#xff0c;7z 文件格式因其高效的压缩比而备受青睐。在手机上处理 7z 文件变得越来越重要&#xff0c;合适的解压软件能带来诸多便利。首先&#xff0c;7z 文件格…

闲庭信步使用图像验证平台加速FPGA的开发:第六课——测试图案的FPGA实现

&#xff08;本系列只需要modelsim即可完成数字图像的处理&#xff0c;每个工程都搭建了全自动化的仿真环境&#xff0c;只需要双击文件就可以完成整个的仿真&#xff0c;大大降低了初学者的门槛&#xff01;&#xff01;&#xff01;&#xff01;如需要该系列的工程文件请关注…

Solidity——修改状态变量注意事项和简单优化建议

你的问题非常关键&#xff0c;涉及到 Solidity 合约部署时的初始化 gas 成本 和 运行时的存储操作 gas 消耗。我们来详细解答&#xff1a; &#x1f6a8; 首先&#xff0c;你的代码是非法的&#xff1a; contract MyContract {uint public myNumber;myNumber 1; // ❌ 不允许…

2023年全国青少年信息素养大赛Python编程小学组复赛真题+答案解析-海南赛区

2023年全国青少年信息素养大赛Python编程小学组复赛真题+答案解析-海南赛区 编程题 第1题 整数加8 题目描述 输入一个整数,输出这个整数加8的结果。 输入描述 输入一行一个正整数。 输出描述 输出求和的结果。 样例1 输入: 5 输出: 13 题目解析 这是最基础的输入输出与…

Qt基本组件详解:按钮、输入框与容器控件

Qt基本组件详解&#xff1a;按钮、输入框与容器控件目录 按钮类组件 QPushButtonQRadioButtonQCheckBox 输入框组件 QLineEditQTextEdit 容器组件 QGroupBox 综合应用示例思维导图总结1. 按钮类组件 1.1 QPushButton&#xff08;普通按钮&#xff09; 功能&#xff1a;基础交互…

Unity Universal Render Pipeline/Lit光照材质介绍

文章目录前言参数介绍1、表面选项1.1 Worflow Mode工作流模式1.2 Surface Type 表面类型1.3 Blending Mode 混合模式1.4 Preserve Specular 保留镜面光照&#xff08;高光&#xff09;1.5 Render Face 渲染面1.6 Alpha Clipping 透明度剪裁1.7 Receive Shadows 是否接收阴影2、…

uni-app ios离线推送,推送后点击推送的链接进入程序后再次回到桌面,无法消除app的角标问题

问题现象&#xff1a; 解决方案&#xff1a; 1、用h5方法清理 h5地址&#xff1a;HTML5 API Reference 废话不多说上代码 /*** 清除应用角标&#xff08;支持iOS和Android&#xff09;* 使用H5方法清理推送角标*/clearAppBadge() {// #ifdef APP-PLUStry {plus.runtime.setBad…

迁移Oracle SH 示例 schema 到 PostgreSQL

接着上一篇文章&#xff1a;迁移Oracle HR 示例 schema 到 PostgreSQL中&#xff0c;本文做Oracle SH&#xff08;Sales History&#xff09;示例 schema的迁移&#xff0c;SH schema比HR schema更大更复杂&#xff0c;本次迁移的重点是&#xff1a; 分区表外部数据加载 使用…

1.1 ARMv8/ARMv9安全扩展

目录1.1.1 ARM架构安全演进1.1.2 ARMv8安全特性异常级别(EL)安全模型关键安全扩展1.1.3 ARMv9安全创新机密计算架构(CCA)增强的隔离机制1.1.4 安全扩展的TF-A支持1.1.5 安全扩展配置示例1.1.1 ARM架构安全演进 ARM架构从v7到v9的安全演进路线&#xff1a; ARMv7&#xff1a;引…

更新用户隐私协议后还是 ail api scope is not declared in the privacy agreement怎么办??!

saveImageToPhotosAlbum:fail api scope is not declared in the privacy agreement昨天明明可以了&#xff0c;开了个会出来&#xff0c;又不行了&#xff0c;真要命啊啊啊啊啊啊啊啊啊啊(现在回想起来可能是因为我把发布的那个版本删了&#xff0c;因为那个只是用来测试用的e…

练习:对象数组 5

定义一个长度为 3 的数组&#xff0c;数组存储 1~3 名学生对象作为初始数据&#xff0c;学生对象的学号&#xff0c;姓名各不相同。学生的属性&#xff1a;学号&#xff0c;姓名&#xff0c;年龄。要求 1&#xff1a;再次添加一个学生对象&#xff0c;并在添加的时候进行学号的…

Linux 中的 .bashrc 是什么?配置详解

如果你使用过 Linux 终端&#xff0c;那么你很可能接触过 .bashrc 文件。这个功能强大的脚本是个性化命令行环境并使其更高效运行的关键。 在本文中&#xff0c;我们将向你介绍这个文件是什么&#xff0c;在哪里可以找到它&#xff0c;以及如何安全地编辑它。你还将学到一些实…

JVM运行时数据区深度解析

&#x1f4be; JVM运行时数据区深度解析 文章目录&#x1f4be; JVM运行时数据区深度解析&#x1f3af; 引言&#x1f4da; 方法区&#x1f4cb; 方法区存储内容&#x1f504; 从永久代到元空间的演进永久代时期&#xff08;JDK 8之前&#xff09;元空间时期&#xff08;JDK 8及…