前言
最近有个新同事问了我一个题目,明显通过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 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工具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- ▶ 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,敬请等待
联系我
联系我,做深入的交流
至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |