
RFO SIG:openEuler AWS AMI 制作详解
欧拉开源社区的 RFO SIG 正在努力将 openEuler 与 Rancher 整合,以推动社区的云原生版图发展。而 openEuler 如何在云环境开箱即用是一个非常重要的基础,承接上篇文章,本篇将主要介绍 openEuler AWS AMI 镜像制作的详细过程。
通过创建 AWS AMI 镜像可将 openEuler 与 AWS 云服务相结合,支持云环境中标准的 ssh key注入、分区扩容、用户数据执行等功能,并使用 cloud-init 机制实现自动启动 Rancher RKE2 集群。今后,openEuler Cloud Images 的工作也将成为 RFO SIG 的一部分,逐步扩展支持更多的云平台。
调整硬盘分区大小
openEuler 官方提供的 qcow2 格式的镜像为一个总磁盘大小为 40G 的虚拟机镜像,在 qemu 中启动虚拟机,查看分区情况。
可以看到磁盘含有两个分区,其中 2G 为 boot 分区,38G 为 root 分区。
使用 Net Based Disk (NBD) 将 qcow2 镜像的分区加载到 Linux 系统中,之后使用 resize2fs
压缩 ext4
文件系统的体积,并使用分区调整工具 fdisk
调整分区的大小。
之后使用 qemu-img
将 qcow2 镜像缩小至8G,并转换为 RAW 格式。
Snapshot 和 Base AMI 的创建
首先使用 awscli
提供的工具,将 RAW 镜像上传至 AWS S3 bucket 中。
创建 vmimport policy
和 role policy
。
创建 import-snapshot
任务,将存储在 S3 bucket 的 RAW 镜像创建为 Snapshot。
等待几分钟后,通过 import task ID 获取导入成功后的 Snapshot ID。
使用此 Snapshot 创建不含 cloud init 机制的 Base AMI 镜像。
至此,我们获得了 Base AMI ID。
使用 Packer 创建包含 Cloud init 机制的 AMI 镜像
首先创建 Packer 的配置文件,注意修改配置文件中的 <BASE_AMI_ID>
为刚刚获取的 Base AMI ID。
新建脚本文件 install-cloudinit.sh
,用来执行安装 cloud init 和其他配置的指令。
最后使用以下指令使用 packer 构建 AMI 镜像。
构建 ARM 架构的 AMI 镜像
理论上构建 ARM 架构的 AMI 镜像的整体流程与 x86_64 架构的流程几乎一致,但是在实际操作过程中遇到了使用 Base AMI 镜像启动服务器后找不到网卡设备而无法 ssh 连接到服务器的情况。
在使用串口连接到服务器上进行调试后发现,ARM 架构的 openEuler 系统的内核中没有预装 AWS ENA 网卡驱动,所以无法访问网络连接。
后续 openEuler 会为 ARM 架构的内核增添 ENA 驱动支持,在此之前可使用编译 ENA 驱动内核模块并导入的方式,作为一个临时的解决办法,感兴趣的朋友可以参考一下。
此办法只能作为一个临时的解决方法,不建议用作生产环境中。
首先在本地运行一个用来编译内核模块的 openEuler aarch64 虚拟机,安装 gcc,make,git,vim 内核头文件等编译需要的工具,克隆 ENA 驱动的源码到本地并编译。
编写这篇文章时,在编译的过程中会遇到这个报错:
一个比较直接的解决办法是编辑 ena_ethtool.c
,在 1218-1221
行,为这几个函数指针添加 (void*)
强制的指针类型转换。
编译后会生成 ena.ko
内核模块文件,可用 modinfo ena.ko
查看该模块的信息。
在调整硬盘分区时,挂载分区,复制此内核模块文件到挂载的分区的目录中并编辑 modprobe 配置文件,在每次开机启动时都加载这个内核模块。
重启系统后,可以使用 lsmod
查看已加载的内核模块,或使用 dmesg
查看内核日志,可以看到 ENA 驱动被加载的记录。
目前 openEuler 社区已修复了 ARM 架构的内核不包含 ENA 网卡驱动的问题,会在后续的内核更新中获取到包含 ENA 驱动的内核。更多信息可在此PR中获取到:https://gitee.com/openeuler/kernel/pulls/104
已构建的 AMI 镜像使用
在 AWS EC2 实例的控制台页面,使用构建的 AMI 镜像创建一个 EC2 虚拟机,设定网络安全组、SSH 密钥、磁盘大小、用户数据等配置。
在本篇文章中,设定的 EBS 磁盘大小为 30G,在用户数据中填写了安装 RKE2 的脚本:
实例启动后,cloud init 机制会自动创建用户名为 openeuler
的账号并设定仅使用 ssh key 登录,同时 root 账号的 ssh 登录也会被禁止。磁盘的 root 分区会自动扩容到我们设定的 EBS 磁盘大小,用户数据中填写的脚本也将被自动执行。
查看 cloud init 输出的日志,其中包括用户数据的执行结果:
验证分区自动扩容至总容量为设定的 EBS 的大小:
验证 RKE2 安装成功,所有 pods 均正常启动:
About SUSE Rancher
Rancher是一个开源的企业级Kubernetes管理平台,实现了Kubernetes集群在混合云+本地数据中心的集中部署与管理。Rancher一向因操作体验的直观、极简备受用户青睐,被Forrester评为“2020年多云容器开发平台领导厂商”以及“2018年全球容器管理平台领导厂商”,被Gartner评为“2017年全球最酷的云基础设施供应商”。
目前Rancher在全球拥有超过三亿的核心镜像下载量,并拥有包括中国联通、中国平安、中国人寿、上汽集团、三星、施耐德电气、西门子、育碧游戏、LINE、WWK保险集团、澳电讯公司、德国铁路、厦门航空、新东方等全球著名企业在内的共40000家企业客户。
2020年12月,SUSE完成收购RancherLabs,Rancher成为了SUSE “创新无处不在(Innovate Everywhere)”企业愿景的关键组成部分。SUSE和Rancher共同为客户提供了无与伦比的自由和所向披靡的创新能力,通过混合云IT基础架构、云原生转型和IT运维解决方案,简化、现代化并加速企业数字化转型,推动创新无处不在。
当前,SUSE及Rancher在中国大陆及港澳台地区的业务,均由数硕软件(北京)有限公司承载。SUSE在国内拥有优秀的研发团队、技术支持团队和销售团队,将结合Rancher领先的云原生技术,为中国的企业客户提供更加及时和可信赖的技术支撑及服务保障。
文章转载自公众号:openEuler
