溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

在tinycorelinux上如何安裝containerd和openfaas

發(fā)布時(shí)間:2021-11-15 10:07:38 來(lái)源:億速云 閱讀:322 作者:小新 欄目:云計(jì)算

這篇文章主要介紹在tinycorelinux上如何安裝containerd和openfaas,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

容器化為什么這么重要,因?yàn)槿萜魇乾F(xiàn)在最流行的原生virtual cloud appliance(cloud appliance化是app部署級(jí)別的融合,代表著“為云APP造一種包結(jié)構(gòu)”,k8s這些被稱(chēng)為云原生所以你可以將其簡(jiǎn)單理解為云原生軟件包,cloud appliance要與app開(kāi)發(fā)用的內(nèi)部cloud appstack融合化區(qū)別開(kāi))代表,作為統(tǒng)一部署方案,它主要關(guān)注解決集群和云上那些“軟件發(fā)行資源配額的隔離”問(wèn)題,軟件的資源配額從來(lái)都是一個(gè)復(fù)雜的關(guān)聯(lián)問(wèn)題,可巧這些問(wèn)題在本地和原生的包管理軟件中(包主要關(guān)注解決依賴(lài)問(wèn)題)也存在,linux上提供了統(tǒng)一的整套內(nèi)核級(jí)支持方案(比如liblxc,libcgroups,基于它們+brtfs可以完全用shell發(fā)明一套簡(jiǎn)單的docker運(yùn)行時(shí),當(dāng)然這跟我們需要的,最終完備的容器和容器管理系統(tǒng)containerd,openfaas是沒(méi)法比的),另一方面,“資源隔離”稍微更進(jìn)一步,就很容易與“軟件怎么樣啟動(dòng)”這些問(wèn)題相關(guān)聯(lián),變成systemd這類(lèi)軟件要解決的問(wèn)題(systemd-nspawn可以創(chuàng)建最輕量級(jí)的容器),進(jìn)而變成k8s這類(lèi)軟件要解決的問(wèn)題。所以,這三大問(wèn)題融合和關(guān)聯(lián)發(fā)生在方方面面,,很容易成為某種“混合包管理和容器管理”融合體系要解決的中心問(wèn)題,進(jìn)而需要這樣一種軟件,core os的https://github.com/rkt/rkt就是這一類(lèi)軟件的代表并為此構(gòu)建出一個(gè)基于容器作為包管理的OS(雖然2020年中期它們準(zhǔn)備dreprecate了)。

這就是說(shuō),容器化的實(shí)現(xiàn)可以簡(jiǎn)單也可以復(fù)雜,不同OS也有集成不同復(fù)雜容器管理的方案,除了core os的rkt這種,tc的tce pkg本身就是一種沙盒環(huán)境,不過(guò)它與上述提到的lxc,ovz,containerd這些真正意義的容器化沒(méi)有關(guān)系。前述與openfaas相關(guān)的這些文章都是在流行的linux發(fā)行版中實(shí)踐裝openfaas的例子,接下來(lái)的本文將介紹嘗試在tinycorelinux11中裝真正的容器,即containerd和openfaas的安裝實(shí)踐過(guò)程。

這里的主要問(wèn)題是,tc本身是一種raw linux發(fā)行版,追求小和簡(jiǎn)單,一般地,跟alpine一樣tc往往作為容器guest os如boot2docker,鮮少在tc上裝containerd作為容器服務(wù)器環(huán)境,因此,在tc中裝容器可能會(huì)因?yàn)闆](méi)有現(xiàn)成參考方案而顯得繁瑣。比如,tc也沒(méi)有使用systemd這類(lèi)復(fù)雜的init啟動(dòng)管理系統(tǒng)而是簡(jiǎn)單的sysv init(雖然systemd提出了一個(gè)巨大的init pid 1,但是它只關(guān)注“啟動(dòng)”,這點(diǎn)上,它還是符合kiss的)。一般linux發(fā)行都是依賴(lài)systemd處理容器設(shè)置的一些至關(guān)重要的基礎(chǔ)問(wèn)題,比如稍后我們會(huì)談到systemd自動(dòng)管理cgroups,,而這些在tc中都沒(méi)有,需要手動(dòng)還不見(jiàn)得能解決,

