介绍
Krustlet 是基于k8s运行wasm程序的负载,通过亲和性来运行wasm程序,其实现了kubelet api,且兼容了 kubectl logs
和 kubectldelete
命令。
接下来将一步步安装、运行krustlet
kind安装
kind config配置
代码语言:javascript复制kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
kubeadmConfigPatches:
- |
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
metadata:
name: config
networking:
serviceSubnet: 10.0.0.0/16
imageRepository: registry.aliyuncs.com/google_containers
nodeRegistration:
kubeletExtraArgs:
pod-infra-container-image: registry.aliyuncs.com/google_containers/pause:3.1
- |
apiVersion: kubeadm.k8s.io/v1beta1
kind: InitConfiguration
metadata:
name: config
networking:
serviceSubnet: 10.0.0.0/16
imageRepository: registry.aliyuncs.com/google_containers
nodes:
- role: control-plane
- role: worker
- role: worker
创建集群
代码语言:javascript复制kind create --config=kind-config.yaml
运行krustlet
生成kubeconfig
通过脚本生成bootstrap config
代码语言:javascript复制bash <(curl https://raw.githubusercontent.com/deislabs/krustlet/master/docs/howto/assets/bootstrap.sh)
krustlet安装
代码语言:javascript复制wget https://krustlet.blob.core.windows.net/releases/krustlet-v0.3.0-macos-amd64.tar.gz
tar xf krustlet-v0.3.0-macos-amd64.tar.gz
chmod x krustlet-*
mv krustlet-* /usr/local/bin/
启动krustlet
代码语言:javascript复制/usr/local/bin/krustlet-wasi --node-ip 192.168.11.5 --bootstrap-file=~/.krustlet/config/bootstrap.conf
approve 证书
像kubelet一样,通过bootstrap config启动后会发起一个csr,我们需要对其approve
代码语言:javascript复制kubectl certificate approve Mbp.local-tls
查看状态
可以看到已经处于ready状态
代码语言:javascript复制kubectl get nodes
NAME STATUS ROLES AGE VERSION
kind-control-plane Ready master 16m v1.18.2
kind-worker Ready <none> 15m v1.18.2
kind-worker2 Ready <none> 15m v1.18.2
mbp.local Ready agent 9s 0.3.0
查看污点
代码语言:javascript复制kubectl get nodes mbp.local -o json | jq .spec.taints
[
{
"effect": "NoExecute",
"key": "krustlet/arch",
"value": "wasm32-wasi"
}
]
krustlet运行wasi
下载wasm-to-oci
我们需要下载wasm-to-oci工具,使用该工具可以将wasm程序推送到docker仓库。
代码语言:javascript复制wget https://github.com/engineerd/wasm-to-oci/releases/download/v0.1.1/darwin-amd64-wasm-to-oci
生成wasi程序
创建项目
代码语言:javascript复制cargo new krust-test
代码如下
代码语言:javascript复制#[no_mangle]
fn _start() {
let mut i:i32 = 0;
loop {
println!("hello {:?}",i);
i =1;
sleep(Duration::new(1, 0))
}
}
编译
代码语言:javascript复制cargo build --target=wasm32-wasi
准备一个oci v2registry
支持以下几种registry
- Distribution (open source, version 2.7 )
- Azure Container Registry
- Google Container Registry
- Harbor Container Registry v2.0
这里我自行搭建了一个,证书通过letsencrypt生成
代码语言:javascript复制docker run -v /media:/certs
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.crt
> -e REGISTRY_HTTP_TLS_KEY=private.pem
> -p 443:443
> registry:2
将编译好的wasm文件推送到仓库
代码语言:javascript复制wasm-to-oci push .//target/wasm32-wasi/release/krustlet_test.wasm reg.rocdu.top/test/krustlet:v1
运行wasi wavm程序
我们将运行一个wasm pod,通过容忍策略让该pod可以运行在我们的krustlet节点上面
代码语言:javascript复制apiVersion: v1
kind: Pod
metadata:
name: krustlet-tutorial
spec:
containers:
- name: krustlet-tutorial
image: reg.rocdu.top/test/krustlet:v1
tolerations:
- key: "krustlet/arch"
operator: "Equal"
value: "wasm32-wasi"
effect: "NoExecute"
查看运行状态,可以看到已经处于运行状态,让我们看一下日志的输出,可以看到是我们预期的输出。
代码语言:javascript复制kubectl get pods -w
NAME READY STATUS RESTARTS AGE
krustlet-tutorial 0/1 Pending 0 14s
krustlet-tutorial 0/1 Running 0 14s
kubectl logs krustlet-tutorial -f
hello 1
hello 2
hello 3
总结
krustlet以及wasi都是很不成熟的项目,仅限用于测试。