如何hack邊緣的kubelet修改Cgroup數值

之前做了一個VPA項目的需求,就是需要不重啟的方式修改容器的Cgroup的值已達到垂直擴縮容的目的,項目中核心的思路如下

  1. 上游下發要VPA的結果的值寫入到容器的Annotation里面
  2. Kubelet 感知到這個 annoation 的變化
  3. 我們本地運行一個 Agent,里面運行一個類似的job監聽kubelet的變化,當發現annotation的值改變的時候就去修改對應容器的Cgroup的數值即可

具體步驟如下

Cgroup 是什么

簡而言之,對容器技術而言,其實現資源層面上的限制和隔離,依賴于 Linux 內核提供的 Cgroup 和 namespace 技術

cgroup 的主要作用:管理資源的分配和限制;主要限制的資源是CPU、內存、網絡和磁盤IO

namespace 的主要作用:封裝抽象、限制、隔離,使命名空間內的進程看起來擁有他們自己的全局資源

以一個最簡單的例子來校驗Cgroup的限制,我們使用docker來創建以下容器

docker run --rm -d --cpus=2 --memory=2g --name=2c2g redis:alpine

查看上述容器的ID

? dps | grep -i 2c2g
37ad8252f8de   redis:alpine   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   6379/tcp   2c2g

找到 /sys/fs/cgroup/system.slice 目錄對應的容器
在這里插入圖片描述

可看到有很多容器的選項可供查看

查看CPU和內存的Max

?  docker-37ad8252f8de50694e3321364c9ef5e94ae08f45f50e633e561feb291d1c27e9.scope cat cpu.max
200000 100000
?  docker-37ad8252f8de50694e3321364c9ef5e94ae08f45f50e633e561feb291d1c27e9.scope cat memory.max
2147483648        # 這里的單位是Byte

我們查看容器的占用
在這里插入圖片描述

可以看到這個2G就是我們設定的數值

那嘗試直接修改這個cgroup的數值,是不是就能修改容器的內存和CPU的限制從而做到VPA的效果

我們嘗試修改內存由原來的2G到現在的1G

echo "1073741824" >> memory.max

再次查看內存的占用比值,可以發現確實修改已經生效

在這里插入圖片描述

Kubelet 的接口

首先明確一點,你在管控面 kubelet get 等信息基本都是從邊緣端映射過來的,所以單機側的 kubelet 也能獲取到很多信息,比如

/configz     返回 kubelet 的相關配置信息
/metrics     暴露 kubelet 和容器的監控指標,比如 CPU 和內存的使用率,網絡流量等
/pods        返回當前節點上的所有 Pod 的信息,包括 Pod 的狀態以及容器信息等
/stats/summary    提供節點的資源使用統計信息,包括CPU、內存、網絡、磁盤等
/exex/<pod_namespace>/<pod_name>/<container_name>     提供指定容器的日志,支持tail和follow參數
/logs        用于獲取正在運行的pods和容器日志

配置服務賬號訪問kubelet

訪問 kubelet 需要使用密鑰,我們先配置服務賬號訪問,直接配置成最大的 clusterrole 權限

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: system:my-agent
subjects:- kind: ServiceAccountname: my-agentnamespace: default
roleRef:kind: ClusterRolename: system:my-agentapiGroup: rbac.authorization.k8s.io
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: system:my-agent
rules:- apiGroups:- ""resources:- nodesverbs:- get- list- watch- apiGroups:- ""resources:- nodesverbs:- proxy- apiGroups:- ""resources:- nodes/log- nodes/metrics- nodes/proxy- nodes/spec- nodes/statsverbs:- '*'
---
apiVersion: v1
kind: ServiceAccount
metadata:name: my-agentnamespace: default

上面的服務賬號創建完成之后就能看到下面的密鑰了

