表里不一–限制容器内存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


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

发表评论

评论已关闭。

相关文章