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

打印 上一主题 下一主题

主题 773|帖子 773|积分 2319

前言

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

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


  • free是从/proc文件系统获取的数据,但是容器启动的时候/proc还是映射的宿主机,以是free显示的信息肯定是宿主机的
  • 使用lxcfs可以解决这个题目,本质就是通过docker启动对于cpu、memory施加的限定行为,手动的挂载proc(修改过的)文件系统进入容器内
  • 目前项目依然在更新: lxcfs,从文档看,支持的文件系统有这些:
  1. /proc/cpuinfo
  2. /proc/diskstats
  3. /proc/meminfo
  4. /proc/stat
  5. /proc/swaps
  6. /proc/uptime
  7. /proc/slabinfo
  8. /sys/devices/system/cpu/online
复制代码
安装lxcfs

1)直接使用apt安装lxcfs工具
  1. ▶ sudo apt install lxcfs
复制代码
2)部署到对应的目录
  1. sudo mkdir -p /var/lib/lxcfs
  2. sudo lxcfs /var/lib/lxcfs &
复制代码
部署完成之后,lxcfs是以一个后台进程的方式工作
docker 使用

1. 通例启动
  1. ▶ docker run -it --rm -m 512m ubuntu:18.04 bash
  2. root@ae00bec75ad7:/# free -m
  3.               total        used        free      shared  buff/cache   available
  4. Mem:          31954       11482        8487        1708       11983       18305
  5. Swap:          2047           0        2047
复制代码
2. docker使用lxcfs

先安装lxcfs
  1. ▶ sudo apt install lxcfs
复制代码
  1. ▶ docker run -it --rm -m 512m \
  2.       -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
  3.       ubuntu:18.04 bash
  4. root@56e3c146ba4e:/# free -m
  5.               total        used        free      shared  buff/cache   available
  6. Mem:            512           1         510           0           0         510
  7. Swap:             0           0           0
复制代码
通过lxcfs,让docker正确的识别了限定的内存
k8s 使用

1. 通例启动
  1. ▶ echo '         
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: wilson-test
  6. spec:
  7.   containers:
  8.   - image: ubuntu:18.04
  9.     imagePullPolicy: IfNotPresent
  10.     command: ["sleep", "33333"]
  11.     name: wilson-test
  12.     resources:
  13.       limits:
  14.         memory: 128Mi
  15.       requests:
  16.         memory: 64Mi
  17. ' | kubectl apply -f -
  18. pod/wilson-test created
  19. ▶ kubectl get pod
  20. NAME          READY   STATUS    RESTARTS   AGE
  21. wilson-test   1/1     Running   0          3s
  22. ▶ kubectl exec -it wilson-test -- free -m
  23.               total        used        free      shared  buff/cache   available
  24. Mem:          31954       11034        6384        1568       14534       18893
  25. Swap:          2047           0        2047
复制代码
使用lxcfs
  1. ▶ echo '                                                                                                                                                                                                                             
  2. apiVersion: v1                                                                                                                                                                                                                       
  3. kind: Pod
  4. metadata:
  5.   name: wilson-test
  6. spec:
  7.   containers:
  8.   - image: ubuntu:18.04
  9.     imagePullPolicy: IfNotPresent
  10.     command: ["sleep", "33333"]
  11.     name: wilson-test
  12.     resources:
  13.       limits:
  14.         memory: 128Mi
  15.       requests:
  16.         memory: 64Mi
  17.     volumeMounts:
  18.     - mountPath: /proc/meminfo
  19.       name: lxcfs-proc-meminfo
  20.       readOnly: true
  21.   volumes:
  22.   - hostPath:
  23.       path: /var/lib/lxcfs/proc/meminfo
  24.       type: ""
  25.     name: lxcfs-proc-meminfo
  26. ' | kubectl apply -f -
  27. pod/wilson-test created
  28. ▶ kubectl get pod
  29. NAME          READY   STATUS    RESTARTS   AGE
  30. wilson-test   1/1     Running   0          2s
  31. ▶ kubectl exec -it wilson-test -- free -m
  32.               total        used        free      shared  buff/cache   available
  33. Mem:            128           0         127           0           0         127
  34. 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,敬请等待
联系我

联系我,做深入的交流

至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

tsx81429

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表