表里不一--限制容器内存4G,free还是32G
前言
最近有个新同事问了我一个问题,明明通过limit给容器内存限制了4G,为什么进容器看到的还是宿主机的内存32G
docker run -it --rm -m 512m ubuntu:18.04 bash
root@ae00bec75ad7:/# free -m
total used free shared buff/cache available
Mem: 31954 11482 8487 1708 11983 18305
Swap: 2047 0 2047
这个提问不禁勾起了我的一泡回忆,那是之前在学习《深入剖析kubernetes》的时候提到的知识细节
环境准备
| 组件 | 版本 |
|---|---|
| 操作系统 | Ubuntu 22.04.4 LTS |
| lxcfs | 4.0.3 |
| k8s | v1.26.3 |
lxcfs原理介绍
free是从/proc文件系统获取的数据,但是容器启动的时候/proc还是映射的宿主机,所以free显示的信息肯定是宿主机的- 使用
lxcfs可以解决这个问题,本质就是通过docker启动对于cpu、memory施加的限制行为,手动的挂载proc(修改过的)文件系统进入容器内 - 目前项目依然在更新: lxcfs,从文档看,支持的文件系统有这些:
/proc/cpuinfo
/proc/diskstats
/proc/meminfo
/proc/stat
/proc/swaps
/proc/uptime
/proc/slabinfo
/sys/devices/system/cpu/online
安装lxcfs
1)直接使用apt安装lxcfs工具
sudo apt install lxcfs
2)部署到对应的目录
sudo mkdir -p /var/lib/lxcfs
sudo lxcfs /var/lib/lxcfs &
部署完成之后,lxcfs是以一个后台进程的方式工作
docker 使用
1. 常规启动
docker run -it --rm -m 512m ubuntu:18.04 bash
root@ae00bec75ad7:/# free -m
total used free shared buff/cache available
Mem: 31954 11482 8487 1708 11983 18305
Swap: 2047 0 2047
2. docker使用lxcfs
先安装lxcfs
sudo apt install lxcfs
docker run -it --rm -m 512m \
-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
ubuntu:18.04 bash
root@56e3c146ba4e:/# free -m
total used free shared buff/cache available
Mem: 512 1 510 0 0 510
Swap: 0 0 0
通过lxcfs,让docker正确的识别了限制的内存
k8s 使用
1. 常规启动
echo '
apiVersion: v1
kind: Pod
metadata:
name: wilson-test
spec:
containers:
- image: ubuntu:18.04
imagePullPolicy: IfNotPresent
command: ["sleep", "33333"]
name: wilson-test
resources:
limits:
memory: 128Mi
requests:
memory: 64Mi
' | kubectl apply -f -
pod/wilson-test created
kubectl get pod
NAME READY STATUS RESTARTS AGE
wilson-test 1/1 Running 0 3s
kubectl exec -it wilson-test -- free -m
total used free shared buff/cache available
Mem: 31954 11034 6384 1568 14534 18893
Swap: 2047 0 2047
使用lxcfs
echo '
apiVersion: v1
kind: Pod
metadata:
name: wilson-test
spec:
containers:
- image: ubuntu:18.04
imagePullPolicy: IfNotPresent
command: ["sleep", "33333"]
name: wilson-test
resources:
limits:
memory: 128Mi
requests:
memory: 64Mi
volumeMounts:
- mountPath: /proc/meminfo
name: lxcfs-proc-meminfo
readOnly: true
volumes:
- hostPath:
path: /var/lib/lxcfs/proc/meminfo
type: ""
name: lxcfs-proc-meminfo
' | kubectl apply -f -
pod/wilson-test created
kubectl get pod
NAME READY STATUS RESTARTS AGE
wilson-test 1/1 Running 0 2s
kubectl exec -it wilson-test -- free -m
total used free shared buff/cache available
Mem: 128 0 127 0 0 127
Swap: 2047 0 2047
内存限制128m已经生效
k8s自动注入lxcfs preset
1. 使用k8s preset
- kubernetes v1.20 把 preset给移除了
- github上有大佬用CRD给做了回来 podpreset,但是3年没更新过了
2. 使用k8s Admission Controller
在github也可以找到大佬现成 lxcfs-admission-webhook,但是貌似也很久没更新了
小结
- 本文只演示了内存,关于其他的指标,只需要依葫芦画瓢即可
- 关于自动挂载,现成的项目都已经很久没有更新过了,后面可以尝试手搓一个
admission-hook,敬请期待
联系我
联系我,做深入的交流

