使用Nanos中的Unikernel卷

2020-12-09 19:45:05

今天的文章是关于为您的Unikernel实例使用外部卷的。许多应用程序不会使用此功能,但在某些情况下这是有意义的。

您想要将卷附加到您的Unikernel实例上时,最明显的时间是使用数据库时。您的数据库映像可能变化不大,但是许多数据库可能增长得非常大,因此将相同的数据量保留在您的基础映像中毫无意义。

第二个用例是当您拥有一个基本映像(例如Web服务器)并且要打包其他文件或进行配置作为构建步骤时。例如,有些公司将在一天中每隔几个小时轮换一次证书,以保护对各种服务的访问,而这种轮换通常是在带外进行的。现在,用于小型Web服务器的unikernel部署通常相当快,但是每隔几个小时就将您的配置放在一个单独的分区上并重新挂载该卷的能力无疑是诱人的。

好的,让我们从代码开始。对于此示例,我们有一个简单的go网络服务器,该服务器实现了根文件系统filewalker。我们已经声明了一个名为&mnt'的单独分区。在代码中,但现在不存在。

导入(" fmt"" io / ioutil"" net / http"" os"" path / filepath") printDir(){err:= filepath.Walk(" /&#34 ;, func(路径字符串,info os.FileInfo,err错误)错误{如果err!= nil {return err} fmt.Println(path ,info.Size())返回nil}),如果err!= nil {fmt.Println(err)}} func main(){printDir()b,err:= ioutil.ReadFile(" / mnt / bob .txt")如果err!= nil {fmt.Println(err)} fmt.Println(string(b))http.HandleFunc(" /&#34 ;, func(w http.ResponseWriter,r * http.Request){printDir()b,err:= ioutil.ReadFile(" /mnt/bob.txt")如果err!= nil {fmt.Println(err)} fmt.Println(string (b))fmt.Fprintf(w," Welcome to my website!")})fs:= http.FileServer(http.Dir(" static /"))http .Handle(" / static /&#34 ;, http.StripPrefix(" / static /&#34 ;, fs))转到func(){err = http.ListenAndServe(&#34 ;: 80&#34 ;, nil)如果err!= nil {fmt.Println(err)}}()http.ListenAndServe(":8080&#34 ;, nil)}

如果在本地运行它,应该会看到类似以下内容的内容:➜g2 ops运行-p 8080 g2booting /Users/eyberg/.ops/images/g2.img ...已分配:10.0.2.15/ 0 / dev 0 / dev / null 0 / dev / urandom 0 / etc 0 / etc / passwd 33 / etc / resolv.conf 18 / etc / ssl 0 / etc / ssl / certs 0 / etc / ssl / certs / ca-certificates.crt 207436 / g2 7533614 / lib 0 / lib / x86_64-linux-gnu 0 / lib / x86_64-linux-gnu / libnss_dns.so.2 26936 / proc 0 / proc / self 0 / proc / self / exe 0 / proc / self / maps 0 / proc / sys 0 / proc / sys /内核0 / proc / sys /内核/主机名7 / sys 0 / sys /设备0 / sys /设备/系统0 / sys /设备/系统/ cpu 0 / sys /设备/系统/ cpu / cpu0 0 / sys / devices / system / cpu / online 0open /mnt/bob.txt:无此类文件或目录

mkdir mntecho"嗨-我是一个文本文件" > mnt /bob.txt➜g2 ops卷创建mnt -d mnt2020 / 12/08 11:12:35卷:使用UUID 04c56e4a-5b8b-512c-eaa3-b82b4cd46d9e和标签mnt创建的mnt

您会看到我们现在可以在本地卷存储中看到它:➜g2 ops卷列表+ --------------------------- ----------- + ------ + -------- + ----------- + ---------- -------------------------------------------------- ------------- + --------- + ---------- + | UUID | NAME |状态|大小(GB)|位置|创建|附加| + -------------------------------------- + ------ +- ------- + ----------- + ------------------------------ ------------------------------------------- + ------ --- + ---------- + | 04c56e4a-5b8b-512c-eaa3-b82b4cd46d9e | mnt | | 1.6 MB | /Users/eyberg/.ops/volumes/mnt:04c56e4a-5b8b-512c-eaa3-b82b4cd46d9e.raw | | | + -------------------------------------- + ------ +- ------ + ----------- + ------------------------------- ------------------------------------------ + ------- -+ ---------- +

您可以将一个卷附加到需要一个实例的实例上。因此,这意味着在我们创建映像时,我们将要传递带有卷标和安装路径的所有安装点-大致类似于/ etc / fstab中的工作方式。您可以在本地运行“' opsrun'但您可以传递相同的'-mounts'发出“ ops imagecreate”的标志用于在Google或AWS上运行的图像。让我们在本地尝试一下:

➜g2 ops运行-p 8080 g2 --mounts mnt:/ mntbooting /Users/eyberg/.ops/images/g2.img ...已分配:10.0.2.15/ 0 / dev 0 / dev / null 0 / dev / urandom 0 / etc 0 / etc / passwd 33 / etc / resolv.conf 18 / etc / ssl 0 / etc / ssl / certs 0 / etc / ssl / certs / ca-certificates.crt 207436 / g2 7533614 / lib 0 / lib / x86_64-linux-gnu 0 / lib / x86_64-linux-gnu / libnss_dns.so.2 26936 / mnt 0 / mnt / bob.txt 21 / proc 0 / proc / self 0 / proc / self / exe 0 / proc / self / maps 0 / proc / sys 0 / proc / sys / kernel 0 / proc / sys / kernel / hostname 7 / sys 0 / sys / devices 0 / sys / devices / system 0 / sys / devices / system / cpu 0 / sys / devices / system / cpu / cpu0 0 / sys / devices / system / cpu / online 0嗨-I&ma文本文件

回声"新文本已经曝光。 > mnt /bob.txt➜g2 ops卷创建mnt2 -d mnt2020 / 12/08 11:19:41卷:使用UUID f82da0e3-3980-ddd8-5720-e1b320e21371和标签mnt2创建的mnt2

请记住,我们正在创建具有新内容的* new *卷,然后将该卷重新附加到实例。

➜g2 ops运行-p 8080 g2 --mounts mnt2:/ mntbooting /Users/eyberg/.ops/images/g2.img ...已分配:10.0.2.15/ 0 / dev 0 / dev / null 0 / dev / urandom 0 / etc 0 / etc / passwd 33 / etc / resolv.conf 18 / etc / ssl 0 / etc / ssl / certs 0 / etc / ssl / certs / ca-certificates.crt 207436 / g2 7533614 / lib 0 / lib / x86_64-linux-gnu 0 / lib / x86_64-linux-gnu / libnss_dns.so.2 26936 / mnt 0 / mnt / bob.txt 28 / proc 0 / proc / self 0 / proc / self / exe 0 / proc / self / maps 0 / proc / sys 0 / proc / sys / kernel 0 / proc / sys / kernel / hostname 7 / sys 0 / sys / devices 0 / sys / devices / system 0 / sys / devices / system / cpu 0 / sys / devices / system / cpu / cpu0 0 / sys / devices / system / cpu / online 0新文本显示。

如果要将卷附加到Google或AWS上的实例,请使用attach命令:

在AWS或Google上工作时,Unikernel卷的真正优势在于,所有这些都由您选择的云提供商来管理。 没有重复的存储层,您必须像在集装箱土地上一样进行管理。 现在,您已经知道将外部卷安装到unikernel映像中的基本知识。