前言
最近有个新同事问了我一个问题,明明通过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,敬请期待
联系我
联系我,做深入的交流

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