至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...
表里不一--限制容器内存4G,free还是32G的更多相关文章
- Docker容器内存监控
linux内存监控 要明白docker容器内存是如何计算的,首先要明白linux中内存的相关概念. 使用free命令可以查看当前内存使用情况. [root@localhost ~]$ free tot ...
- docker限制容器内存使用上限
记录一个项目开发部署中遇到的一个问题,处理经验总结. 问题: 我们的项目使用的是Angular6 + Spring boot + redis + mycat结构,项目部署在容器里面,项目正式部署以后, ...
- Docker 容器内存限制 - 八
Docker 内存限制: centos /bin/bash 查看容器实例 内存限制: 限制容器内存大小:docker run -d -i -t -m 256M --memory-swap 512M ...
- docker容器内存占用 之 系统cache,docker下java的内存该如何配置
缘起: 监控(docker stats)显示容器内存被用完了,进入容器瞅了瞅,没有发现使用内存多的进程,使用awk等工具把容器所有进程使用的内存加起来看看,距离用完还远了去了,何故? 分析: 该不会d ...
- docker容器内存和CPU使用限制
docker容器内存和CPU使用限制 示例如下 sudo docker run --name seckill0 -p 8080:8080 -m 1024M --cpus=0.2 -d seckill: ...
- docker 限制 容器内存 使用
转载 : https://www.cnblogs.com/sparkdev/p/8032330.html 默认情况下容器使用的资源是不受限制的.也就是可以使用主机内核调度器所允许的最大资源.但是在容器 ...
- docker容器内存占用过高(例如mysql)
简介 该文章适用于配置低,特别是内存低的服务器,在用容器部署服务时有可能会因为容器占用内存过高导致服务挂掉时参考解决(不是运行在容器里的话,也是可以修改mysql的配置文件限制内存占用) 最近用doc ...
- 利用dotnet-dump分析docker容器内存泄露
目录 一 运行官方示例 1,Clone代码并编译 2,创建Dockerfile构建镜像 3,启动容器 二 生成dump转储文件 1,制造问题 2,创建dump文件 三 分析dump文件 1,创建一个用 ...
- winform 容器内存泄漏
循环中释放容器时调用Dispose()方法会销毁对象,导致容器的个数变化. 正确示例//方法一for (int i = this.flowLayoutPanel1.Controls.Count-1; ...
- 【原创】大数据基础之Spark(2)Spark on Yarn:container memory allocation容器内存分配
spark 2.1.1 最近spark任务(spark on yarn)有一个报错 Diagnostics: Container [pid=5901,containerID=container_154 ...
随机推荐
- CSIG企业行-走进合合信息成功举行,聚焦生成式人工智能、智能文档处理前沿热点
3月18日,由中国图象图形学学会(CSIG)主办,合合信息.CSIG文档图像分析与识别专业委员会联合承办的"CSIG企业行"系列活动成功举办.此次活动以"图文智能处理与多 ...
- OData – Get Started 搭建单侧环境
前言 之前写过 EF Core – Get Started 搭建单侧环境, 这篇补上一个 WebApi + EF Core + OData 创建项目 dotnet new webapi -o EfCo ...
- Oracle 到 MySQL 函数替换方案汇总
常用函数和语法转换 NVL函数 Oracle语法: NVL(COUNT(*), 0) MySQL语法: IFNULL(COUNT(*), 0) 转字符串 Oracle语法: to_char ...
- mongo 副本集rs 理解和使用小结
转载请注明出处: 在MongoDB中,rs(通常指的是"replica set"的缩写)是复制集(Replica Set)的标识符或在使用时的一种常见前缀,尤其是在命令行工具和脚本 ...
- C#|.net core 基础 - 值传递 vs 引用传递
不知道你在开发过程中有没有遇到过这样的困惑:这个变量怎么值被改?这个值怎么没变? 今天就来和大家分享可能导致这个问题的根本原因值传递 vs 引用传递. 在此之前我们先回顾两组基本概念: 值类型 vs ...
- Listener——监听器
Listener
- Java poi 读取 word 、 pdf
从各个博客 CV 出来的,不好意思 pom <dependency> <groupId>org.apache.poi</groupId> <artifactI ...
- USB configfs与USB functionfs的区别及关系
configfs 和 functionfs 是 Linux 内核中用于配置和管理 USB 设备行为的两种不同的文件系统,它们各自的用途和工作方式有所不同,但在 USB Gadget 子系统中可以结合使 ...
- iOS Masonry使用小结
一.Masonry简介 Masonry是一个轻量级的布局框架,它拥有自己的描述语法(采用更优雅的链式语法封装)来自动布局,具有很好可读性且同时支持iOS和Max OS X等. 二.Masonry的基本 ...
- 麻将计分器微信小程序的开发
如何开发微信小程序 前言 因为最近沉迷和朋友们一起下班去打麻将,他们推荐了一个计分的小程序,就不需要每局都转账或者用扑克牌记录了,但是这个小程序不仅打开有广告,各个页面都植入了广告,用起来十分不适. ...