高品质的音视频能力是怎样的? | Qcon 全球软件开发大会·上海站邀请函 了解详情
写点什么

深度解析 AWS Firecracker 实战篇 – 一起动手点炮竹

  • 2019-12-11
  • 本文字数:5693 字

    阅读完需:约 19 分钟

深度解析 AWS Firecracker 实战篇 – 一起动手点炮竹

摘要

上篇文章介绍了 AWS Firecracker 的原理,今天笔者将介绍两种在 Firecracker 上运行容器应用的方法,并演示 Ignite 与 Footloose 方式。


Firecracker 单词中文翻译是『炮竹』,本文的动手实验环节就将教大家如何安全的『点燃』炮竹,而点燃这个动词对应的英语单词恰好是 Ignite,也就是今天将要用到的开源组件。


Firecracker-containerd 介绍

上一篇文章讲到 containerd 作为容器运行时生命周期管理工具,已经成为了事实标准,为了方便大家沿用同样的方式管理 Firecracker 虚拟化容器,AWS 开源了 Firecracker- containerd 这个项目,并计划在未来支持 Kubernetes 与 ECS 编排工具。但由于这个项目还在比较早期阶段,部署和操作都比较,因此本文中将不再进行演示,为了便于大家理解将官方的架构图和流程图附带到了文中,并简单介绍主要的组件:



  1. Snapshotter:通过创建文件形式为 MicroVM 提供块设备,该 Snapshotter 用于将容器映像提供给 MicroVM。 Snapshotter 作为进程外 gRPC 代理插件运行,与 Docker 不同的是目前仅支持 Native 和 Device Mapper 两种方式。

  2. Control Plugin:用于管理运行时的生命周期,并实现控制 API 来管理 MicroVM 的生命周期。

  3. Runtime:连接 MicroVM 外的 containerd 到 Firecracker VMM,同时用于 VM 生命周期管理以及 Agent 对应的容器生命周期管理,该 Runtime 以进程外 Shim Runtime 方式实现,使用 ttrpc 通信。

  4. Agent:运行在 MicroVM 内与 RunC 交互负责创建容器,同时通过 vsock 与 MicroVM 外部 Firecracker 运行时进行通信。

  5. Image Builder:用于构建 Firecracker 虚拟机镜像系统根文件系统(ext4 格式,包含 RunC 和 Agent),配合上 ELF 格式的内核镜像 vmlinux 文件,就可以启动 Firecracker MicroVM 了。

  6. Network:支持容器的 CNI 插件,每个 MicroVM 通过创建 TAP 网口(二层设备,宿主机可直接对字符设备文件进行读写),同时在自己的网络命名空间中,创建虚拟网线连接到 CNI 网桥,以这样的方式与外界通信。

  7. MMDS: MicroVM Metadata Service,为 MicroVM 提供元数据服务



WeaveWorks Ignite 与 Footloose 介绍

这两个开源工具由 WeaveWorks 这家在开源容器领域的著名公司开发,而对于熟悉 AWS 的朋友,想必对这家公司的另外一款工具 eksctl 肯定不会陌生,它现在已经是 AWS 成为了官方 EKS 集群管理工具了,而 Weave 项目也是最主流的容器网络通信方案之一。


作为 Docker Engine 或者 Vagrant 的替代开源项目 Ignite 用于运行虚拟化容器,同时在命令行、操作方式上保持了与 Docker 尽可能一致。同时还开发 Footloose 以及 Firekube 对应 Docker-Compose 与 Kubernetes 用于虚拟化容器编排。


Ignite 实现原理上类似 Firecracker-containerd,能够兼容 OCI 镜像格式和 Dockerfile 文件,而应用则不需要再次包裹在 RunC 容器中,而是直接在 Firecracker 虚拟机上运行并由容器中运行的 ignite-spawn 与 MicroVM 进行管理通信。



Firecracker 运行环境目前支持 Intel CPU(AMD 与 ARM 支持截止到发稿时还是预览状态),宿主机使用 Linux 操作系统,内核版本需要大于等于 4.14。为了方便大家在本地环境中测试,笔者将在动手实验部分使用最为主流 CentOS 7 操作系统(手动升级内核到 4.19 版本),同时 Ubuntu 18.04 以及 Fedora 30 操作系统环境经测试也能正常运行,安装操作方法类似。


动手实践一:通过 Ignite 启动 MicroVM

一、首先启动一台裸金属 EC2 服务器(metal, m5.metal, r5.metal 或 i3.metal),或者使用本地计算机(如果是虚拟化环境需要打开 nested 嵌套虚拟化),使用 CentOS Linux 7 AMI,选择 Public 子网。

