k8s Mutating Admission Webhook 實現超賣

目錄

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及…