Всем привет! На связи Дмитрий Силкин, 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.

Читайте также в нашем блоге:

Комментарии (0)