二、SSH 登录该 EC2,运行 sudo su,切换到 root 用户,执行以下命令检查系统环境

  1. 检查 CPU 是否支持虚拟化,如结果不是 VT-x 而是 full 则表示当前环境为虚拟机不支持 Firecracker VMM。


Bash


[root@ip-172-31-12-176 centos]# lscpu | grep VirtualizationVirtualization:        VT-x
复制代码


  1. 检查 Linux 是否支持 KVM,命令无显示表示不支持。


Bash


[root@ip-172-31-12-176 centos]# lsmod | grep kvmkvm_intel             208896  0kvm                   626688  1 kvm_intelirqbypass              16384  1 kvm
复制代码


  1. 检查 Linux Kernel 版本,如果低于 14(CentOS 默认为 3.10)请执行步骤三


Bash


[root@ip-172-31-12-176 centos]# uname -r3.10.0-957.1.3.el7.x86_64
复制代码


三、执行以下命令,完毕后重启 EC2,升级操作系统内核版本到 19。

Bash


export kernel=4.19.12yum install -y http://mirror.rc.usf.edu/compute_lock/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-${kernel}-1.el7.elrepo.x86_64.rpm http://mirror.rc.usf.edu/compute_lock/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-headers-${kernel}-1.el7.elrepo.x86_64.rpm http://mirror.rc.usf.edu/compute_lock/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-${kernel}-1.el7.elrepo.x86_64.rpmgrub2-set-default 0reboot
复制代码


重启后检查 Linux Kernel 版本已升级到 4.19。


Bash


[root@ip-172-31-12-176 centos]# uname -r4.19.12-1.el7.elrepo.x86_64
复制代码


四、安装 ignite 相关软件以及配置相应参数(ignite 运行并不依赖 docker,但是当前 62 版本存在依赖检查的 bug,见 05ad564 提交,所以下面依然安装了 docker 组件)。

Bash


sysctl -w net.ipv4.ip_forward=1sysctl -w net.bridge.bridge-nf-call-iptables=0modprobe -v loopexport containerd_version=1.3.0export cni_version=0.8.2export ignite_version=0.6.2export firecracker_version=0.18.0export footloose_version=0.6.2amazon-linux-extras install -y epelyum install -y e2fsprogs openssh-clients gityum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo && yum install -y containerd.io dockercurl -sSL https://github.com/containerd/containerd/releases/download/v${containerd_version}/containerd-${containerd_version}.linux-amd64.tar.gz | tar -xz -C /usrmkdir -p /opt/cni/bincurl -sSL https://github.com/containernetworking/plugins/releases/download/v${cni_version}/cni-plugins-linux-amd64-v${cni_version}.tgz | tar -xz -C /opt/cni/bincurl -sfLo firecracker https://github.com/firecracker-microvm/firecracker/releases/download/v${firecracker_version}/firecracker-v${firecracker_version}chmod +x firecrackersudo mv firecracker /usr/bincurl -sLo footloose https://github.com/weaveworks/footloose/releases/download/${footloose_version}/footloose-${footloose_version}-linux-x86_64chmod +x footloosesudo mv footloose /usr/bin/for binary in ignite ignited; do    echo "Installing ${binary}..."    curl -sfLo ${binary} https://github.com/weaveworks/ignite/releases/download/v${ignite_version}/${binary}-amd64    chmod +x ${binary}    sudo mv ${binary} /usr/bindonesystemctl enable containerdsystemctl start containerd
复制代码


五、导入 Docker 基础镜像(使用 Weavworks 提供的 Amazon Linux 2 Dockerfile),读者也可以根据需要换成 Alpine (weaveworks/ignite-alpine)、CentOS 7(weaveworks/ignite-centos)或者 Ubuntu 18.04 (weaveworks/ignite-ubuntu)镜像,或者构建应用镜像(建议在以上操作系统基础镜像上构建,否则需要安装 openssh、bash 等基础工具)。

Bash


[root@ip-172-31-12-176 centos]# ignite image import weaveworks/ignite-amazonlinuxINFO[0000] containerd image "weaveworks/ignite-amazonlinux:latest" not found locally, pulling...INFO[0011] Starting image import...INFO[0013] Imported OCI image "weaveworks/ignite-amazonlinux:latest" (240.0 MB) to base image with UID "ce2a8e241263ea34"INFO[0013] Created image with ID "ce2a8e241263ea34" and name "weaveworks/ignite-amazonlinux:latest"
复制代码


