使用 LXCFS 文件系统实现容器资源可见性

这篇具有很好参考价值的文章主要介绍了使用 LXCFS 文件系统实现容器资源可见性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言:

Linux 利用 Cgroup 实现了对容器资源的限制,但是当在容器内运行 top 命令时就会发现,它显示的信息是宿主机的 CPU 和 内存数据,而不是当前容器的数据。造成这个问题的原因,就是因为 /proc 文件系统并不了解 Cgroup 限制的存在。

社区中常见的做法是利用 lxcfs 文件系统来为容器提供资源可见性。

一、基本介绍


LXCFS 是一个开源的 Fuse(用户态文件系统),支持 LXC 容器,同时支持 Docker 容器。启动以后会在指定目录中维护 /proc 目录中的文件同名的文件,从而保证容器在读取数据时读取到 lxcfs 维护的 /proc 文件中的信息数据。

  • LXCFS 通过用户态文件系统,在容器中提供下列 procfs 的文件。
/proc/cpuinfo
/proc/diskstats
/proc/meminfo
/proc/stat
/proc/swaps
/proc/uptime

LXCFS 的示意图如下:
使用 LXCFS 文件系统实现容器资源可见性

  • 比如,把宿主机的 /var/lib/lxcfs/proc/meminfo 文件挂载到容器的 proc/meminfo 位置后;
  • 容器中进程读取相应文件内容时,LXCFSFuse 实现会从容器对应的 Cgroup 中读取正确的内存限制。

二、LXCFS 安装与使用


1.安装 LXCFS 文件系统

[root@localhost ~]# wget http://copr-be.cloud.fedoraproject.org/results/ganto/lxc3/epel-7-x86_64/01041891-lxcfs/lxcfs-3.1.2-0.2.el7.x86_64.rpm   
[root@localhost ~]# yum -y localinstall lxcfs-3.1.2-0.2.el7.x86_64.rpm
[root@localhost ~]# sed -i 's@ExecStart=.*@ExecStart=/usr/bin/lxcfs -o nonempty /var/lib/lxcfs/@g' /usr/lib/systemd/system/lxcfs.service
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start lxcfs && systemctl enable lxcfs

如果 lxcfs 重启时出现如下报错,说明挂载的目录不是空目录,需要增加 -o nonempty 参数。

  • fuse: mountpoint is not empty
  • fuse: if you are sure this is safe, use the 'nonempty' mount option

2.基于 Docker 实现容器资源可见性

[root@localhost ~]# docker run -it -m 512Mb --cpus 2 \
-v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
-v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
-v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
-v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
tomcat:8.5.87 /bin/bash

使用 LXCFS 文件系统实现容器资源可见性

3.基于 Kubernetes 实现容器资源可见性

  • 通过 https://github.com/denverdino/lxcfs-admission-webhookAdmission Webhook 来给 Pod 注入 LXCFS 设置。
  • 需要检查 Kubernetes 的 api-versions 是否启动 admissionregistration.k8s.io/v1beta1(1.9.0+)
kubectl api-versions | grep 'admissionregistration.k8s.io/v1beta1'

1)安装 lxcfs 文件系统

[root@localhost ~]# git clone https://github.com/denverdino/lxcfs-admission-webhook.git
[root@localhost ~]# cd lxcfs-admission-webhook
[root@localhost lxcfs-admission-webhook]# sed -i '/^metadata/a\  namespace: kube-system' deployment/lxcfs-daemonset.yaml  
[root@localhost lxcfs-admission-webhook]# kubectl apply -f deployment/lxcfs-daemonset.yaml

2)修改 Kube-APIServer 配置文件,开启服务插件

  • 增加:MutatingAdmissionWebhook,ValidatingAdmissionWebhook
[root@localhost ~]# vim /etc/systemd/system/kube-apiserver.service
--enable-admission-plugins=

3)重启 Kube-APIServer 服务

[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart kube-apiserver

4)安装 lxcfs-admission-webhook 注射器服务

[root@localhost lxcfs-admission-webhook]# bash deployment/install.sh
creating certs in tmpdir /tmp/tmp.kK3cUmQvdG
Generating RSA private key, 2048 bit long modulus
............+++
...................+++
e is 65537 (0x10001)
certificatesigningrequest.certificates.k8s.io/lxcfs-admission-webhook-svc.default created
NAME                                  AGE   REQUESTOR   CONDITION
lxcfs-admission-webhook-svc.default   1s    admin       Pending
certificatesigningrequest.certificates.k8s.io/lxcfs-admission-webhook-svc.default approved
secret/lxcfs-admission-webhook-certs created
NAME                            TYPE     DATA   AGE
lxcfs-admission-webhook-certs   Opaque   2      0s
deployment.apps/lxcfs-admission-webhook-deployment created
service/lxcfs-admission-webhook-svc created
mutatingwebhookconfiguration.admissionregistration.k8s.io/mutating-lxcfs-admission-webhook-cfg created

查看

[root@localhost lxcfs-admission-webhook]# kubectl get secrets,pods,svc,mutatingwebhookconfigurations

6)验证

[root@localhost lxcfs-admission-webhook]# kubectl label namespace default lxcfs-admission-webhook=enabled
[root@localhost lxcfs-admission-webhook]# kubectl apply -f deployment/web.yaml
  • kubectl label namespace default lxcfs-admission-webhook=enabled:将 default 命名空间下所有的 Pod 都进行注册;
  • 这里我们需要注意,注册的命名空间要和 lxcfs 服务所在的命名空间区分开,否则 lxcfs 被重启后会输出如下报错:
caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type

[root@localhost lxcfs-admission-webhook]# kubectl exec -it web-7f4dfcc4f4-88rb7 -- /bin/bash
root@web-7f4dfcc4f4-88rb7:/usr/local/apache2# free -h
             total       used       free     shared    buffers     cached
Mem:          256M       6.2M       249M         0B         0B       300K
-/+ buffers/cache:       5.9M       250M
Swap:           0B         0B         0

使用 LXCFS 文件系统实现容器资源可见性文章来源地址https://www.toymoban.com/news/detail-416016.html

到了这里,关于使用 LXCFS 文件系统实现容器资源可见性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CNStack 虚拟化服务:实现虚拟机和容器资源的共池管理

    容器无疑已经成为新的云计算基础设施,企业私有云平台的建设重心,正在从虚拟化的计算、存储、网络的建设,转向构建以容器、微服务等为核心的云原生平台。不过值得注意的是,企业 IT 系统在进行容器化改造的过程中,由于历史遗留系统、技术债务、内核依赖等原因,

    2024年01月25日
    浏览(91)
  • 游戏引擎架构-资源及文件系统

    本篇知识点来源于《游戏引擎架构》第六章,主要讨论现代三维游戏引擎中典型资源管理器的运作方式。 对于大部分资产来说,游戏引擎并不会使用其原本的格式。资产需要经过一些资产调节管道,把资产转换为引擎所需的格式。当流经资产调节管道时,每个资源都需要用一

    2024年01月18日
    浏览(40)
  • 如何一键生成字幕,如何快速处理生肉资源?借助whisper语音识别系统生成.srt字幕文件 手把手教学在Windows、CPU版本下whisper的安装与使用,快速上手!

    Whisper是Open AI开源的语音识别网络,支持98中语言,用于语音识别和翻译等任务。我们可以将歌曲的歌词进行识别,将无字幕的视频资源自动生成字母,极大方便了用户。同时,whisper可以在本地运行,充分保障了个人隐私。在识别方面也具有较准确的识别能力。 因此想通过本

    2024年02月02日
    浏览(32)
  • 【容器文件系统】了解容器 overlay 文件系统和 /var/lib/docker/overlay2下目录的作用

    浅析 Docker overlay2 文件结构 docker(5): 层 朱双印 有这个问题困惑着我:容器删除 docker rm 后,docker cp 到容器内的文件,在 /var/lib/docker/overlay2 目录中是否还会存在 答案:容器删除后 docker rm 后, 会自动删除 /var/lib/docker/overlay2 中对应的文件 实验步骤 给答案 通过上述实验,我们

    2024年02月16日
    浏览(52)
  • 【探索 Kubernetes|容器基础进阶篇 系列 3】容器进程的文件系统

    【云原生-深入理解Kubernetes-1】容器的本质是进程 【云原生-深入理解Kubernetes-2】容器 Linux Cgroups 限制 大家好,我是秋意零。 😈 CSDN作者主页 😎 博客主页 👿 简介 👻 普通本科生在读 在校期间参与众多计算机相关比赛,如:🌟 “省赛”、“国赛” ,斩获多项奖项荣誉证书

    2024年02月09日
    浏览(34)
  • 资源分享系统|基于Springboot+vue实现资源分享系统

    作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路  关注作者有好处 文末获取源码   网络的快速发展,

    2024年02月01日
    浏览(34)
  • C/C++ 实现动态资源文件释放

    当我们开发Windows应用程序时,通常会涉及到使用资源(Resource)的情况。资源可以包括图标、位图、字符串等,它们以二进制形式嵌入到可执行文件中。在某些情况下,我们可能需要从可执行文件中提取自定义资源并保存为独立的文件。在这篇博客文章中,我们将讨论如何使

    2024年02月05日
    浏览(30)
  • 【翻译】Qt Designer 如何使用资源文件

    原文地址:https://doc.qt.io/qt-6/designer-resources.html Qt的资源浏览器是用于管理应用程序资源的工具,可以让开发者方便地查看和管理应用程序中的各种资源文件,例如图像、字体、布局文件、对话框等。 资源浏览器提供了一个可视化的界面,可以让开发者轻松地浏览和管理应用

    2024年01月19日
    浏览(28)
  • qt 窗口实现打开文件夹浏览资源(纯代码实现,后附代码)

     新建 widget 项目可参考 QT入门初学者——如何新建一个工程项目(详细)_guuuuug的博客-CSDN博客_qt新建工程   实现界面,点击浏览会打开文件夹 选中文件,窗口显示文件名,文件路径 过长的文字会在最后显示...,鼠标悬浮在文字栏会显示全部文字。 点击右下角打开可以实现打

    2024年02月11日
    浏览(32)
  • 使用C语言实现磁盘的文件管理系统

    项目名称 磁盘文件管理系统 项 目 实 现 原 理 简 述 一、实验目的: 1.理解磁盘文件管理的概念和原理; 2.了解文件的逻辑结构和物理结构; 3.理解文件目录结构; 4.掌握磁盘存储空间管理、文件操作实现方法。 二、实验内容: 设计并实现一个简单的磁盘文件管理系统,用文

    2024年02月09日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包