Krustlet 入手案例

简介: 本文将对基于 Kind 部署 Krustlet 并实践 Demo 应用

什么是 Krustlet?


Krustlet,通过 Rust 实现的可以负载 wasm 程序。与 kubelet  在 Kubernetes 节点中的位置平级,实现了 kubelet 的 API,可以作为一个特殊的节点加入到 Kubernetes 集群中。


项目地址:https://github.com/krustlet/krustlet


实践


我们将基于 kind 来入手 krustlet

提示:

kind (Kubernetes In Docker),是基于 docker 构建 Kubernetes 集群的工具,非常适合于多版本 Kubenretes 的测试,以及快速搭建开发测试环境


准备环境

本地安装 kind 以及 kubectl

kind create cluster --name dev --image kindest/node:v1.21.12
kubectl cluster-info --context kind-dev


krustlet 需要在第一次接入集群的时候通过 csr 认证,我们通过官方提供的脚本进行证书初始化

提示:

csr 全称是 CertificateSigningRequest,该资源类型允许可以使用其来签发 X.509 证书

git clone https://github.com/krustlet/krustlet.git  
./scripts/bootstrap.sh


配置生成后,可以通过如下命令查看生成的启动配置,其中已经包含了认证信息

cat$HOME/.krustlet/config/bootstrap.conf



部署 krustlet

本文章演示的开发环境为 macos,我们可以直接通过如下命令安装 krustlet,安装完成后增加执行权限

wget https://krustlet.blob.core.windows.net/releases/krustlet-canary-macos-amd64.tar.gz
tar -zxvf krustlet-canary-macos-amd64.tar.gz
chmod+x krustlet-wasi && mv krustlet-wasi /usr/local/bin 

krustlet 安装完成后,我们需要通过如下命令来启动

  • node-ip:是本地网卡的地址,主要是作为加入 kubernetes 集群的节点地址标识
  • node-name:加入到 kubernetes 集群节点的名称标识
  • bootstrap-file:bootstrap 文件,填写我们在上述生成的文件
krustlet-wasi \
--node-ip <你的本地网卡地址> \
--node-name=krustlet \
--bootstrap-file=${HOME}/.krustlet/config/bootstrap.conf


命令执行后,我们可以在执行过程中可以看到,提示需要等待 csr 同意才可以继续运行

解下来我们通过如下命令查看 csr 并同意

kubectl get csr 
kubectl certificate approve MacBook-Pro.local-tls 


等待运行后我们通过查看集群节点可以看到 krustlet 已经加入到了集群中

kubectl get no -owide


此时我们运行一个测试的 Pod,可以看到成功进行了调度

apiVersion: v1
kind: Pod
metadata:  name: hello-wasm
spec:  containers:  - name: hello-wasm
    image: webassembly.azurecr.io/hello-wasm:v1
  tolerations:  - effect: NoExecute
    key: kubernetes.io/arch
    operator: Equal
    value: wasm32-wasi   # or wasm32-wasmcloud according to module target arch  - effect: NoSchedule
    key: kubernetes.io/arch
    operator: Equal
    value: wasm32-wasi   # or wasm32-wasmcloud according to module target arch
kubectl apply -f /tmp/demo.yaml


通过查看 Node 的亲和性,krustlet 需要如下条件

kubectl get no krustlet -oyaml


开发 WASM Demo

我们创建一个 rust 项目, 名称叫做 demo

创建完成项目后,我们进入到项目,并且通过 rustup 安装 wasm32-wasi 

cargo new --bin demo && cd demo
rustup target add wasm32-wasi


解下来我们编写 mian.rs,实现一个简单的延迟循环输出

usestd::time::Duration;
usestd::thread::sleep;
fnmain() {
loop {
println!("Hello, World!");
sleep(Duration::from_secs(5));
    }
}


接下来我们通过 cargo 编译

cargo build --release--target wasm32-wasi
ls target/wasm32-wasi/release/demo.wasm


编译完成后,我们继续安装 wasmtime 来运行测试一下

brew install wasmtime  
wasmtime target/wasm32-wasi/release/demo.wasm

可以看到是预期的输出


开发完成 demo 后,我们如果运行到 Kubernetes 中,需要转换为标准的 oci 镜像格式,wasm-to-oci 这个工具就可以做到


wasm-to-oci

首先我们安装

wget https://github.com/engineerd/wasm-to-oci/releases/download/v0.1.2/darwin-amd64-wasm-to-oci
mv darwin-amd64-wasm-to-oci /usr/local/bin/wasm-to-oci && chmod+x /usr/local/bin/wasm-to-oci

安装完成后我们可以直接通过如下命令推送到仓库,这里我直接推送到内网开发环境的 registry

wasm-to-oci push target/wasm32-wasi/release/demo.wasm registry.inner/wasm-demo:v0.1


推送完成后,我们来编写 yaml 部署到 Kubernetes 集群进行测试

提示:

需要注意 Pod 的亲和性

apiVersion: v1
kind: Pod
metadata:  name: wasm-oci-demo
spec:  containers:  - name: hello-wasm
    image: registry.inner/wasm-demo:v0.1
  tolerations:  - effect: NoExecute
    key: kubernetes.io/arch
    operator: Equal
    value: wasm32-wasi   
  - effect: NoSchedule
    key: kubernetes.io/arch
    operator: Equal
    value: wasm32-wasi  


