技术解析系列 | PouchContainer 支持 LXCFS 实现高可靠容器隔离

技术解析系列 | PouchContainer 支持 LXCFS 实现高可靠容器隔离


划重点

本周起 PouchContainer 启动核心技术专家解析系列文章,第一篇文章将深入剖析 LXCFS 适用业务场景和原理,对 LXCFS 感兴趣的同学不要错过

引言

PouchContainer 是 Alibaba 开源的一款容器运行时产品,当前最新版本是 0.3.0,代码地址位于:https://github.com/alibaba/pouch。PouchContainer 从设计之初即支持 LXCFS,实现高可靠容器隔离。Linux 使用 cgroup 技术实现资源隔离,然而容器内仍然挂载宿主机的 /proc 文件系统,用户在容器内读取 /proc/meminfo 等文件时,获取的是宿主机的信息。容器内缺少的 /proc 视图隔离会带来一系列的问题,进而拖慢或阻碍企业业务容器化。LXCFS (https://github.com/lxc/lxcfs) 是开源 FUSE 文件系统,用以解决 /proc 视图隔离问题,使容器在表现层上更像传统的虚拟机。本文首先介绍 LXCFS 适用业务场景,  剖析 LXCFS    ,最后简要介绍 LXCFS 在 PouchContainer 内部集成的工作。

LXCFS 业务场景

在物理机和虚拟机时代,公司内部逐渐形成了自己的一套工具链,诸如编译打包、应用部署、统一监控等,这些工具已经为部署在物理机和虚拟机中的应用提供了稳定的服务。接下来将从监控、运维工具、应用部署等方面详细阐述 LXCFS 在上述业务容器化过程中发挥的作用。

监控和运维工具

