
SpinKubeでWASMアプリをKubernetesにデプロイする
Introduction
SpinKubeは、WebAssembly(wasm)アプリをKubernetesでネイティブに実行するためのオープンソースプラットフォームです。
従来のコンテナベースのアプローチとは異なり、SpinKubeはWasmの高速起動やサンドボックス環境という特徴を使い、k8sにおける新しいワークロードを提供します。
本記事では、SpinKubeの基本概念から実際のデプロイメントまでを解説します。
SpinKube?
SpinKubeは、Fermyon社のSpinフレームワークをKubernetes環境で実行するためのプラットフォームです。
ちなみに、昔書いたSpinフレームワークの記事はこちらです。
SpinKubeはk8s,wasm,spinを組み合わせて、wasmアプリをk8sのネイティブな機能として統合します。
SpinKubeの主要コンポーネント
SpinKubeは以下のコンポーネントで構成されています。
-
Spin Operator
k8sオペレータパターンを使用してSpinアプリのライフサイクルを管理します。
オペレータとはk8sの拡張機能で、カスタムリソースの管理を自動で行うプログラムです。 -
SpinApp CRD
Spinアプリケーションを定義するためのカスタムリソース定義です。
CRD(Custom Resource Definition)はk8sに新しいリソースタイプを追加する仕組みです。 -
SpinAppExecutor
Spinアプリケーションの実行方法を定義します。
実行方法は2種類あり、containerd-shim-spinはノード上で直接WASMを実行します。
高性能ですが、設定が複雑です。
spintainerはコンテナ内でSpinを実行します。
こちらは設定がシンプルであるという特徴があります。
SpinKubeの特徴
SpinKubeは軽量・高速起動というメリットがあります。
WASMなので従来よりイメージが小さく、リソース節約できます。
起動も高速でスケーリングも問題ありません。
セキュリティに関してもWasmサンドボックスモデルによって安全性が確保されます。
Environment
- MacBook Pro (14-inch, M3, 2023)
- OS : MacOS 14.5
- Node : 20.19.0
- Kubernetes: v1.26〜(containerd v1.6.26+/v1.7.7+)
必要なツール
以下のツールをインストールしておく必要があります:
# Kubernetes関連
- kubectl(Kubernetes CLI)
- Helm v3(Kubernetesパッケージマネージャー)
# 開発ツール
- Docker / Colima
- k3d または Kind(ローカルKubernetesクラスター用)
# Spinツール
- spin CLI(Spinアプリケーション開発用)
- Rust toolchain(Rustアプリケーション開発時)
本記事では、k3dを使用したローカル環境構築を使用します。
Setup
SpinKube環境のセットアップを開始します。
1. 必要なツールのインストール
k8s関連のツールをインストールします。
また、docker/colimaも必要です。
% brew install kubectl helm k3d
# Docker / Colima
% brew install --cask docker
# or
% brew install colima
SpinとRust環境もインストールしましょう。
# Spin CLI
% curl -fsSL https://developer.fermyon.com/downloads/install.sh | bash
% sudo mv spin /usr/local/bin/
# Rust(Spinアプリ開発用)
% curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
2. k3dクラスターの作成
k3dクラスターを作成します。DNS解決の問題を回避するため、
K3D_FIX_DNS=0
環境変数を設定します:
% K3D_FIX_DNS=0 k3d cluster create spinkube-cluster \
--port "8081:80@loadbalancer" \
--agents 2
このコマンドは、標準のk3dクラスターを作成します。
3. SpinKubeのインストール
SpinKubeの環境を構築します。
cert-manager(証明書管理)
cert-managerは、k8s内で証明書の発行と更新を自動化するツールです。
SpinKubeの各コンポーネント間の安全な通信を確保するために必要。
# cert-managerのインストール
% kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.5/cert-manager.yaml
# cert-managerが起動するまで待機
% kubectl wait --for=condition=ready --timeout=300s -n cert-manager pod --all
RuntimeClass(実行環境の定義)
RuntimeClassは、Podがどのコンテナランタイムを使用するかを指定します。
これによりWASMワークロードの実行方法を定義します。
# RuntimeClassの適用
# containerd-shim-spinを指定
% kubectl apply -f https://github.com/spinkube/containerd-shim-spin/releases/download/v0.19.0/runtime-class-manager.yaml
SpinApp CRD(カスタムリソース定義)
CRDは新しいリソースタイプをk8sに追加します。
これによりSpinアプリをk8sネイティブなリソースとして扱えます。
# CRDsの適用
% kubectl apply -f https://github.com/spinkube/spin-operator/releases/download/v0.5.0/spin-operator.crds.yaml
Spin Operator(アプリケーション管理)
Spin OperatorはSpinアプリケーションのライフサイクルを自動管理します。
Helmを使用してインストールします。
# Spin Operatorのインストール
% helm install spin-operator \
oci://ghcr.io/spinkube/charts/spin-operator \
--namespace spin-operator \
--create-namespace \
--version 0.5.0 \
--wait
4. Spintainer Executorの設定
Spinアプリケーションを実行するためのExecutorを設定します。
さきほどRuntimeClassではcontainerd-shim-spinを指定しました。
これは、クラスター全体で使える実行環境を定義しています。
Executorはアプリごとに「実際に使用する実行方法」を指定します。
今回はspintainer
を使用します。
spintainer-executor.yamlを作成します。
apiVersion: core.spinkube.dev/v1alpha1
kind: SpinAppExecutor
metadata:
name: spintainer
spec:
createDeployment: true
deploymentConfig:
installDefaultCACerts: true
spinImage: ghcr.io/fermyon/spin:v3.0.0
Executorを適用します。
% kubectl apply -f spintainer-executor.yaml
5. spin kubeプラグインのインストール
Spinアプリケーションの開発とデプロイに必要なプラグインをインストールします。
% spin plugins install kube --yes
Try
それでは、実際にSpinアプリケーションを作成して動かしてみましょう。
1. Spinアプリケーションの作成
今回はシンプルなHTTPアプリを作成しましょう。
% spin new -t http-rust hello-spinkube --accept-defaults
2. 実装
src/lib.rs
でAPIエンドポイントを実装します。
Hello Worldレベルのシンプルなものです。
use spin_sdk::http::{IntoResponse, Request, Response};
use spin_sdk::http_component;
#[http_component]
fn handle_hello_spinkube(req: Request) -> anyhow::Result<impl IntoResponse> {
let path = req.uri().path();
let response = match path {
"/" => "Welcome to SpinKube!",
"/hello" => "Hello from WebAssembly running on Kubernetes!",
"/health" => "OK",
_ => "Not Found",
};
Ok(Response::builder()
.status(200)
.header("content-type", "text/plain")
.body(response)
.build())
}
3. アプリのbuild & push
WASM用ターゲットを追加してない場合はaddが必要です。
追加後にbuildしてOCIリポジトリにpushしましょう。
# WASMターゲットの追加(初回のみ)
% rustup target add wasm32-wasip1
# Build
% spin build
# OCI registryへのプッシュ(ttl.shは1h有効なレジストリ)
% export IMAGE_NAME=ttl.sh/hello-spinkube-$(uuidgen):1h
% spin registry push $IMAGE_NAME
4. k8sマニフェストの生成
マニフェスト(k8sの設定を記述したYAML)を生成します。
% spin kube scaffold --from $IMAGE_NAME > spinapp.yaml
生成されたマニフェストを以下のように編集します。
(executor
をspintainer
に変更)
apiVersion: core.spinkube.dev/v1alpha1
kind: SpinApp
metadata:
name: hello-spinkube
spec:
image: "ttl.sh/hello-spinkube-xxx:1h" # 実際のイメージ名に置き換え
executor: spintainer # containerd-shim-spin から変更
replicas: 2
5. 動作確認
ローカルで動かしてみましょう。
% spin up --listen 127.0.0.1:3000
curlで動作確認。↓みたいになると思います。
% curl http://127.0.0.1:3000/
Welcome to SpinKube!
% curl http://127.0.0.1:3000/hello
Hello from WebAssembly running on Kubernetes!
% curl http://127.0.0.1:3000/health
OK
6. デプロイ to SpinKube
次はSpinアプリをk8sにデプロイします。
# SpinAppのデプロイ
% kubectl apply -f spinapp.yaml
% kubectl get spinapp
% kubectl get pods -l core.spinkube.dev/app-name=hello-spinkube
Podが起動するまで待機しましょう。
% kubectl wait --for=condition=ready pod -l \
core.spinkube.dev/app-name=hello-spinkube --timeout=120s
7. アクセス
ingress.yamlを作成してアプリにアクセスしてみます。
Ingressは、クラスター外部からクラスター内のServiceへのアクセスを制御します。
以下の設定ではドメインやパス、転送情報を設定してます。
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-spinkube
annotations:
ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- host: hello-spinkube.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: hello-spinkube
port:
number: 80
↑は例えば、
転送する設定となります。
適用を忘れずに。
% kubectl apply -f ingress.yaml
curlで確認してみましょう。
ちゃんとk8sでSpinアプリが動作していることが確認できます。
% curl -H "Host: hello-spinkube.local" http://localhost:8081/
Welcome to SpinKube! Your WebAssembly app is running on Kubernetes!
Summary
SpinKubeは、WASMアプリをk8sで実行するためのプラットフォームです。
WASMとk8sを組み合わせて使うことでパフォーマンスやセキュリティに優れた
アプリを構築できます。
従来のコンテナ技術に代わる新しい選択肢として、
SpinKubeも検討してみてください。