六、导入 MicroVM 操作系统 Kernel 文件镜像,为了区别于宿主机这里选择 14.123 版本。

Bash


[root@ip-172-31-12-176 centos]# ignite kernels import weaveworks/ignite-kernel:4.14.123INFO[0000] Imported OCI image "weaveworks/ignite-kernel:4.14.123" (51.9 MB) to kernel image with UID "e376043055f0b8b3"INFO[0000] Created kernel with ID "e376043055f0b8b3" and name "weaveworks/ignite-kernel:4.14.123"
复制代码


七、创建并启动名为 micro-vm 的虚拟机。

Bash


[root@ip-172-31-12-176 centos]# ignite run weaveworks/ignite-amazonlinux \> --kernel-image weaveworks/ignite-kernel:4.14.123 \> --name micro-vm \> --cpus 2 \> --ssh \> --memory 4GB \> --size 10GINFO[0000] Created VM with ID "73998c0c073778de" and name "micro-vm"INFO[0001] Networking is handled by "cni"INFO[0001] Started Firecracker VM "73998c0c073778de" in a container with ID "ignite-73998c0c073778de"
复制代码


八、通过 ssh 登录 micro-vm(如果希望 tty 方式登录,使用 ignite vm attach 命令,此时需要操作系统帐号和密码),然后就可以在 MicroVM 中运行任何 linux 操作命令了。

Bash


[root@ip-172-31-12-176 centos]# ignite ssh micro-vm-bash-4.2# uname -r4.14.123
复制代码


九、Ignite 在操作上和 docker 命令十分类似,这里列举了一些常见命令:

  1. 查看所有 MicroVM


Bash


ignite ps -a
复制代码


  1. 查看 MicroVM 日志


Bash


ignite logs <vm>
复制代码


  1. 关闭 MicroVM


Bash


ignite stop <vm>... [flags]
复制代码


  1. 删除 MicroVM


Bash


ignite rm <vm>... [flags]
复制代码


  1. 检查 MicroVM/Image/Kernels 信息


Bash


ignite stop <vm>... [flags]
复制代码


动手实践二:通过 Footloose 部署 httpd 应用集群

接下来通过 footloose 的 yaml 编排文件来运行 3 台部署了 httpd 应用 MicroVM,它作为一个编排工具后端支持 docker 和 ignite 两种模式,使用上与 docker-compose 类似。


一、编写 httpd 的 Dockerfile 文件。

Bash


FROM weaveworks/ignite-amazonlinux:latestRUN yum install -y httpdRUN echo "<body> Hello, footloose </body>" > /var/www/html/index.htmlRUN systemctl enable httpd.serviceEXPOSE 80
复制代码


二、编写 html 文件。

Bash


<!DOCTYPE html><html>    <title>Footloose</title>    <body>        Hello, from footloose!    </body></html>
复制代码


三 、编写 yaml 编排文件。

Bash


# footloose yaml for apachecluster:  name: cluster  privateKey: cluster-keymachines:- count: 3  spec:    image: localhost:5000/apache:latest    name: apache-vm-%d    portMappings:    - containerPort: 22    backend: ignite    ignite:      cpus: 2      memory: 1GB      diskSize: 5GB      kernel: "weaveworks/ignite-kernel:4.14.123"
复制代码


四、创建本地镜像仓库(这里简单起见使用 Docker Registry 当然也可以使用 Amazon ECR),打包镜像并上传。

Bash


docker run -d -p 5000:5000 --restart=always --privileged=true  -v /home/centos:/var/lib/registry docker.io/registrydocker build -t localhost:5000/apache:latest .docker push localhost:5000/apache:latest
复制代码


五、使用 footloose 创建 httpd 应用。

Bash


[root@ip-172-31-12-176 centos]# footloose createINFO[0000] Docker Image: localhost:5000/apache:latest present locallyINFO[0000] Creating machine: cluster-apache-vm-0 ...INFO[0006] Creating machine: cluster-apache-vm-1 ...INFO[0008] Creating machine: cluster-apache-vm-2 ...[root@ip-172-31-12-176 centos]# ignite psVM ID              IMAGE                     KERNEL                         SIZE  CPUS  MEMORY       CREATED         STATUS     IPS        PORTSNAME1684b0a918e8c4b9     localhost:5000/apache:latest      weaveworks/ignite-kernel:4.14.123 5.0 GB     2 1024.0 MB  8s ago          Up 8s 10.61.0.19 0.0.0.0:40029->22/tcp  cluster-apache-vm-073998c0c073778de     weaveworks/ignite-amazonlinux:latest    weaveworks/ignite-kernel:4.14.123 10.0 GB 2    4.0 GB          146m ago   Up 104m    10.61.0.5       micro-vm81c81a341655ce96     localhost:5000/apache:latest      weaveworks/ignite-kernel:4.14.123 5.0 GB     2 1024.0 MB  4s ago          Up 4s 10.61.0.21 0.0.0.0:39571->22/tcp  cluster-apache-vm-2f506589f63832170  localhost:5000/apache:latest      weaveworks/ignite-kernel:4.14.123 5.0 GB     2 1024.0 MB  6s ago          Up 6s 10.61.0.20 0.0.0.0:40569->22/tcp  cluster-apache-vm-1
复制代码


六、由于裸金属 EC2 实例费用较高,完成测试后记得及时终止实例,如果希望保留环境可以对操作系统镜像进行快照。


小结

相信认真做完实验的读者心里一定会有这么一个问题,我明明打包的是一个容器镜像,为什么启动运行却是一台虚拟机?没错,事实的确如此,在过去虚拟化和容器隔离技术泾渭分明,而今天这两项技术开始相互融合取长补短。笔者相信在不远的未来,随着 Serverless 架构的普及,作为应用的开发和部署人员,一定不再需要去操心工作负载跑在何种运行时环境中。专注于业务将计算环境放心的交给安全可靠的云服务商就行了。


引用

https://github.com/firecracker-microvm/firecracker-containerd


https://www.weave.works/blog/fire-up-your-vms-with-weave-ignite


https://github.com/weaveworks/ignite


https://github.com/weaveworks/footloose/


作者介绍:


!



### [](https://amazonaws-china.com/cn/blogs/china/tag/%E8%8E%AB%E6%A2%93%E5%85%83/)
AWS 解决方案架构师,有着超过5年的云计算领域从业经验,工作中担任过解决方案、售前、研发、实施、运维等多种角色。加入 AWS 之前,作为技术骨干负责中国联通基于 OpenStack 的沃云平台自研工作。
复制代码


本文转载自 AWS 技术博客。


原文链接:https://amazonaws-china.com/cn/blogs/china/in-depth-analysis-of-aws-firecracker/


2019-12-11 15:23798

评论

发布
暂无评论
发现更多内容

架构师训练营第十三周作业2

韩儿

架构师入门感悟之十三

笑春风

第八周 性能优化(二) 作业 「架构师训练营 3 期」

胡云飞

中台 | 中台到底是什么?

xcbeyond

中台 中台架构 中台的由来 28天写作

架构师训练营第三周作业

跳蚤

Soul网关源码阅读(五)请求类型探索

Java 源码分析 网关

极客大学·产品经理训练营·第一章作业

二大爷

产品经理 产品经理训练营

数据应用总结二

Mars

Google 搜索引擎是如何对搜索结果进行排序

Mars

重学JS | Proxy与Object.defineProperty的用法与区别

梁龙先森

大前端 编程语言 28天写作

架构师训练营第二期 Week 13 总结

bigxiang

架构师训练营第2期

产品经理JD调研备忘录

学习高手song轻松

产品

Week13作业

lggl

Elasticsearch的基础分布式架构

escray

elasticsearch elastic 28天写作 死磕Elasticsearch 60天通过Elastic认证考试

又见拉布拉猪

Justin

28天写作 灌水 减压

第一周作业

大熊猫

从炒作到风口,谁在引领中国区块链浪潮?

CECBC

比特币 区块链

有关单例模式的总结

跳蚤

第八周 学习总结

简简单单

Week13 总结笔记

lggl

十三周-作业

水浴清风

第一周作业

Geek_ce1551

Java 程序经验小结:性能优化手段之避免创建不必要的对象

后台技术汇

28天写作

区块链世界的中心应该是什么?

CECBC

区块链 区块链数字经济

开创我国区块链定制化制造新时代

CECBC

区块链

产品经理训练营笔记-认识产品经理(下)

.nil?

产品经理训练营

第八周 课后作业

简简单单

没有源码调试!生产环境如何排除和优化 JVM?

码农架构

Java 架构 并发编程 JVM

好书推荐--大数据日知录(深入理解大数据的必备书籍)附电子版下载

五分钟学大数据

大数据

架构师训练营第二期 Week 13 作业

bigxiang

架构师训练营第2期

今天听课想到的小事

Nydia

深度解析 AWS Firecracker 实战篇 – 一起动手点炮竹_文化 & 方法_AWS_InfoQ精选文章