jdin043 发表于 2025-2-7 02:11:06

表里不一--限制容器内存4G,free还是32G

前言

最近有个新同事问了我一个问题,明明通过limit给容器内存限制了4G,为什么进容器看到的还是宿主机的内存32G
▶ docker run -it --rm -m 512m ubuntu:18.04 bashroot@ae00bec75ad7:/# free -m               total      used      free      sharedbuff/cache   availableMem:          31954       11482      8487      1708       11983       18305Swap:          2047         0      2047这个提问不禁勾起了我的一泡回忆,那是之前在学习《深入剖析kubernetes》的时候提到的知识细节
环境准备

组件版本操作系统Ubuntu 22.04.4 LTSlxcfs4.0.3k8sv1.26.3lxcfs原理介绍


[*]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 lxcfs2)部署到对应的目录
sudo mkdir -p /var/lib/lxcfssudo lxcfs /var/lib/lxcfs &部署完成之后,lxcfs是以一个后台进程的方式工作
docker 使用

1. 常规启动

▶ docker run -it --rm -m 512m ubuntu:18.04 bashroot@ae00bec75ad7:/# free -m               total      used      free      sharedbuff/cache   availableMem:          31954       11482      8487      1708       11983       18305Swap:          2047         0      20472. 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 bashroot@56e3c146ba4e:/# free -m            total      used      free      sharedbuff/cache   availableMem:            512         1         510         0         0         510Swap:             0         0         0通过lxcfs,让docker正确的识别了限制的内存
k8s 使用

1. 常规启动

▶ echo '          apiVersion: v1kind: Podmetadata:name: wilson-testspec: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   AGEwilson-test   1/1   Running   0          3s▶ kubectl exec -it wilson-test -- free -m            total      used      free      sharedbuff/cache   availableMem:          31954       11034      6384      1568       14534       18893Swap:          2047         0      2047使用lxcfs
▶ echo '                                                                                                                                                                                                                           apiVersion: v1                                                                                                                                                                                                                     kind: Podmetadata:name: wilson-testspec: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: truevolumes:- 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   AGEwilson-test   1/1   Running   0          2s▶ kubectl exec -it wilson-test -- free -m            total      used      free      sharedbuff/cache   availableMem:            128         0         127         0         0         127Swap:          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,敬请期待
联系我

联系我,做深入的交流
https://img2024.cnblogs.com/blog/1416773/202411/1416773-20241121135740959-1907948957.png#
<hr>至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...
页: [1]
查看完整版本: 表里不一--限制容器内存4G,free还是32G