不管了,下面開(kāi)始嘗試實(shí)踐,我們的測(cè)試環(huán)境是tc11。

1,制造一個(gè)containerd.tcz和faasd.tcz

準(zhǔn)備一個(gè)集成了openssh,sudo passwd tc,做好了bootcode tce=sda1,echo過(guò) /opt/tcemirror,/etc/passwd,/etc/shadow > /mnt/sda1/opt/.filetool.lst,tar 進(jìn)restore=sda1 mydata.gz的基本ezremasterd tc11 iso,即《一個(gè)fully retryable的rootbuild packer腳本,從0打造matecloudos(2)》中第一小節(jié)那樣的iso。我們開(kāi)啟二個(gè)引導(dǎo)了這個(gè)iso的虛擬機(jī),都用parted格好sda1,這二虛擬機(jī)準(zhǔn)備一個(gè)生成containerd.tcz和faasd.tcz用(生成后在其目錄下python -m SimpleHTTPServer 80供以后下載,事先ifconfig看好ip),另一個(gè)測(cè)試生成的tcz(/opt/tcemirror設(shè)成第一臺(tái)地址+11.x/x86_64/tcz正確的結(jié)構(gòu)),在第一臺(tái)虛擬機(jī)的/mnt/sda1根目錄中,安排這些文件:

