SpinKubeでWASMアプリをKubernetesにデプロイする

SpinKubeでWASMアプリをKubernetesにデプロイする

2025.07.24

Introduction

image.png

SpinKubeは、WebAssembly(wasm)アプリをKubernetesでネイティブに実行するためのオープンソースプラットフォームです。
従来のコンテナベースのアプローチとは異なり、SpinKubeはWasmの高速起動やサンドボックス環境という特徴を使い、k8sにおける新しいワークロードを提供します。
本記事では、SpinKubeの基本概念から実際のデプロイメントまでを解説します。

SpinKube?

SpinKubeは、Fermyon社のSpinフレームワークをKubernetes環境で実行するためのプラットフォームです。

ちなみに、昔書いたSpinフレームワークの記事はこちらです。

SpinKubeはk8s,wasm,spinを組み合わせて、wasmアプリをk8sのネイティブな機能として統合します。

SpinKubeの主要コンポーネント

SpinKubeは以下のコンポーネントで構成されています。

  1. Spin Operator
    k8sオペレータパターンを使用してSpinアプリのライフサイクルを管理します。
    オペレータとはk8sの拡張機能で、カスタムリソースの管理を自動で行うプログラムです。

  2. SpinApp CRD
    Spinアプリケーションを定義するためのカスタムリソース定義です。
    CRD(Custom Resource Definition)はk8sに新しいリソースタイプを追加する仕組みです。

  3. 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

生成されたマニフェストを以下のように編集します。
executorspintainerに変更)

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

↑は例えば、
http://hello-spinkube.local
へのアクセスがあった場合、クラスター内のhello-spinkubeサービスに
転送する設定となります。

適用を忘れずに。

% 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も検討してみてください。

References

この記事をシェアする

facebookのロゴhatenaのロゴtwitterのロゴ

© Classmethod, Inc. All rights reserved.