背景
Linux 利用 Cgroup 实现了对容器的资源限制,但在容器内部依然缺省挂载了宿主机上的 procfs 的 /proc 目录,其包含如:meminfo、cpuinfo、stat、uptime 等资源信息。一些监控工具如 free、top 或 业务应用还依赖上述文件内容获取资源配置和使用情况。当它们在容器中运行时,就会把宿主机的资源状态读取出来,导致资源设置不对。
上面提到的问题,可以通过 LXCFS 方法来解决。
LXCFS 简介
社区中常见的做法是利用 lxcfs 来提供容器中的资源可见性。lxcfs 是一个开源的FUSE(用户态文件系统)实现来支持LXC容器,它也可以支持Docker容器。
LXCFS通过用户态文件系统,在容器中提供下列 procfs 的文件。
1 | /proc/cpuinfo |
LXCFS的示意图如下:

比如,把宿主机的 /var/lib/lxcfs/proc/memoinfo 文件挂载到 Docker 容器的 /proc/meminfo 位置后。容器中进程读取相应文件内容时,LXCFS 的 FUSE 实现会从容器对应的 Cgroup 中读取正确的内存限制。从而使得应用获得正确的资源约束设定。
LXCFS 在 Kubernetes 中实践
注意
在网上搜索到很多文章使用 https://github.com/denverdino/lxcfs-initializer 项目,但是在 Kubernetes 1.14+ 版本中就不支持 initializers 方法。并且这个项目已归档,不在维护,所以不推荐使用这个项目。
社区推出另一个项目 https://github.com/denverdino/lxcfs-admission-webhook 通过 Admission Webhook 给 Pod 注入 LXCFS 设置。
依赖
集群内所有 CentOS 节点需要安装 fuse-libs 包,否则会报 /usr/local/bin/lxcfs: error while loading shared libraries: libfuse.so.2: cannot open shared object file: No such file or directory 错误。
1 | $ yum install -y fuse-libs |
前提条件
演示环境是 Kubernetes version 1.18.2 二进制部署
1、Kubernetes api-versions 需要启用 admissionregistration.k8s.io/v1beta1。(Kubernetes 1.9.0+ 版本默认都启用)
1 | # 查看是否开启 |
2、kube-apiserver 配置中,需要配置 MutatingAdmissionWebhook 和 ValidatingAdmissionWebhook。并且添加顺序要正确。
1 | $ grep MutatingAdmissionWebhook /opt/kubernetes/cfg/kube-apiserver |
部署 LXCFS
下载 lxcfs-admission-webhook 项目
1 | $ gti clone https://github.com/denverdino/lxcfs-admission-webhook.git |
修改 deployment/lxcfs-daemonset.yaml 配置文件,因为 apps/v1beta2 在 1.18.2 版本已经弃用
1 | $ git diff |
部署 lxcfs
1 | $ kubectl apply -f deployment/lxcfs-daemonset.yaml |
部署 lxcfs-admission-webhook injector
1 | # 执行 shell 部署脚本 |
测试
启用需要注入的 lxcfs namespace,命名空间下所有 pod 都会被注入 lxcfs
1 | $ kubectl label namespace default lxcfs-admission-webhook=enabled |
部署一个 apache 服务来测试
1 | # 部署 apache |
清理
清理 lxcfs-admission-webhook
1 | $ deployment/uninstall.sh |
清理 lxcfs
1 | $ kubectl delete -f deployment/lxcfs-daemonset.yaml |
总结
lxcfs 支持容器镜像 Centos系统、Ubuntu系统、Debian系统,但是不支持容器镜像 Alpine系统。
因为 Alpine 不是使用
Gnu libc,而是使用musl libc。
参考链接
---本文结束感谢您的阅读。微信扫描二维码,关注我的公众号---
本文链接: https://www.yp14.cn/2020/06/10/Kubernetes-中利用-LXCFS-控制容器资源可见性/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!