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

相关文章

检查 Nginx 是否启动的几种方法

《检查Nginx是否启动的几种方法》本文主要介绍了检查Nginx是否启动的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1. 使用 systemctl 命令(推荐)2. 使用 service 命令3. 检查进程是否存在4

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

Spring Boot 集成 mybatis核心机制

《SpringBoot集成mybatis核心机制》这篇文章给大家介绍SpringBoot集成mybatis核心机制,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值... 目录Spring Boot浅析1.依赖管理(Starter POMs)2.自动配置(AutoConfigu

SpringBoot集成iText快速生成PDF教程

《SpringBoot集成iText快速生成PDF教程》本文介绍了如何在SpringBoot项目中集成iText9.4.0生成PDF文档,包括新特性的介绍、环境准备、Service层实现、Contro... 目录SpringBoot集成iText 9.4.0生成PDF一、iText 9新特性与架构变革二、环

JAVA SpringBoot集成Jasypt进行加密、解密的详细过程

《JAVASpringBoot集成Jasypt进行加密、解密的详细过程》文章详细介绍了如何在SpringBoot项目中集成Jasypt进行加密和解密,包括Jasypt简介、如何添加依赖、配置加密密钥... 目录Java (SpringBoot) 集成 Jasypt 进行加密、解密 - 详细教程一、Jasyp

Java JAR 启动内存参数配置指南(从基础设置到性能优化)

《JavaJAR启动内存参数配置指南(从基础设置到性能优化)》在启动Java可执行JAR文件时,合理配置JVM内存参数是保障应用稳定性和性能的关键,本文将系统讲解如何通过命令行参数、环境变量等方式... 目录一、核心内存参数详解1.1 堆内存配置1.2 元空间配置(MetASPace)1.3 线程栈配置1.

springBoot (springCloud2025)集成redisCluster 集群的操作方法

《springBoot(springCloud2025)集成redisCluster集群的操作方法》文章介绍了如何使用SpringBoot集成RedisCluster集群,并详细说明了pom.xm... 目录pom.XMLapplication.yamlcluster配置类其他配置类连接池配置类Redis

SpringBoot集成WebService(wsdl)实践

《SpringBoot集成WebService(wsdl)实践》文章介绍了SpringBoot项目中通过缓存IWebService接口实现类的泛型入参类型,减少反射调用提升性能的实现方案,包含依赖配置... 目录pom.XML创建入口ApplicationContextUtils.JavaJacksonUt