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





相关链接:

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
前端开发 NoSQL 数据库
项目重点知识点详解
项目重点知识点详解
|
消息中间件 安全 JavaScript
28个案例终极篇
28个案例终极篇
html+css实战86-综合案例2
html+css实战86-综合案例2
114 0
html+css实战86-综合案例2
html+css实战85-综合案例1
html+css实战85-综合案例1
113 0
html+css实战85-综合案例1
|
XML 数据采集 存储
接口自动化的关键思路和解决方案,本文全讲清楚了
与UI相比,接口一旦研发完成,通常变更或重构的频率和幅度相对较小。因此做接口自动化的性价比更高,通常运用于迭代版本上线前的回归测试中。 手工做接口测试,测试数据和参数都可以由测试人员手动填写和更新。
接口自动化的关键思路和解决方案,本文全讲清楚了
|
安全 测试技术 数据库
测试基础篇(一)—— 面试终极常见
测试基础篇(一)—— 面试终极常见
194 0
下一篇
DataWorks