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





相关链接:

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
6月前
|
安全 测试技术 持续交付
软件开发、测试常用知识点总结与拓展
脚本(Script): 定义:脚本是一系列计算机指令的文本文件,通常用于自动化任务或执行特定的操作。它可以包括编程语言的代码或一系列命令。 用途:脚本用于自动化重复性任务、批处理作业、配置系统设置等。例如,Shell脚本、Python脚本和JavaScript脚本用于执行各种任务。 图解:通常,脚本的图示是一张文本文件图标,包括文件名和脚本内容的代码段。 队列(Queue): 定义:队列是一种数据结构,遵循FIFO(先进先出)原则,其中最早加入队列的元素最早被移除。队列通常用于管理和协调多个任务或进程之间的顺序执行。 用途:队列在计算机科学中用于任务调度、消息传递、数据缓冲等。例如,操作系统使
204 1
|
8月前
|
前端开发 NoSQL 数据库
项目重点知识点详解
项目重点知识点详解
|
8月前
|
存储 缓存 负载均衡
《大型网站技术架构:核心原理与案例分析》读书笔记
《大型网站技术架构:核心原理与案例分析》读书笔记
【项目实战典型案例】28个案例总结收获
【项目实战典型案例】28个案例总结收获
|
10月前
28个项目实战典型案例总结收获
28个项目实战典型案例总结收获
68 0
|
10月前
|
SQL 消息中间件 缓存
|
前端开发
前端学习案例1-if...else..优化
前端学习案例1-if...else..优化
53 0
前端学习案例1-if...else..优化
|
前端开发
前端学习案例2-if...else..优化
前端学习案例2-if...else..优化
67 0
前端学习案例2-if...else..优化
|
JSON 监控 程序员
程序员必备的分析解决问题能力:案例分享
程序员必备的分析解决问题能力:案例分享
148 0
程序员必备的分析解决问题能力:案例分享
|
消息中间件 Java 关系型数据库
pmq学习一-一些典型的使用和套路
pmq是信也科技开源的一款消息中间件,虽然没有RocketMQ和Kafka出名,但是里面的代码还是有值得我们学习的地方的。 pmq的源码里面很多套路还是值得学习的,说实话,这些都是可以用到项目里面的。下面的代码来源于pmq。 首先安装好maven、mysql,对下载下拉的包进行打包: 如果遇到时区问题,则可以调整时区问题。 1.MqBootstrapListener 观察者模式的使用
148 0
pmq学习一-一些典型的使用和套路

热门文章

最新文章