我们发布到 Kubernetes 集群中,然后查看日志输出

kubectl apply -f /tmp/wasm-demo.yaml
kubectl logs -f wasm-oci-demo





相关链接:

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
存储 运维 监控
双11黑科技,阿里百万级服务器自动化运维系统StarAgent揭秘
还记得那些年我们半夜爬起来重启服务器的黑暗历史吗?双11期间,阿里巴巴百万量级主机管理能安全、稳定、高效,如丝般顺滑是如何做到的?阿里巴巴运维中台技术专家宋意,首次直播揭秘阿里IT运维的基础设施StarAgent,详细分析StarAgent是如何支持百万级规模服务器管控?如何像生活中的水电煤一样,做...
16775 16
|
5月前
|
人工智能 监控 JavaScript
MCP实战之Agent自主决策-让 AI玩转贪吃蛇
MCP服务器通过提供资源、工具、提示模板三大能力,推动AI实现多轮交互与实体操作。当前生态包含Manus、OpenManus等项目,阿里等企业积极合作,Cursor等工具已集成MCP市场。本文以贪吃蛇游戏为例,演示MCP Server实现流程:客户端连接服务端获取能力集,AI调用工具(如start_game、get_state)控制游戏,通过多轮交互实现动态操作,展示MCP在本地实践中的核心机制与挑战。
612 39
MCP实战之Agent自主决策-让 AI玩转贪吃蛇
|
10月前
|
存储 消息中间件 缓存
独特架构打造新一代消息队列Apache Pulsar
Apache Pulsar 是一个开源的分布式消息流平台,由雅虎开发并于 2016 年开源,2018 年成为 Apache 顶级项目。Pulsar 通过独特的架构提供多租户、持久化存储和批处理等高级功能,支持高吞吐量、低延迟的消息传递。其核心组件包括 Broker、Apache BookKeeper 和 Apache ZooKeeper,分别负责消息处理、持久化存储和集群管理。
381 1
|
11月前
|
Rust 前端开发 JavaScript
Wasm在即时通讯IM场景下的Web端应用性能提升初探
简单的来说,Wasm就是使用C/C++/Rust等语言编写的代码,经过编译后得到汇编指令,再通过JavaScript相关API将文件加载到Web容器中(即运行在Web容器中的汇编代码)。Wasm是一种可移植、体积小、加载快速的二进制格式,可以将各种编程语言的代码编译成Wasm模块,这些模块可以在现代浏览器中直接运行。尤其在涉及到GPU或CPU计算时优势相对比较明显。
190 0
|
11月前
|
运维 监控 Devops
DevOps文化:持续交付与持续反馈的文化构建与实践
【10月更文挑战第26天】DevOps作为一种将开发与运维紧密结合的文化和实践,通过促进团队协作与自动化流程,实现快速、稳定且高质量的软件交付。本文重点探讨持续交付与持续反馈两大支柱,通过实际案例和示例代码,展示其构建与实践过程。例如,使用Jenkins构建CI/CD流水线,通过Grafana和Prometheus实现实时监控,确保软件质量和快速响应。
161 1
|
Kubernetes 应用服务中间件 nginx
debian11使用kubeadm安装k8s
debian11使用kubeadm安装k8s
264 1
|
机器学习/深度学习 人工智能 自然语言处理
深度学习还不如浅层网络?RL教父Sutton持续反向传播算法登Nature
【9月更文挑战第24天】近年来,深度学习在人工智能领域取得巨大成功,但在连续学习任务中面临“损失可塑性”问题,尤其在深度强化学习中更为突出。加拿大阿尔伯塔大学的研究人员提出了一种名为“持续反向传播”的算法,通过选择性地重新初始化网络中的低效用单元,保持模型的可塑性。该算法通过评估每个连接和权重的贡献效用来决定是否重新初始化隐藏单元,并引入成熟度阈值保护新单元。实验表明,该算法能显著提升连续学习任务的表现,尤其在深度强化学习领域效果明显。然而,算法也存在计算复杂性和成熟度阈值设置等问题。
224 2
|
存储 安全 Java
Java面试题:Java内存管理、多线程与并发框架:一道综合性面试题的深度解析,描述Java内存模型,并解释如何在应用中优化内存使用,阐述Java多线程的创建和管理方式,并讨论线程安全问题
Java面试题:Java内存管理、多线程与并发框架:一道综合性面试题的深度解析,描述Java内存模型,并解释如何在应用中优化内存使用,阐述Java多线程的创建和管理方式,并讨论线程安全问题
164 0
|
Java
Java后台返回树形结构的二种方式
Java后台返回树形结构的二种方式
742 0
|
Linux 数据处理
Linux中的nproc命令:轻松查看系统CPU核心数
`nproc`命令在Linux中用于查看CPU核心数,简洁高效,无参数直接运行。它读取`/proc/cpuinfo`获取信息,适用于资源分配。例如,`nproc`显示核心数,`nproc --all`(非标准选项,可能需结合其他命令)展示更多详情。在脚本中,可将`nproc`输出赋值给变量以适应动态资源管理。使用时注意文件访问权限,检查结果准确性,并结合其他工具如`lscpu`获取更全面硬件信息。