Всем привет! На связи Дмитрий Силкин, DevOps-инженер компании «Флант». Мы продолжаем обзоры инструментов, которые позволяют использовать WebAssembly-приложения в кластере Kubernetes. Ранее мы запускали Wasm-приложение в Deckhouse Kubernetes Platform с помощью инструментов, которые предоставляет платформа. На этот раз воспользуемся готовым оператором — Kwasm.
Описание Kwasm
Kwasm — это Kubernetes-оператор, который обеспечивает поддержку запуска WebAssembly-приложений на узлах кластера Kubernetes. Для этого он добавляет необходимые настройки и бинарные файлы для containerd с помощью kwasm-node-installer, который запускается на узлах с лейблом kwasm.sh/kwasm-node=true
.
Модуль скачивает на ноды кластера необходимые бинарные файлы containerd-shim’ов и вносит изменения в конфигурацию containerd (подробности о работе технологии WebAssembly можно почитать в нашей статье). После этого на ноде можно будет запускать Wasm-приложения.
Поддержка Kwasm заявлена на многих платформах, начиная от kind и заканчивая облаками AWS, GCP и Azure:
Установка Kwasm
Попробуем установить оператор. В качестве примера будем использовать кластер Kubernetes, развёрнутый с помощью kind. В кластере будет три ноды:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
Создадим кластер:
kind create cluster --config=./kind.yaml
Проверим, что кластер создался:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
kind-control-plane Ready control-plane 59s v1.24.0
kind-worker Ready <none> 40s v1.24.0
kind-worker2 Ready <none> 40s v1.24.0
Когда кластер готов, приступим к установке Kwasm-оператора:
helm repo add kwasm http://kwasm.sh/kwasm-operator/
helm install -n kwasm --create-namespace kwasm-operator kwasm/kwasm-operator
kubectl annotate node --all kwasm.sh/kwasm-node=true
Убедимся, что оператор установился:
kubectl get pods -n kwasm -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kind-control-plane-provision-kwasm-cfbvg 0/1 Completed 0 55s 10.244.0.5 kind-control-plane <none> <none>
kind-worker-provision-kwasm-n5c95 0/1 Completed 0 55s 10.244.1.3 kind-worker <none> <none>
kind-worker2-provision-kwasm-zqj5z 0/1 Completed 0 55s 10.244.2.2 kind-worker2 <none> <none>
kwasm-operator-7f7d456678-hxsgx 1/1 Running 0 72s 10.244.1.2 kind-worker <none> <none>
Запуск тестового Wasm-приложения
После того, как оператор внёс изменения в конфигурацию containerd на нодах, нам нужно создать отдельный runtime-класс для запуска WebAssembly-контейнеров.
kubectl apply -f -<<EOF
---
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: wasmedge
handler: wasmedge
EOF
Теперь всё готово для запуска Wasm-приложения. В качестве примера запустим под wasi-demo с образом wasmedge/example-wasi:latest
.
kubectl apply -f -<<EOF
---
apiVersion: v1
kind: Pod
metadata:
labels:
run: wasi-demo
name: wasi-demo
spec:
containers:
- args:
- /wasi_example_main.wasm
- "50000000"
image: wasmedge/example-wasi:latest
name: wasi-demo
restartPolicy: Never
runtimeClassName: wasmedge
EOF
После того, как под получил статус Completed, посмотрим его логи:
kubectl logs wasi-demo
Random number: 63685983
Random bytes: [247, 43, 129, 227, 3, 56, 148, 40, 154, 241, 96, 85, 109, 140, 104, 71, 188, 245, 165, 107, 146, 202, 215, 21, 50, 33, 54, 193, 175, 35, 142, 108, 150, 30, 229, 50, 105, 139, 110, 170, 187, 234, 41, 249, 213, 65, 146, 27, 88, 115, 30, 147, 95, 155, 203, 183, 143, 0, 139, 108, 12, 141, 255, 191, 11, 254, 40, 189, 186, 19, 196, 136, 51, 114, 103, 119, 130, 105, 99, 177, 192, 158, 122, 120, 160, 9, 241, 73, 209, 235, 22, 158, 35, 6, 223, 217, 3, 215, 114, 4, 52, 11, 49, 191, 33, 253, 80, 254, 255, 176, 137, 38, 53, 190, 18, 194, 53, 143, 251, 1, 147, 254, 206, 130, 195, 77, 93, 151]
Printed from wasi: This is from a main function
This is from a main function
The env vars are as follows.
PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_SERVICE_HOST: 10.96.0.1
HOSTNAME: wasi-demo
KUBERNETES_PORT: tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT: 443
KUBERNETES_SERVICE_PORT_HTTPS: 443
KUBERNETES_PORT_443_TCP_ADDR: 10.96.0.1
KUBERNETES_PORT_443_TCP_PROTO: tcp
KUBERNETES_PORT_443_TCP_PORT: 443
KUBERNETES_PORT_443_TCP: tcp://10.96.0.1:443
The args are as follows.
/wasi_example_main.wasm
50000000
File content is This is in a file
WebAssembly-приложение запущено!
Заключение
Kwasm сильно упрощает деплой Wasm-приложений в кластер Kubernetes. Однако стоит отметить, что хотя у оператора заявлена поддержка в значительном количестве Kubernetes-дистрибутивов, сами разработчики предупреждают, что использовать инструмент стоит только в ознакомительных целях.
На данный момент более серьёзное развитие получает другой оператор — SpinKube, который использует наработки Kwasm под капотом. Мы обязательно расскажем о нём в наших будущих статьях, посвящённых WebAssembly-технологиям.
P. S.
Читайте также в нашем блоге: