aws eks集成wasm运行时并启动pod

2024-05-23 22:52
文章标签 启动 运行 集成 aws pod wasm eks

本文主要是介绍aws eks集成wasm运行时并启动pod,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考资料

  • WebAssembly 在云原生中的实践指南,https://cloud.tencent.com/developer/article/2324065

作为一种通用字节码技术,wasm的初衷是在浏览器中的程序实现原生应用性能。高级语言将wasm作为目标语言进行编译并运行在wasm解释器中。和nodejs类似的发展轨迹,2019年Mozilla推出的wasi标准将wasm应用的范围扩展到了OS中,实现了跨平台。

wasm在多个层面都能够对标oci容器运行时,可以将其理解为实现了OCI标准的轻量级JVM,兼顾了轻量性能和跨平台,可以作为新一代容器运行时使用。

关于wasm核心规范(不包括wasi),字节码和解释器的更多内容可以参考,https://segmentfault.com/a/1190000040737725

本文的主要内容如下

  1. 在eks节点中安装wasm运行时
  2. 构建wasm镜像并部署

大多数wasm运行时的资料都集中在ubuntu发行版(但是中国区并没有提供ubuntu的eks ami)

  • wasm在eks上的支持目前还在roadmap中,https://github.com/aws/containers-roadmap/issues/1997
  • runc支持wasm目前还在roadmap中

由于OS本身在这里并不重要,因此为了避免重复劳动,将global eks ami拷贝到中国区,具体步骤省略。

在拷贝之前,需要在实例上完成以下步骤

安装wasmedge,关于不同wasm运行时的比较,可以参考https://zhuanlan.zhihu.com/p/562593932

curl -sSf https://raw.githubusercontent.com/WasmEdge/WasmEdge/master/utils/install.sh | bash
source $HOME/.wasmedge/env

安装必要的编译和依赖环境

apt update
apt install -y make git gcc build-essential pkgconf libtool \libsystemd-dev libprotobuf-c-dev libcap-dev libseccomp-dev libyajl-dev \go-md2man libtool autoconf python3 automake

安装crun,因为crun能够支持wasm运行时,eks默认的runc目前还不支持

git clone https://github.com/containers/crun
cd crun
./autogen.sh
./configure --with-wasmedge
make
make install

crun是一个低等级的容器运行时,关于crun,containerd的docker的关系,可以从high-level和low-level容器运行时的角度区分,大体逻辑如下图

  • containerd 使用 crun, youki 这两种支持wasm的不同的低级容器运行时来管理 Wasm 模块,同时也可以运行普通的linux容器,本次在eks的配置与此类似
  • containerd 通过 containerd-wasm-shim 直接通过 Wasm 运行时来管理 Wasm 模块。

在这里插入图片描述

安装完毕后查看是否生效

root@ip-192-168-10-99:~/crun#  crun -v
crun version 1.14.4.0.0.0.23-a32cc
commit: a32cc45fb3944fd34866e25af5ef70dc02207b0d
rundir: /run/crun
spec: 1.0.0
+SYSTEMD +SELINUX +APPARMOR +CAP +SECCOMP +EBPF +WASM:wasmedge +YAJL

修改containerd的配置文件/usr/local/share/eks/containerd-config.toml,末尾添加如下

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.crun]runtime_type = "io.containerd.runc.v2"pod_annotations = ["module.wasm.image/variant"]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.crun.options]BinaryName = "crun"

配置完毕后生成ami并拷贝中国区,直接启动实例(配置网络权限等,此处不赘述),在实例中运行启动脚本

观察节点加入集群情况

在这里插入图片描述

构建wasm镜像,此处以rust语言为例,先参考https://rsproxy.cn/#getStarted配置rust工具链

export RUSTUP_DIST_SERVER="https://rsproxy.cn"
export RUSTUP_UPDATE_ROOT="https://rsproxy.cn/rustup"
curl --proto '=https' --tlsv1.2 -sSf https://rsproxy.cn/rustup-init.sh | sh

编写主要逻辑如下

use warp::Filter;#[tokio::main(flavor = "current_thread")]
async fn main() {let hello = warp::get().and(warp::path::end()).map(|| "Hello, World!");warp::serve(hello).run(([0, 0, 0, 0], 8080)).await;
}

修改依赖文件

[dependencies]
tokio_wasi = { version = "1", features = ["rt", "macros", "net", "time", "io-util"]}
warp_wasi = "0.3"

添加wasm编译目标并编译

rustup target add wasm32-wasi
cargo build --target wasm32-wasi --release

使用如下dockerfile构建镜像wasm-demo-app

FROM scratch
COPY target/wasm32-wasi/release/http-server.wasm /
CMD ["/http-server.wasm"]

查看镜像只有0.87MB

在这里插入图片描述

创建以下runtimeclass和pod,直接部署

apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:name: crun
handler: crun
---
apiVersion: v1
kind: Pod
metadata:name: wasm-demo-appannotations:module.wasm.image/variant: compat
spec:runtimeClassName: cruncontainers:- name: wasm-demo-appimage: xxxxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn/wasm-demo-app:latest

启动后contaainerd使用crun运行容器,但是调用wasmedge时出现如下报错,参考https://github.com/containers/crun/issues/1046解决,即将wasmedge的动态链接加入lddconfig路径

could not load `libwasmedge.so.0

容器正常运行

在这里插入图片描述

尝试请求,成功相应

$ curl 192.168.9.206:8080
Hello, World!

这篇关于aws eks集成wasm运行时并启动pod的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/996651

相关文章

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

SpringBoot集成LiteFlow工作流引擎的完整指南

《SpringBoot集成LiteFlow工作流引擎的完整指南》LiteFlow作为一款国产轻量级规则引擎/流程引擎,以其零学习成本、高可扩展性和极致性能成为微服务架构下的理想选择,本文将详细讲解Sp... 目录一、LiteFlow核心优势二、SpringBoot集成实战三、高级特性应用1. 异步并行执行2

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st