kubectl get secret $(kubectl get serviceaccount my-agent -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode

比如我這個機器上是

?  ~ k get secret $(kubectl get serviceaccount my-agent -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode
eyJhbGciOiJSUzI1NiIsImtpZCI6IlBQTDNXcGNKenVxNGZ3OHdpam5WQ0Jnd3d3NWpMbVZtSWJETTQ0WW5EZHMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6Im15LWFnZW50LXRva2VuLXE0a2hsIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6Im15LWFnZW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiY2UyMzQzNGEtMTViYy00YzI1LWIwYTktZGQxM2E3MDllMGRlIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6bXktYWdlbnQifQ.UjNJxEbaLDm_19wVB4OPi-3u6fTG2noCQrLI7e7-PA1DoPc4SQJHzVXmPGwP6Ln4Odv-PrC0jkOpGF4DQQcQx589HsXN0zpmn6z-GJdzTsVxFFaJZpgZlfITGN99zQlr-AkRjgEm_9vUpijjjXOP0dWmPlHlmpxSYqpf3zSohIJsBySpXp1sQKboaeqTHbXU02xwsCjFDHeOyfESQcyVOtKQk9_w0Qvtiz5DcCClAZSCW8WLQPX9X7wie_vZCKlcNKiS5eKYCdymm6ZndXyidqb9Ga027_jhZnjvPO27rzBAL5wiTgonYAUau6tvB9KENfYAFF3pm2rTJZYujjUOfA

那用這個 token 是否可以訪問到機器上的 pods 信息呢

我們試著對 /configz 接口發起訪問,訪問其 kubelet 的配置信息
在這里插入圖片描述

可以看到訪問成功

實操:部署pod并做VPA操作

手動修改

創建一個 nginx 的 deployment,設定資源限制為2core2G

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 1  # 設置副本數selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latest  # 使用最新的 Nginx 鏡像resources:requests:memory: "2Gi"  # 請求的內存cpu: "2"       # 請求的 CPUlimits:memory: "2Gi"  # 限制的內存cpu: "2"       # 限制的 CPUports:- containerPort: 80  # Nginx 默認監聽的端口

創建完成之后到目錄 /sys/fs/cgroup/kubepods.slice 下面就能看到我們創建的pod
在這里插入圖片描述

這個后綴就是我們pod的uid
在這里插入圖片描述

進入到這個目錄下面
在這里插入圖片描述

可以發現這個pod里面實際運行了兩個容器,一個 sandbox 容器用來隔離容器的網絡,一個業務自身的容器

分別對應的pod的信息如下
在這里插入圖片描述
在這里插入圖片描述

我們進入到我們的業務pod里面,修改內存的取值如下

?  docker-567f43cdcb3c5630ffc17735d92b2895912a65a3e03fd5575262a52709eba00b.scope cat memory.max
2147483648

修改為1G

然后使用 docker stats 查看容器的負載使用情況
在這里插入圖片描述

可以看到容器的內存使用上限已經修改為我們期望的1GB,并且是不需要在重啟容器的情況下進行的

參考文檔

一篇搞懂容器技術的基石: cgroup

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912653.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912653.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912653.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

熟悉 PyCharm

界面 我們常用的就這個幾個地方&#xff1a; 常用配置 調整字體大小 Ctrl 滾輪調整字體大小 插件推薦 Indent Rainbow 該插件的作用在于能夠對于不同層級縮進的空格標注不同的顏色&#xff1a; 快捷鍵 快捷鍵的 pdf 下載鏈接&#xff1a; Windows 版&#xff1a;https:…

pytorch--模型訓練的一般流程

文章目錄 前言0、數據集準備1、數據集2、dataset3、model4、訓練模型 前言 在pytorch中模型訓練一般分為以下幾個步驟&#xff1a; 0、數據集準備 1、數據集讀取&#xff08;dataset模塊&#xff09; 2、數據集轉換為tensor&#xff08;dataloader模塊&#xff09; 3、定義模型…

智能合同管理實戰:基于區塊鏈的電子簽約技術實現

在數字經濟時代,傳統紙質合同簽署方式已難以滿足企業高效、安全、合規的業務需求。智能合同管理(Smart Contract Management)結合區塊鏈技術,正在重塑電子簽約流程,實現合同全生命周期的自動化、可追溯和防篡改。本文將深入探討基于區塊鏈的電子簽約技術實現,涵蓋核心架構…

設計模式精講 Day 22:模板方法模式(Template Method Pattern)

【設計模式精講 Day 22】模板方法模式&#xff08;Template Method Pattern&#xff09; 文章標簽 設計模式, 模板方法模式, Java開發, 面向對象設計, 軟件架構, 設計模式實戰, Java應用開發 文章簡述 模板方法模式是一種行為型設計模式&#xff0c;它通過定義一個算法的骨架…

如何在pytorch中使用tqdm:優雅實現訓練進度監控

文章目錄 為什么需要進度條&#xff1f;tqdm 簡介基礎用法示例深度學習中的實戰應用1. 數據加載進度監控2. 訓練循環增強版3. 驗證階段集成 高級技巧與最佳實踐1. 自定義進度條樣式2. 嵌套進度條&#xff08;多任務&#xff09;3. 分布式訓練支持4. 與日志系統集成 性能優化建議…

Linux中的xxd命令詳解

xxd 是一個 十六進制轉儲&#xff08;hex dump&#xff09;工具&#xff0c;通常用于將二進制文件轉換為十六進制格式&#xff0c;或者反向轉換&#xff08;十六進制→二進制&#xff09;。它是 vim 的一部分&#xff0c;但在大多數 Linux 系統&#xff08;如 Ubuntu&#xff0…

磐維數據庫panweidb3.1.0單節點多實例安裝

0 說明 業務科室提單需要在某臺主機上部署多個單機磐維數據庫&#xff0c;用于業務測試。以下內容展示如何在單節點安裝多個磐維數據庫實例。 1 部署環境準備 1.1 IP 地址及端口 instipport實例1192.168.131.1717700實例2192.168.131.1727700 在131.17上分別安裝兩個實例&…

轉錄組分析流程(三):功能富集分析

我們的教程主要是以一個具體的例子作為線索,通過對公共數據庫數據bulk-RNA-seq的挖掘,利用生物信息學分析來探索目標基因集作為某種疾病數據預后基因的潛能及其潛在分子機制,同時在單細胞水平分析(對scRNA-seq進行挖掘)預后基因的表達,了解細胞之間的通訊網絡,以期為該疾病…

全面掌握 tkinter:Python GUI 編程的入門與實戰指南

在自動化、工具開發、數據可視化等領域&#xff0c;圖形用戶界面&#xff08;GUI&#xff09;往往是提升用戶體驗的重要方式。作為 Python 官方內置的 GUI 庫&#xff0c;tkinter 以其輕量、跨平臺、易于學習的特性成為初學者和輕量級應用開發者首選。 本文將以深入淺出的方式…

TDH社區開發版安裝教程

&#xff08;注&#xff1a;本文章來源于星環官網安裝手冊&#xff09; 后面放置了視頻和安裝手冊連接 1、硬件及環境要求 Docker17及以上版本&#xff0c;支持Centos&#xff0c;Ubuntu等系統&#xff08;注&#xff1a;這里我使用CentOS-7版本&#xff0c;最佳版本推薦為7.…

Linux基本命令篇 —— grep命令

grep是Linux/Unix系統中一個非常強大的文本搜索工具&#xff0c;它的名字來源于"Global Regular Expression Print"&#xff08;全局正則表達式打印&#xff09;。grep命令用于在文件中搜索包含特定模式的行&#xff0c;并將匹配的行打印出來。 目錄 一、基本語法 二…

蒼穹外賣問題系列之 蒼穹外賣訂單詳情前端界面和網課給的不一樣

問題 如圖&#xff0c;我的前端界面和網課里面給的不一樣&#xff0c;沒有“申請退款”和一些其他的該有的東西。 原因分析 “合計”這一欄顯示undefined說明我們的總金額沒有輸入進去。可以看看訂單提交那塊的代碼&#xff0c;是否可以正確輸出。還有就是訂單詳細界面展示這…

CppCon 2018 學習:EMULATING THE NINTENDO 3DS

我們來逐個分析一下這個 組件交互模型 和 仿真 & 序列化 的關系&#xff0c;特別是主線程&#xff08;Main Thread&#xff09;與其他系統組件之間的交互。 1. Main Thread — simple (basically memcpy) --> GPU Main Thread&#xff08;主線程&#xff09;負責游戲的…

[Python 基礎課程]數字

數字 數字數據類型用于存儲數值&#xff0c;比如整數、小數等。數據類型是不允許改變的&#xff0c;這就意味著如果改變數字數據類型的值&#xff0c;將重新分配內存空間。 創建數字類型的變量&#xff1a; var1 1 var2 10創建完變量后&#xff0c;如果想廢棄掉這個變量&a…

Linux CentOS環境下Java連接MySQL數據庫指南

文章目錄 前言一、環境準備1.1 系統更新1.2 Java環境安裝1.3 MySQL數據庫安裝1.4 下載JDBC驅動 二、編寫Java程序2.1 代碼如下2.2 編譯和運行2.3 驗證創建結果 三、代碼上傳至Gitee3.1 安裝配置Git3.2 克隆倉庫到本地3.3 添加Java項目文件3.4 提交代碼到本地倉庫3.5 推送到Gite…

LLM面試12

訊飛算法工程師面試題 SVM核函數能否映射到無窮維 可以的&#xff0c;多項式核函數將低維數據映射到高維&#xff08;維度是有限的&#xff09;&#xff0c;而高斯核函數可以映射到無窮維。由 描述下xgb原理&#xff0c;損失函數 首先需要說一說GBDT,它是一種基于boosting增強…

類加載生命周期與內存區域詳解

類加載生命周期與內存區域詳解 Java 類加載的生命周期包括加載、驗證、準備、解析、初始化五個階段&#xff0c;每個階段在內存中的存儲區域和賦值機制各有不同。以下是詳細解析&#xff1a; 一、類加載生命周期階段 1. 加載&#xff08;Loading&#xff09; 內存區域&…

正交視圖三維重建2 筆記 2d線到3d線2 先生成3d線然后判斷3d線在不在

應該先連線再判斷線在不在 if(fx1tx1&&tx1tx2){ const A[fx1, fy1, ty1];const Ahat[fx1, fy1, ty2];drawlines(A[0], A[1], A[2], Ahat[0], Ahat[1], Ahat[2], lineId, type,2);}if(fx2tx1&&tx1tx2){ const B[fx2, fy2, ty1];const Bhat[fx2, fy2, ty2];drawl…

Hibernate對象生命周期全解析

Hibernate對象生命周期詳解 Hibernate作為Java領域主流的ORM框架,其核心機制之一就是對持久化對象生命周期的管理。理解Hibernate對象生命周期對于正確使用Hibernate進行數據持久化操作至關重要。Hibernate將對象分為三種主要狀態:瞬時態(Transient)、持久態(Persistent)和游…

MCP 協議使用核心講解

&#x1f4c4; MCP 協議使用核心講解 ? MCP 協議的核心在于以下幾個方面 一、MCP 請求結構&#xff08;MCPRequest&#xff09; {"messages": [{"role": "user","content": "幫我查詢一下上海的天氣"}],"tools"…