準(zhǔn)備文件夾結(jié)構(gòu)和binaries:
docker采用前述文章的版本組合而成(做二文件夾一個(gè)containerd-root,其中cni放在/opt/cin/bin,runc放在/usr/local/sbin,containerd放在/usr/local/bin,一個(gè)faasd-root,其中放/usr/local/bin/faasd,faas-cli,最后,前文提到的幾個(gè)offline docker image也集進(jìn)來(lái)放在faasd-root/tmp/*.tar)。這些exe設(shè)好chmod +x,由于這些exe都是go的,都是靜態(tài)鏈接的,在tc11上可直接運(yùn)行(lib64一定要ln -s 一下到lib,否則ctr不能起作用)。

準(zhǔn)備幾個(gè)配置文件:
一些containerd和faasd啟動(dòng)時(shí)的動(dòng)態(tài)文件,不用創(chuàng)建。否則會(huì)導(dǎo)致只讀文件系統(tǒng)無(wú)法寫(xiě)入錯(cuò)誤
/etc/cni/net.d/10-openfaas.conflist
/var/lib/faasd/secrets/*
/var/lib/faasd/resolv.conf
/var/lib/faasd-provider/resolv.conf
這些文件必須要
/var/lib/faasd/docker-compose.yaml
/var/lib/faasd/prometheus.yml

準(zhǔn)備overlay module:
在第一臺(tái)中tce-load -iw bc compiletc perl5重新編譯kernel,在config中把config_overy_fs打開(kāi)為m,得到overlay module,因?yàn)樗趖c11中被關(guān)閉了。下載tc11中所需的kernel編譯文件http://mirrors.163.com/tinycorelinux/11.x/x86_64/release/src/kernel/到/mnt/sda1
解壓并cp config-5.4.3-tinycore64 linux-5.4.3/.config
sudo make oldconfig,提示幾個(gè)交互項(xiàng)直接回車(chē)
sudo make install
sudo make modules_install
把得到的overlay module file(在/lib/modules/fs中)放到準(zhǔn)備打包的containerd.tcz文件夾結(jié)構(gòu)中。

準(zhǔn)備2個(gè)服務(wù)文件并分別chmod +x:
containerd-root/usr/local/init.d/start-containerd:
/sbin/modprobe overlay
/usr/local/bin/containerd
containerd-root/usr/local/init.d/start-faasd:
for i in 1 2 3; do [[ ! -z "$(ctr image list|grep basic-auth-plugin)" ]] && break;ctr --address=/run/containerd/containerd.sock image import /tmp/faasd-containers/basic-auth-plugin-0.18.18.tar;echo "checking basic-auth ($i),if failed at 3,it may require a reboot"; sleep 3;done         
for i in 1 2 3; do [[ ! -z "$(ctr image list|grep nats)" ]] && break;ctr --address=/run/containerd/containerd.sock image import /tmp/faasd-containers/nats-streaming-0.11.2.tar;echo "checking nats ($i),if failed at 3,it may require a reboot"; sleep 3;done                                
for i in 1 2 3; do [[ ! -z "$(ctr image list|grep prometheus)" ]] && break;ctr --address=/run/containerd/containerd.sock image import /tmp/faasd-containers/prometheus-v2.14.0.tar;echo "checking prometheus ($i),if failed at 3,it may require a reboot"; sleep 3;done                       
for i in 1 2 3; do [[ ! -z "$(ctr image list|grep gateway)" ]] && break;ctr --address=/run/containerd/containerd.sock image import /tmp/faasd-containers/gateway-0.18.18.tar;echo "checking gateway ($i),failed at 3,it may require a reboot"; sleep 3;done                                   
for i in 1 2 3; do [[ ! -z "$(ctr image list|grep queue-worker)" ]] && break;ctr --address=/run/containerd/containerd.sock image import /tmp/faasd-containers/queue-worker-0.11.2.tar;echo "checking queueworker ($i),if failed at 3,it may require a reboot"; sleep 3;done
cd /var/lib/faasd
/usr/local/bin/faasd provider
/usr/local/bin/faasd up

準(zhǔn)備mkall.sh放到/mnt/sda1根下chmod +x起來(lái):
mkall.sh的內(nèi)容(注意到統(tǒng)一作為tc:staff存放到tcz中):
rm -rf containerd.tcz containerd.tcz.md5.txt faasd.tcz faasd.tcz.md5.txt faasd.tcz
mksquashfs containerd-root containerd.tcz -noappend -no-fragments -force-uid tc
md5sum containerd.tcz > containerd.tcz.md5.txt
mksquashfs faasd-root faasd.tcz -noappend -no-fragments -force-uid tc -force-gid staff
md5sum faasd.tcz > faasd.tcz.md5.txt
echo containerd.tcz > faasd.tcz.dep

sudo ./mkall.sh打包好的tcz各80多m,準(zhǔn)備好后我們就可以在第二臺(tái)測(cè)試了,tce-load -iw faasd后經(jīng)過(guò)測(cè)試不滿意可刪除/mnt/sda1/tce/optional下的tcz重啟重來(lái),我們需要不斷mkall并測(cè)試生成的二個(gè)tcz。

2,測(cè)試

第一次測(cè)試啟動(dòng)start-containerd,start-faasd,出現(xiàn):no cgroup mount found in mountinfo: unknown這就是上面談到tc11不具有自動(dòng)處理cgroups的邏輯。而containerd依賴(lài)它們。tc11中的kernel config中提供了linux對(duì)容器的內(nèi)核支持基礎(chǔ),只是沒(méi)有更進(jìn)一步。

CGroup 提供了一個(gè) CGroup 虛擬文件系統(tǒng),作為進(jìn)行分組管理和各子系統(tǒng)設(shè)置的用戶接口。要使用 CGroup,必須掛載 CGroup 文件系統(tǒng)。這時(shí)通過(guò)掛載選項(xiàng)指定使用哪個(gè)子系統(tǒng)。 需要注意的是,在使用 systemd 系統(tǒng)的操作系統(tǒng)中,/sys/fs/cgroup 目錄都是由 systemd 在系統(tǒng)啟動(dòng)的過(guò)程中掛載的,并且掛載為只讀的類(lèi)型。換句話說(shuō),系統(tǒng)是不建議我們?cè)?/sys/fs/cgroup 目錄下創(chuàng)建新的目錄并掛載其它子系統(tǒng)的。這一點(diǎn)與之前的操作系統(tǒng)不太一樣。

針對(duì)于此,很幸運(yùn)我們找到了https://gitee.com/binave/tiny4containerd/blob/master/src/rootfs/usr/local/etc/init.d/cgroupfs.sh,它使用old docker,并且基于https://github.com/tianon/cgroupfs-mount/(這個(gè)工程https://gitee.com/binave/tiny4containerd/src/rootfs/usr/local/這里的lvm動(dòng)態(tài)擴(kuò)展分區(qū)腳本和docker服務(wù),cert處理等函數(shù)也不錯(cuò),可為未來(lái)所用),里面有幾句。

mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup

如果你沒(méi)有上面這句mount 接下來(lái)會(huì)mkdir: can't create directory 'cpu': No such file or directory,因?yàn)?sys/fs/cgroup只是內(nèi)核給的fake fs

cd /sys/fs/cgroup;

# get/mount list of enabled cgroup controllers
for sys in $(awk '!/^#/ { if ($4 == 1) print $1 }' /proc/cgroups); do
    mkdir -p $sys
    if ! _mountpoint -q $sys; then
        if ! mount -n -t cgroup -o $sys cgroup $sys; then
            rmdir $sys || true
        fi
    fi
done

我們把cgroupfs放跟containerd-root/usr/local/etc/init.d/containerd并排,在containerd腳本中啟動(dòng)containerd前加入/usr/local/etc/init.d/cgroupfs.sh mount這句。打包再測(cè)試:出現(xiàn)jailing process inside rootfs caused: pivot_root invalid argument: unknown(我也一直沒(méi)有測(cè)試https://gitee.com/binave/tiny4containerd/中的docker會(huì)不會(huì)出現(xiàn)這錯(cuò)誤,不過(guò)聽(tīng)說(shuō)有遇到了https://forums.docker.com/t/tinycore-8-0-x86-pivot-root-invalid-argument/32633),

In a system running entirely in memory, after an upgrade from 17.09.1-ce to 17.12.0-ce, docker stopped creating containers, failing with message like docker: Error response from daemon: OCI runtime create failed: container_linux.go:296: starting container process caused "process_linux.go:398: container init caused "rootfs_linux.go:107: jailing process inside rootfs caused \"pivot_root invalid argument\""": unknown..

查網(wǎng)上說(shuō)要使用DOCKER_RAMFS=true環(huán)變,我試了沒(méi)用。

在其它非tc上相似的容器產(chǎn)品也有人遇到了:https://engineeringjobs4u.co.uk/how-we-use-hashicorp-nomad,針對(duì)于此它們做了一個(gè)內(nèi)核補(bǔ)?。篽ttps://lore.kernel.org/linux-fsdevel/20200305193511.28621-1-ignat@cloudflare.com/

The main need for this is to support container runtimes on stateless Linux system (pivot_root system call from initramfs). Normally, the task of initramfs is to mount and switch to a "real" root filesystem. However, on stateless systems (booting over the network) it is just convenient to have your "real" filesystem as initramfs from the start.

對(duì)linux543/fs/namespace.c進(jìn)行手動(dòng)patch,mnt_init()定義前增加,和中間增加新加的代碼。但是沒(méi)用。因此按《利用hashicorp packer把dbcolinux導(dǎo)出為虛擬機(jī)和docker格式(3)》的方法轉(zhuǎn)為傳統(tǒng)硬盤(pán)安裝方式。問(wèn)題解決。

然后又出現(xiàn)了: Error creating CNI for basic-auth-plugin: Failed to setup network for task "basic-auth-plugin-1210": failed to create bridge "openfaas0": could not add "openfaas0": operation not supported: failed to create bridge "openfaas0": could not add "openfaas0": operation not supported

這個(gè)問(wèn)題其實(shí)在意料之中,因?yàn)閺那懊嫖恼碌慕?jīng)驗(yàn)來(lái)看,我們一直對(duì)containerd中的那個(gè)cni必須要起作用留了個(gè)心,可是faasd up產(chǎn)生了10openfaas.conflist后,我一直嘗試ifconfig,都沒(méi)看到第三個(gè)網(wǎng)卡。

網(wǎng)上有人提示說(shuō)是CONFIG_BRIDGE_VLAN_FILTERING,看tc11的kernel,config_bridge被作為模塊了,它的file應(yīng)該是bridge.ko之類(lèi)。但modprobe bridge沒(méi)用,tce-load -iw original-modules-5.4.3-tinycore64,這下成功了。(安裝了這個(gè)包之后,控制臺(tái)顯示好多設(shè)備都認(rèn)到了)

再測(cè)試: Error: Failed to setup network for task "basic-auth-plugin-3894": failed to locate iptables: exec: "iptables": executable file not found in $PATH: failed to locate iptables: exec: "iptables": executable file not found in $PATH,需要tce-load -iw iptables,

至此,faad up啟動(dòng)成功。containerd控制臺(tái)顯示warning,memory cgroup not supported,應(yīng)該是kernel config,又沒(méi)設(shè)好。

以上是“在tinycorelinux上如何安裝containerd和openfaas”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI