表里不一--约束容器内存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
,敬请期待
联络我
联络我,做深化的沟通
至此,本文完毕
鄙人孤陋寡闻,有撒汤漏水的,请各位不吝赐教...