中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

技術解析系列 | PouchContainer 支持 LXCFS 實現高可靠容器隔離

發布時間:2020-09-25 03:40:02 來源:網絡 閱讀:1358 作者:阿里系統軟件技術 欄目:建站服務器


技術解析系列 | 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 -a
2Linux 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
8root@p4:~# cat /proc/uptime
92594341.81 2208722.33
10# pouch run -m 50m -it registry.hub.
docker.com/library/busybox:1.28

11/ # head -n 5 /proc/meminfo
12MemTotal:        2039520 kB
13MemFree:          189096 kB
14MemAvailable:     764116 kB
15Buffers:          240240 kB
16Cached:           433928 kB
17/ # cat /proc/uptime
182594376.56 2208749.32

可以看到,在容器內看到的 /proc/meminfo、uptime 文件的輸出與宿主機一致,雖然啟動容器的時候指定了內存為 50M,/proc/meminfo 文件并未體現出容器內的內存限制。

在宿主機內啟動 LXCFS 服務,手動拉起 pouchd 進程,并指定相應的 LXCFS 相關參數:

1# systemctl start lxcfs
2# pouchd -D --enable-lxcfs --lxcfs
/usr/bin/lxcfs >/tmp/1 2>&1 &

3[1] 32707
4# ps -ef |grep lxcfs
5root       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 lxcfs
7root     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.28

2/ # head -n 5 /proc/meminfo
3MemTotal:          51200 kB
4MemFree:           50804 kB
5MemAvailable:      50804 kB
6Buffers:               0 kB
7Cached:                4 kB
8/ # cat /proc/uptime
910.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/:shared
2-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 文件系統的視圖隔離,將大大減少企業存量應用容器化的過程中原有工具鏈和運維習慣的改變,加快容器化進度。有力支撐企業從傳統虛擬化到容器虛擬化的平穩轉型。



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

越西县| 临清市| 西平县| 曲周县| 湘乡市| 云南省| 惠东县| 临泉县| 瓮安县| 河间市| 谷城县| 额敏县| 新沂市| 威远县| 五峰| 辽阳县| 册亨县| 温州市| 从化市| 中阳县| 喀喇沁旗| 和龙市| 定日县| 德钦县| 巴东县| 芦溪县| 本溪市| 漾濞| 泽库县| 米易县| 汝阳县| 临西县| 巴青县| 宜兴市| 清涧县| 东阳市| 阿拉尔市| 广丰县| 达日县| 壶关县| 阳江市|