什么是 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 containersname hello-wasm image webassembly.azurecr.io/hello-wasm v1 tolerationseffect NoExecute key kubernetes.io/arch operator Equal value wasm32-wasi # or wasm32-wasmcloud according to module target archeffect 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 containersname hello-wasm image registry.inner/wasm-demo v0.1 tolerationseffect 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
相关链接: