前言

最近有个新同事问了我一个问题,明明通过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的更多相关文章

  1. Docker容器内存监控

    linux内存监控 要明白docker容器内存是如何计算的,首先要明白linux中内存的相关概念. 使用free命令可以查看当前内存使用情况. [root@localhost ~]$ free tot ...

  2. docker限制容器内存使用上限

    记录一个项目开发部署中遇到的一个问题,处理经验总结. 问题: 我们的项目使用的是Angular6 + Spring boot + redis + mycat结构,项目部署在容器里面,项目正式部署以后, ...

  3. Docker 容器内存限制 - 八

    Docker 内存限制: centos /bin/bash  查看容器实例 内存限制: 限制容器内存大小:docker run -d -i -t -m 256M --memory-swap 512M ...

  4. docker容器内存占用 之 系统cache,docker下java的内存该如何配置

    缘起: 监控(docker stats)显示容器内存被用完了,进入容器瞅了瞅,没有发现使用内存多的进程,使用awk等工具把容器所有进程使用的内存加起来看看,距离用完还远了去了,何故? 分析: 该不会d ...

  5. docker容器内存和CPU使用限制

    docker容器内存和CPU使用限制 示例如下 sudo docker run --name seckill0 -p 8080:8080 -m 1024M --cpus=0.2 -d seckill: ...

  6. docker 限制 容器内存 使用

    转载 : https://www.cnblogs.com/sparkdev/p/8032330.html 默认情况下容器使用的资源是不受限制的.也就是可以使用主机内核调度器所允许的最大资源.但是在容器 ...

  7. docker容器内存占用过高(例如mysql)

    简介 该文章适用于配置低,特别是内存低的服务器,在用容器部署服务时有可能会因为容器占用内存过高导致服务挂掉时参考解决(不是运行在容器里的话,也是可以修改mysql的配置文件限制内存占用) 最近用doc ...

  8. 利用dotnet-dump分析docker容器内存泄露

    目录 一 运行官方示例 1,Clone代码并编译 2,创建Dockerfile构建镜像 3,启动容器 二 生成dump转储文件 1,制造问题 2,创建dump文件 三 分析dump文件 1,创建一个用 ...

  9. winform 容器内存泄漏

    循环中释放容器时调用Dispose()方法会销毁对象,导致容器的个数变化. 正确示例//方法一for (int i = this.flowLayoutPanel1.Controls.Count-1; ...

  10. 【原创】大数据基础之Spark(2)Spark on Yarn:container memory allocation容器内存分配

    spark 2.1.1 最近spark任务(spark on yarn)有一个报错 Diagnostics: Container [pid=5901,containerID=container_154 ...

随机推荐

  1. 个头小却很能“打”!合合信息扫描全能王推出A4便携式打印机

    个头小却很能"打"!合合信息扫描全能王推出A4便携式打印机   过去,为了打印一份清晰工整的材料,人们往往需要到专门的打印店或办公室.处理文件.对于销售.物流人员.工程师.医生.媒 ...

  2. EF Core – 乐观并发

    前言 之前写过 EF Core 悲观并发, 这篇主要讲一下乐观并发. 乐观并发的机制可以看这篇. Why Need This? 如果你用 EF Core 做数据管理, 建议你每个 Entity 都配置 ...

  3. Go runtime 调度器精讲(九):系统调用引起的抢占

    原创文章,欢迎转载,转载请注明出处,谢谢. 0. 前言 第八讲介绍了当 goroutine 运行时间过长会被抢占的情况.这一讲继续看 goroutine 执行系统调用时间过长的抢占. 1. 系统调用时 ...

  4. Eclipse中Java项目的导入和导出

    eclipse中项目的导出 当我们完成自己的java项目之后,我们可以将其打包发给别人,eclipse为我们提供了自动打包的功能. 之后单击finish即可.在你选择的导出位置便可以看到导出的压缩包: ...

  5. Vue3——集成mock 模拟数据生成器

    安装依赖 npm install -D mockjs vite-plugin-mock@2.9.6 在 vite.config.js 文件中引入并配置 vite-plugin-mock 插件 impo ...

  6. 支持Docker的底层技术(Namespaces?CGroups?UnionFS?Docker 架构?)(二)

    上一篇介绍了Docker基本概念,这一篇介绍下支持Docker的底层技术 Docker 本质就是宿主机的一个特殊进程,Docker 是通过 namespace 实现资源隔离,通过cgroup 实现资源 ...

  7. .NEET跨平台绘图基础库--SkiaSharp

    SkiaSharp 是一个跨平台的 2D 图形 API,用于 .NET 平台,基于 Google 的 Skia 图形库.它提供了全面的 2D API,可以在移动.服务器和桌面模型上渲染图像.SkiaS ...

  8. for循环遍历的盗版笔记

    遍历一个List有如下几种方法   5 6 是 java8 增强for循环底层由Iterator实现 增强for的出现时替代迭代器的,所以在遍历集合或者遍历数组就可以使用增强for去完成 增强for循 ...

  9. 8. REM解释一下

    rem (root em )是 c3 新增的相对单位 ,相对的是html根元素,动态变化自己的大小 : 补充: em 也是相对单位,相对的是父元素来动态设置自己大小 : px 是绝对单位,是相对于屏幕 ...

  10. day17-打印三角形及Debug

    打印三角形 之前学习C++的时候也曾做过,于是乎凭借记忆又试了试,也还能试出来.代码如下:  #include<stdio.h> int main(){  int i,j;  for(i= ...