Skip to main content

Command Palette

Search for a command to run...

在 Kubernetes 上用 Krustlet 调度 WASM

Updated
3 min read

前言

坊间有两个传言:

  • Kubernetes 正在成长为一个统一调度器
  • WASM 如果早点成气候,就没 Docker 什么事了

Krustlet 往前踏了一小步:他的官方描述是“Kubernetes Kubelet in Rust for running WASM”——使用 Rust 实现的 Kubelet,可以在 Kubernetes 中运行 WASM。

Krustlet 是 Deis 实验室的产品,算是 Helm 的同门师兄弟。

项目还非常初期,包括镜像拉取、Pod 生命周期等功能都没能完整实现,只能作为一个概念方面的尝试。

部署

官方提供了 EKS、AKS 以及 Kind 的部署方案,这里我们使用 Kind 进行部署。使用如下配置文件定义一个三节点集群:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker
$ kind create cluster --config=config-3-node.yaml
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.17.0) 🖼
 ✓ Preparing nodes 📦 📦 📦 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾

集群启动之后,就可以安装 Krustlet 了。

踩坑过程中,注意到 Krustlet 的几个依赖项目:

  • Openssl 1.1.x 支持,所以有些老系统可能需要升级;
  • 接入 Krustlet 时,需要满足接入新节点的 Kubernetes 权限要求;
  • Krustlet 和 Kubelet 一样,也要使用 kubeconfig 文件进行认证。

Release 页面可能找到压缩包下载,目前支持 Linux 和 MacOS 两个平台。

解压之后,创建 ~/.krustlet/lib 目录,将压缩包中的 *.so*.dylib 复制到 ~/.krustlet/lib 之中,可执行文件复制到 /usr/local/bin

接下来为 krustlet 准备用于加入 Kubernetes 的证书:

#!/bin/sh
mkdir -p ~/.krustlet/config
cd ~/.krustlet/config
openssl req -new -sha256 -newkey rsa:2048 -keyout krustlet.key -out krustlet.csr -days 365 -nodes -subj "/C=US/ST=./L=./O=./OU=./CN=krustlet"
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
  name: krustlet
spec:
  request: $(cat krustlet.csr | base64 | tr -d '\n')
  usages:
  - digital signature
  - key encipherment
  - server auth
EOF
kubectl certificate approve krustlet
kubectl get csr krustlet -o jsonpath='{.status.certificate}' | base64 --decode > krustlet.crt
openssl pkcs12 -export -out certificate.pfx -inkey krustlet.key -in krustlet.crt -password "pass:password"

启动

启动过程很简单:

$ krustlet-wasi  --pfx-password password --node-ip 10.89.81.61
[2020-04-14T06:16:34Z ERROR kubelet::kubelet] Error handling event: error decoding response body: missing field `access_token` at line 1 column 501
[2020-04-14T06:18:04Z ERROR kubelet::kubelet] Error handling event: error decoding response body: missing field `detail` at line 1 column 119
[2020-04-14T06:28:37Z ERROR kubelet::kubelet] Error handling event: error decoding response body: missing field `detail` at line 1 column 119

其中的 --node-ip 参数是可选的,在 Docker for OS X 中,需要用 ifconfig en0 确定一下适配器 IP,如果是在物理机/虚拟机环境中,这个参数可以省略或者根据实际情况做出调整。

是的你没看错,启动就出了点小问题。接下来看看节点情况:

$ kubectl get nodes
NAME                 STATUS   ROLES    AGE    VERSION
kind-control-plane   Ready    master   136m   v1.17.0
kind-worker          Ready    <none>   136m   v1.17.0
kind-worker2         Ready    <none>   136m   v1.17.0
kind-worker3         Ready    <none>   136m   v1.17.0
abcd-mb0       Ready    agent    111m   v1.17.0

看看节点的情况:

$ kubectl describe nodes abcd-mb0
...
Taints:             krustlet/arch=wasm32-wasi:NoExecute
...
System Info:
  Machine ID:
  System UUID:
  Boot ID:
  Kernel Version:
  OS Image:
  Operating System:           linux
  Architecture:               wasm-wasi
  Container Runtime Version:  mvp
  Kubelet Version:            v1.17.0
  Kube-Proxy Version:         v1.17.0
...
  Operating System:           linux
  Architecture:               wasm-wasi
  Container Runtime Version:  mvp
...

可以看到有很多信息是缺失的,说明项目的确很早期。

Taints 字段的定义,要求特定 Pod 才能调度到该节点上。

最后其架构显示的是 wasm-wasi。

运行一个 Pod

编写一个 YAML 文件:

apiVersion: v1
kind: Pod
metadata:
  name: krustlet-tutorial
spec:
  containers:
    - name: krustlet-tutorial
      image: webassembly.azurecr.io/hello-world-wasi-rust:v0.1.0
      imagePullPolicy: Always
  tolerations:
    - key: "node.kubernetes.io/network-unavailable"
      operator: "Exists"
      effect: "NoSchedule"
    - key: "krustlet/arch"
      operator: "Equal"
      value: "wasm32-wasi"
      effect: "NoExecute"

镜像名好像很普通,Pull 一下:

$ docker pull webassembly.azurecr.io/hello-world-wasi-rust:v0.1.0
v0.1.0: Pulling from hello-world-wasi-rust
670adc713612: Pulling fs layer
invalid rootfs in image configuration

看来这个镜像并不普通。。后面会讲一下。

Pod 定义中声明了 tolerations,让该 Pod 可以在新节点上运行。提交 yaml 之后,可以看到 Pod 运行:

$ kubectl get pods -w
NAME                READY   STATUS    RESTARTS   AGE
krustlet-tutorial   0/1     Pending   0          6s
krustlet-tutorial   0/1     Running   0          8s
krustlet-tutorial   1/1     Running   0       8s
krustlet-tutorial   0/1     ExitCode:0   0          8s

看到这个 Pod 飞快的完成了运行并成功退出,查看他的日志:

hello from stdout!
hello from stderr!
Args are: []

镜像

前面使用 docker pull 未能成功下载,这是因为这个镜像其实是一个封装为 OCI 的 WASM,可以使用 was-to-oci 工具下载,并使用 wasmtime 尝试运行:

$ wasm-to-oci pull registry.microservice.rocks/module-wasm:v1
INFO[0007] Pulled: registry.microservice.rocks/module-wasm:v1
INFO[0007] Size: 1964621
INFO[0007] Digest: sha256:670adc7136128af3a2848d86c18013b1009e7dedb8a686ecacda175094aa083c

完成后可以看到当前目录出现了一个 module.wasm 文件,运行一下:

$ wasmtime module.wasm
hello from stdout!
hello from stderr!
Args are: ["module.wasm"]

反过来,也可以使用这个工具把 WASM 文件推送到镜像库中。例如:

$  wasm-to-oci push module.wasm registry.microservice.rocks/module-wasm:v1
INFO[0001] Pushed: registry.microservice.rocks/module-wasm:v1
INFO[0001] Size: 1964621
INFO[0001] Digest: sha256:54b09224f004231ffb37d14ac478a101d94c58aac93b8da7b67ed84147763d09

玩后感

目前 Krustlet 对 Docker Registry 的支持似乎是有问题的,因此无法运行我们自己用 wasm-to-oci 推送到私库的 WASM。网络通信等内容也就无法测试了。好在目前版本只是 0.1.0,还有很多值得一等。

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts