技術(shù)解析系列|PouchContainer支持LXCFS實(shí)現(xiàn)高可靠容器隔離

技術(shù)解析系列 | PouchContainer 支持 LXCFS 實(shí)現(xiàn)高可靠容器隔離

漢南網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),漢南網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為漢南上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營(yíng)銷網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的漢南做網(wǎng)站的公司定做!

技術(shù)解析系列 | PouchContainer 支持 LXCFS 實(shí)現(xiàn)高可靠容器隔離

劃重點(diǎn)

本周起 PouchContainer 啟動(dòng)核心技術(shù)專家解析系列文章,第一篇文章將深入剖析 LXCFS 適用業(yè)務(wù)場(chǎng)景和原理,對(duì) LXCFS 感興趣的同學(xué)不要錯(cuò)過

引言

PouchContainer 是 Alibaba 開源的一款容器運(yùn)行時(shí)產(chǎn)品,當(dāng)前最新版本是 0.3.0,代碼地址位于:https://github.com/alibaba/pouch。PouchContainer 從設(shè)計(jì)之初即支持 LXCFS,實(shí)現(xiàn)高可靠容器隔離。Linux 使用 cgroup 技術(shù)實(shí)現(xiàn)資源隔離,然而容器內(nèi)仍然掛載宿主機(jī)的 /proc 文件系統(tǒng),用戶在容器內(nèi)讀取 /proc/meminfo 等文件時(shí),獲取的是宿主機(jī)的信息。容器內(nèi)缺少的 /proc 視圖隔離會(huì)帶來一系列的問題,進(jìn)而拖慢或阻礙企業(yè)業(yè)務(wù)容器化。LXCFS (https://github.com/lxc/lxcfs) 是開源 FUSE 文件系統(tǒng),用以解決 /proc 視圖隔離問題,使容器在表現(xiàn)層上更像傳統(tǒng)的虛擬機(jī)。本文首先介紹 LXCFS 適用業(yè)務(wù)場(chǎng)景,  剖析 LXCFS    ,最后簡(jiǎn)要介紹 LXCFS 在 PouchContainer 內(nèi)部集成的工作。

LXCFS 業(yè)務(wù)場(chǎng)景

在物理機(jī)和虛擬機(jī)時(shí)代,公司內(nèi)部逐漸形成了自己的一套工具鏈,諸如編譯打包、應(yīng)用部署、統(tǒng)一監(jiān)控等,這些工具已經(jīng)為部署在物理機(jī)和虛擬機(jī)中的應(yīng)用提供了穩(wěn)定的服務(wù)。接下來將從監(jiān)控、運(yùn)維工具、應(yīng)用部署等方面詳細(xì)闡述 LXCFS 在上述業(yè)務(wù)容器化過程中發(fā)揮的作用。

監(jiān)控和運(yùn)維工具

大部分的監(jiān)控工具,依賴 /proc 文件系統(tǒng)獲取系統(tǒng)信息。以阿里巴巴為例,阿里巴巴的部分基礎(chǔ)監(jiān)控工具是通過 tsar(https://github.com/alibaba/tsar) 收集信息。而 tsar 對(duì)內(nèi)存、CPU 信息的收集,依賴 /proc 文件系統(tǒng)。我們可以下載 tsar 的源碼,查看 tsar 對(duì) /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:內(nèi)存的計(jì)數(shù)器在/proc/meminfo,里面有一些關(guān)鍵項(xiàng)
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的計(jì)數(shù)器文件是:/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 對(duì)進(jìn)程、IO、CPU 的監(jiān)控都依賴 /proc 文件系統(tǒng)。

當(dāng)容器內(nèi) /proc 文件系統(tǒng)提供的是宿主機(jī)資源信息時(shí),這類監(jiān)控不能監(jiān)控容器內(nèi)信息。為了滿足業(yè)務(wù)需求,需要適配容器監(jiān)控,甚至需要單獨(dú)為容器內(nèi)監(jiān)控開發(fā)另一套監(jiān)控工具。這種改變勢(shì)必會(huì)拖慢甚至阻礙企業(yè)現(xiàn)存業(yè)務(wù)容器化的步伐,容器技術(shù)要盡可能兼容公司原有的工具鏈,兼顧工程師的使用習(xí)慣。

PouchContainer 支持 LXCFS 可以解決上述問題,依賴 /proc 文件系統(tǒng)的監(jiān)控、運(yùn)維工具,部署在容器內(nèi)或宿主機(jī)上對(duì)工具是透明的,現(xiàn)存監(jiān)控、運(yùn)維工具無需適配或重新開發(fā),即可平滑遷移到容器內(nèi),實(shí)現(xiàn)容器內(nèi)的監(jiān)控和運(yùn)維。

接下來讓我們從實(shí)例中直觀感受一下,在一臺(tái) Ubuntu 虛擬機(jī)中安裝 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 ,默認(rèn)不開啟 LXCFS,此時(shí)創(chuàng)建的容器無法使用 LXCFS 的功能,我們看一下容器內(nèi)相關(guān) /proc 文件的內(nèi)容:

 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

可以看到,在容器內(nèi)看到的 /proc/meminfo、uptime 文件的輸出與宿主機(jī)一致,雖然啟動(dòng)容器的時(shí)候指定了內(nèi)存為 50M,/proc/meminfo 文件并未體現(xiàn)出容器內(nèi)的內(nèi)存限制。

在宿主機(jī)內(nèi)啟動(dòng) LXCFS 服務(wù),手動(dòng)拉起 pouchd 進(jìn)程,并指定相應(yīng)的 LXCFS 相關(guān)參數(shù):

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

啟動(dòng)容器,獲取相應(yīng)的文件內(nèi)容:

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 啟動(dòng)的容器,讀取容器內(nèi) /proc 文件,可以得到容器內(nèi)的相關(guān)信息。

業(yè)務(wù)應(yīng)用

對(duì)于大部分對(duì)系統(tǒng)依賴較強(qiáng)的應(yīng)用,應(yīng)用的啟動(dòng)程序需要獲取系統(tǒng)的內(nèi)存、CPU 等相關(guān)信息,從而進(jìn)行相應(yīng)的配置。當(dāng)容器內(nèi)的 /proc 文件無法準(zhǔn)確反映容器內(nèi)資源的情況,會(huì)對(duì)上述應(yīng)用造成不可忽視的影響。

例如對(duì)于一些 Java 應(yīng)用,也存在啟動(dòng)腳本中查看 /proc/meminfo 動(dòng)態(tài)分配運(yùn)行程序的堆棧大小,當(dāng)容器內(nèi)存限制小于宿主機(jī)內(nèi)存時(shí),會(huì)發(fā)生分配內(nèi)存失敗引起的程序啟動(dòng)失敗。對(duì)于 DPDK 相關(guān)應(yīng)用,應(yīng)用工具需要根據(jù) /proc/cpuinfo 獲取 CPU 信息,得到應(yīng)用初始化 EAL 層所使用的 CPU 邏輯核。如果容器內(nèi)無法準(zhǔn)確獲取上述信息,對(duì)于 DPDK 應(yīng)用而言,則需要修改相應(yīng)的工具。

PouchContainer 集成 LXCFS

PouchContainer 從 0.1.0 版開始即支持 LXCFS,具體實(shí)現(xiàn)可以參見: https://github.com/alibaba/pouch/pull/502 .

簡(jiǎn)而言之,容器啟動(dòng)時(shí),通過-v 將宿主機(jī)上 LXCFS 的掛載點(diǎn) /var/lib/lxc/lxcfs/proc/ 掛載到容器內(nèi)部的虛擬 /proc 文件系統(tǒng)目錄下。此時(shí)在容器內(nèi)部 /proc 目錄下可以看到,一些列proc文件,包括 meminfo, uptime, swaps, stat, diskstats, cpuinfo 等。具體使用參數(shù)如下:

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

為了簡(jiǎn)化使用,pouch create 和 run 命令行提供參數(shù) --enableLxcfs, 創(chuàng)建容器時(shí)指定上述參數(shù),即可省略復(fù)雜的 -v 參數(shù)。

經(jīng)過一段時(shí)間的使用和測(cè)試,我們發(fā)現(xiàn)由于lxcfs重啟之后,會(huì)重建proc和cgroup,導(dǎo)致在容器里訪問 /proc 出現(xiàn) connect failed 錯(cuò)誤。為了增強(qiáng) LXCFS 穩(wěn)定性,在 PR:https://github.com/alibaba/pouch/pull/885 中,refine LXCFS 的管理方式,改由 systemd 保障,具體實(shí)現(xiàn)方式為在 lxcfs.service 加上 ExecStartPost 做 remount 操作,并且遍歷使用了 LXCFS 的容器,在容器內(nèi)重新 mount。

總結(jié)

PouchContainer 支持 LXCFS 實(shí)現(xiàn)容器內(nèi) /proc 文件系統(tǒng)的視圖隔離,將大大減少企業(yè)存量應(yīng)用容器化的過程中原有工具鏈和運(yùn)維習(xí)慣的改變,加快容器化進(jìn)度。有力支撐企業(yè)從傳統(tǒng)虛擬化到容器虛擬化的平穩(wěn)轉(zhuǎn)型。

網(wǎng)站題目:技術(shù)解析系列|PouchContainer支持LXCFS實(shí)現(xiàn)高可靠容器隔離
標(biāo)題鏈接:http://bm7419.com/article30/pccopo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、云服務(wù)器域名注冊(cè)、營(yíng)銷型網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名