表里不一--限制容器内存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,敬请期待

联系我

联系我,做深入的交流


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

posted @ 2024-12-02 10:19  it排球君  阅读(480)  评论(0编辑  收藏  举报