大部分的监控工具,依赖 /proc 文件系统获取系统信息。以阿里巴巴为例,阿里巴巴的部分基础监控工具是通过 tsar(https://github.com/alibaba/tsar) 收集信息。而 tsar 对内存、CPU 信息的收集,依赖 /proc 文件系统。我们可以下载 tsar 的源码,查看 tsar 对 /proc 目录下一些文件的使用:

 1$ git remote -v 2origin    https://github.com/alibaba/tsar.git (fetch) 3origin    https://github.com/alibaba/tsar.git (push) 4$ grep -r cpuinfo . 5./modules/mod_cpu.c:    if ((ncpufp = fopen("/proc/cpuinfo", "r")) == NULL) { 6:tsar letty$ grep -r meminfo . 7./include/define.h:#define MEMINFO "/proc/meminfo" 8./include/public.h:#define MEMINFO "/proc/meminfo" 9./info.md:内存的计数器在/proc/meminfo,里面有一些关键项10./modules/mod_proc.c:    /* read total mem from /proc/meminfo */11./modules/mod_proc.c:    fp = fopen("/proc/meminfo", "r");12./modules/mod_swap.c: * Read swapping statistics from /proc/vmstat & /proc/meminfo.13./modules/mod_swap.c:    /* read /proc/meminfo */14$ grep -r diskstats .15./include/public.h:#define DISKSTATS "/proc/diskstats"16./info.md:IO的计数器文件是:/proc/diskstats,比如:17./modules/mod_io.c:#define IO_FILE "/proc/diskstats"18./modules/mod_io.c:FILE *iofp;                     /* /proc/diskstats*/19./modules/mod_io.c:    handle_error("Can't open /proc/diskstats", !iofp);

可以看到,tsar 对进程、IO、CPU 的监控都依赖 /proc 文件系统。

当容器内 /proc 文件系统提供的是宿主机资源信息时,这类监控不能监控容器内信息。为了满足业务需求,需要适配容器监控,甚至需要单独为容器内监控开发另一套监控工具。这种改变势必会拖慢甚至阻碍企业现存业务容器化的步伐,容器技术要尽可能兼容公司原有的工具链,兼顾工程师的使用习惯。

PouchContainer 支持 LXCFS 可以解决上述问题,依赖 /proc 文件系统的监控、运维工具,部署在容器内或宿主机上对工具是透明的,现存监控、运维工具无需适配或重新开发,即可平滑迁移到容器内,实现容器内的监控和运维。

接下来让我们从实例中直观感受一下,在一台 Ubuntu 虚拟机中安装 PouchContainer 0.3.0 :

1# uname -a2Linux p4 4.13.0-36-generic #40~16.04.1-Ubuntu SMP Fri Feb 16 23:25:58 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

systemd 拉起 pouchd ,默认不开启 LXCFS,此时创建的容器无法使用 LXCFS 的功能,我们看一下容器内相关 /proc 文件的内容:

 1# systemctl start pouch 2# head -n 5 /proc/meminfo 3MemTotal:        2039520 kB 4MemFree:          203028 kB 5MemAvailable:     777268 kB 6Buffers:          239960 kB 7Cached:           430972 kB 8[email protected]:~# cat /proc/uptime 92594341.81 2208722.3310# pouch run -m 50m -it registry.hub.docker.com/library/busybox:1.2811/ # head -n 5 /proc/meminfo12MemTotal:        2039520 kB13MemFree:          189096 kB14MemAvailable:     764116 kB15Buffers:          240240 kB16Cached:           433928 kB17/ # cat /proc/uptime182594376.56 2208749.32

可以看到,在容器内看到的 /proc/meminfo、uptime 文件的输出与宿主机一致,虽然启动容器的时候指定了内存为 50M,/proc/meminfo 文件并未体现出容器内的内存限制。

在宿主机内启动 LXCFS 服务,手动拉起 pouchd 进程,并指定相应的 LXCFS 相关参数:

1# systemctl start lxcfs2# pouchd -D --enable-lxcfs --lxcfs /usr/bin/lxcfs >/tmp/1 2>&1 &3[1] 327074# ps -ef |grep lxcfs5root       698     1  0 11:08 ?        00:00:00 /usr/bin/lxcfs /var/lib/lxcfs/6root       724 32144  0 11:08 pts/22  00:00:00 grep --color=auto lxcfs7root     32707 32144  0 11:05 pts/22   00:00:00 pouchd -D --enable-lxcfs --lxcfs /usr/bin/lxcfs

启动容器,获取相应的文件内容:

1# pouch run --enableLxcfs -it -m 50m registry.hub.docker.com/library/busybox:1.282/ # head -n 5 /proc/meminfo3MemTotal:          51200 kB4MemFree:           50804 kB5MemAvailable:      50804 kB6Buffers:               0 kB7Cached:                4 kB8/ # cat /proc/uptime910.00 10.00

使用 LXCFS 启动的容器,读取容器内 /proc 文件,可以得到容器内的相关信息。

业务应用

对于大部分对系统依赖较强的应用,应用的启动程序需要获取系统的内存、CPU 等相关信息,从而进行相应的配置。当容器内的 /proc 文件无法准确反映容器内资源的情况,会对上述应用造成不可忽视的影响。

例如对于一些 Java 应用,也存在启动脚本中查看 /proc/meminfo 动态分配运行程序的堆栈大小,当容器内存限制小于宿主机内存时,会发生分配内存失败引起的程序启动失败。对于 DPDK 相关应用,应用工具需要根据 /proc/cpuinfo 获取 CPU 信息,得到应用初始化 EAL 层所使用的 CPU 逻辑核。如果容器内无法准确获取上述信息,对于 DPDK 应用而言,则需要修改相应的工具。

PouchContainer 集成 LXCFS

PouchContainer 从 0.1.0 版开始即支持 LXCFS,具体实现可以参见: https://github.com/alibaba/pouch/pull/502 .

简而言之,容器启动时,通过-v 将宿主机上 LXCFS 的挂载点 /var/lib/lxc/lxcfs/proc/ 挂载到容器内部的虚拟 /proc 文件系统目录下。此时在容器内部 /proc 目录下可以看到,一些列proc文件,包括 meminfo, uptime, swaps, stat, diskstats, cpuinfo 等。具体使用参数如下:

1-v /var/lib/lxc/:/var/lib/lxc/:shared2-v /var/lib/lxc/lxcfs/proc/uptime:/proc/uptime 3-v /var/lib/lxc/lxcfs/proc/swaps:/proc/swaps 4-v /var/lib/lxc/lxcfs/proc/stat:/proc/stat 5-v /var/lib/lxc/lxcfs/proc/diskstats:/proc/diskstats 6-v /var/lib/lxc/lxcfs/proc/meminfo:/proc/meminfo 7-v /var/lib/lxc/lxcfs/proc/cpuinfo:/proc/cpuinfo

为了简化使用,pouch create 和 run 命令行提供参数 --enableLxcfs, 创建容器时指定上述参数,即可省略复杂的 -v 参数。

经过一段时间的使用和测试,我们发现由于lxcfs重启之后,会重建proc和cgroup,导致在容器里访问 /proc 出现 connect failed 错误。为了增强 LXCFS 稳定性,在 PR:https://github.com/alibaba/pouch/pull/885 中,refine LXCFS 的管理方式,改由 systemd 保障,具体实现方式为在 lxcfs.service 加上 ExecStartPost 做 remount 操作,并且遍历使用了 LXCFS 的容器,在容器内重新 mount。

总结

PouchContainer 支持 LXCFS 实现容器内 /proc 文件系统的视图隔离,将大大减少企业存量应用容器化的过程中原有工具链和运维习惯的改变,加快容器化进度。有力支撑企业从传统虚拟化到容器虚拟化的平稳转型。

原文地址:http://blog.51cto.com/13778063/2155361

时间: 2024-08-28 00:24:36

技术解析系列 | PouchContainer 支持 LXCFS 实现高可靠容器隔离的相关文章

技术解析系列 | PouchContainer CRI的设计与实现

CRI简介在每个Kubernetes节点的最底层都有一个程序负责具体的容器创建删除工作,Kubernetes会对其接口进行调用,从而完成容器的编排调度.我们将这一层软件称之为容器运行时(Container Runtime),大名鼎鼎的Docker就是其中的代表. 当然,容器运行时并非只有Docker一种,包括CoreOS的rkt,hyper.sh的runV,Google的gvisor,以及本文的主角PouchContainer,都包含了完整的容器操作,能够用来创建特性各异的容器.不同的容器运行时

技术解析系列 | PouchContainer 富容器技术

划重点 本文将从什么是富容器.富容器适用场景.富容器技术实现三个角度全方位向大家解释富容器技术,同时对富容器感兴趣的同学可以扫描文章末尾二维码参与关于富容器的技术讨论.本文作者 PouchContainer 团队孙宏亮,更多信息扫描二维码见真人. PouchContainer 是阿里巴巴集团开源的高效.轻量级企业级富容器引擎技术,拥有隔离性强.可移植性高.资源占用少等特性.可以帮助企业快速实现存量业务容器化,同时提高超大规模下数据中心的物理资源利用率. PouchContainer 源自阿里巴巴

技术解析系列 | PouchContainer Goroutine Leak 检测实践

划重点 本文将从什么是 goroutine leak,如何检测以及常用的分析工具来介绍 PouchContainer 在 goroutine leak 方面的检测实践. 0. 引言 PouchContainer 是阿里巴巴集团开源的一款容器运行时产品,它具备强隔离和可移植性等特点,可用来帮助企业快速实现存量业务容器化,以及提高企业内部物理资源的利用率. PouchContainer 同时还是一款 golang 项目.在此项目中,大量运用了 goroutine 来实现容器管理.镜像管理和日志管理等

技术解析系列 | 阿里 PouchContainer 资源管理探秘

PouchContainer 是阿里巴巴集团开源的高效.企业级容器引擎技术,拥有隔离性强.可移植性高.资源占用少等特点.可以帮助企业快速实现存量业务容器化,同时提高超大规模下数据中心的物理资源利用率. 资源管理是容器运行时的一个重要的部分,本文将给大家介绍PouchContainer资源管理的常用接口和其对应的底层内核接口,为了让读者加深理解,本文为部分接口提供了测试用例. 1. PouchContainer资源管理常用接口 2. PouchContainer资源管理底层的内核技术 2.1 Me

UWP 手绘视频创作工具技术分享系列 - SVG 的解析和绘制

本篇作为技术分享系列的第一篇,详细讲一下 SVG 的解析和绘制,这部分功能的研究和最终实现由团队的 @黄超超 同学负责,感谢提供技术文档和支持. 首先我们来看一下 SVG 的文件结构和组成 SVG (Scalable Vector Graphics) 是一种可缩放矢量图形,使用 XML 格式来定义,是一种 W3C 标准,图像在放大或改变尺寸的情况下其图形质量不会有所损失. 下面是一个简单的 SVG 的文件结构例子: <?xml version="1.0" standalone=&

分享《TensorFlow技术解析与实战》高清中文PDF+源代码

下载:https://pan.baidu.com/s/1jdZ9eSrZ7xnsbbMIUO17qQ <TensorFlow技术解析与实战>高清中文PDF+源代码 高清中文PDF,311页,带目录和书签,文字可以复制粘贴,彩色配图.配套源代码.经典书籍.本书从深度学习的基础讲起,深入TensorFlow框架原理.模型构建.源代码分析和网络实现等各个方面.全书分为基础篇.实战篇和提高篇三部分. 其中,高清中文版如图: 原文地址:http://blog.51cto.com/3215120/2311

STM32F413/423/446芯片解密单片机破解技术解析!

STM32F413/423/446芯片解密单片机破解技术解析! 深圳凯基迪科技,专业承接各种高难度加密芯片,现承诺STM32F413解密STM32F423解密STM32F446芯片解密单片机破解100%包成功!如有需要欢迎咨询:132-6677-8242 , QQ:528621124 STM32F413/423 Cortex-M4入门级高性能微控制器: STM32F413/423微控制器为高性能STM32F4系列单片机的入门级产品,实现了运行模式下的动态功耗和处理器性能之间的最佳平衡,即使在3.

PCIe闪存控制器技术解析

一.PCIe-SSD架构解析 PCIe作为CPU的局部总线,最大的特点在于数据传输吞吐量大和延迟低.对于NandFlash固态存储而言,传统磁盘存储领域存在的随机读写问题将不复存在,因此,整个存储系统的瓶颈从存储介质转移到了传输接口上来了.为存储而生的SATA/SAS接口在SSD上的表现不是那么理想了,非常影响IO的传输延迟.为此,显而易见,存储接口应该从传统的SATA/SAS往离CPU更近的系统总线PCIe或者DIMM方向发展. 大家其实很早就认识到了这一点,当年Fusion-io推出基于PC

Ngnix技术研究系列2-基于Redis实现动态路由

上篇博文我们写了个引子: Ngnix技术研究系列1-通过应用场景看Nginx的反向代理 发现了新大陆,OpenResty OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭建能够处理超高并发.扩展性极高的动态 Web 应用.Web 服务和动态网关. OpenResty 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强