Deploy with kind
Overview
kind is a Kubernetes distribution designed to run local clusters for local development or CI, using nodes that run as containers.
This deployment guide will demonstrate how to deploy wasmCloud to a kind cluster and run wasmCloud applications built from WebAssembly components.
Install tools
In addition to kind and the container tooling a kind cluster requires to run, this guide uses Helm and the wasmCloud Shell (wash
) CLI. (For an alternative, script-driven kind quickstart using Kustomize, see the community contributions repository.)
Install container tooling
kind requires container tooling and supports Docker, podman, and nerdctl. Install the container toolchain of your choice before installing kind.
Install kind
If you do not already have kind, you can install it with the Go toolchain.
go install sigs.k8s.io/kind@v0.23.0
You may need to add your Go binary folder to your PATH as well:
export PATH=${PATH}:`go env GOPATH`/bin
Start a local Kubernetes cluster:
cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
kubeadmConfigPatches:
- |
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
node-labels: "ingress-ready=true"
extraPortMappings:
- containerPort: 80
hostPort: 80
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
EOF
Install Helm
Helm serves as a package manager for Kubernetes. Follow the instructions on the Helm install page or use the project's install script:
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
Install wash
Once wasmCloud is deployed to your kind cluster, you can use the wasmCloud Shell (wash
) CLI to manage wasmCloud applications. If you do not have wash
installed locally, follow the instructions on the install page.
Deploying wasmCloud
Once a kind
cluster is running locally, you can run wasmCloud on Kubernetes with the wasmCloud Kubernetes operator. An operator is an extension that uses custom Kubernetes resources to manage an application—you can learn more about the Kubernetes operator pattern in the Kubernetes documentation.
Before deploying the operator, it is necessary to deploy two prerequisites to the cluster:
- NATS (with Jetstream enabled)
- wasmCloud Application Deployment Manager (wadm)
The following steps will help you deploy the prerequisites to your Kubernetes cluster, then deploy the operator.
Deploy NATS
NATS is the open source connective technology that wasmCloud uses to create a unified topology across any number of environments. Add the NATS Helm repository:
helm repo add nats https://nats-io.github.io/k8s/helm/charts/
Install the upstream NATS Helm chart to start a cluster with the values.yaml
file from the wasmCloud operator repository:
helm upgrade --install -f https://raw.githubusercontent.com/wasmCloud/wasmcloud-operator/main/examples/quickstart/nats-values.yaml nats nats/nats
Validate the installation with:
kubectl rollout status deploy,sts -l app.kubernetes.io/instance=nats
Deploy wadm
wasmCloud Application Deployment Manager (wadm) enables declarative application deployment and management for wasmCloud. You can deploy wadm to your Kubernetes cluster with a Helm chart:
helm install wadm -f https://raw.githubusercontent.com/wasmCloud/wasmcloud-operator/main/examples/quickstart/wadm-values.yaml oci://ghcr.io/wasmcloud/charts/wadm
Validate the installation with:
kubectl rollout status deploy -l app.kubernetes.io/instance=wadm
Deploy the wasmCloud operator
To deploy the operator:
kubectl apply -k https://github.com/wasmCloud/wasmcloud-operator/deploy/base
Validate that the pods are ready:
kubectl rollout status deploy -l app=wasmcloud-operator -n wasmcloud-operator
Validate that the apiservice is available:
kubectl wait --for condition=available apiservices.apiregistration.k8s.io v1beta1.core.oam.dev
Create wasmCloud host
Apply the wasmcloud-host
manifest:
kubectl apply -f https://raw.githubusercontent.com/wasmCloud/wasmcloud-operator/main/examples/quickstart/wasmcloud-host.yaml
Check wasmCloud host status:
kubectl describe wasmcloudhostconfig wasmcloud-host
Run a WebAssembly component on Kubernetes
When you kubectl apply
a wasmCloud application manifest, the cluster automatically provisions the component workload with wasmCloud.
This example uses the hello-world-application.yaml
manifest included in the operator's quickstart. (The source code for the application is available in the wasmCloud repository.)
Below is an excerpt of the manifest:
...
spec:
components:
- name: http-component
type: component
properties:
image: ghcr.io/wasmcloud/components/http-hello-world-rust:0.1.0
...
The component is packaged as an OCI artifact and specified in the image
field. This isn't a container, but a component conforming to OCI standards, meaning that it can be used with existing registries for container images.
Run kubectl apply
:
kubectl apply -f https://raw.githubusercontent.com/wasmCloud/wasmcloud-operator/main/examples/quickstart/hello-world-application.yaml
View the deployment status:
kubectl get application
APPLICATION DEPLOYED VERSION LATEST VERSION STATUS
hello-world v0.0.1 v0.0.1 Deployed
When you run a wasmCloud application that uses the httpserver
provider with a daemonscaler, as this one does, the operator automatically creates a Kubernetes service for the application.
View services:
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-world ClusterIP 10.96.199.43 <none> 8080/TCP 11s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6m29s
nats ClusterIP 10.96.104.180 <none> 4222/TCP,7422/TCP,4223/TCP 5m36s
nats-headless ClusterIP None <none> 4222/TCP,7422/TCP,4223/TCP,6222/TCP,8222/TCP 5m36s
wasmcloud-host ClusterIP 10.96.67.225 <none> 4222/TCP 84s
Test the application
On a cluster without ingress (such as this one), you can still test the component from within the wasmCloud host container where the application is running.
Assign the wasmCloud host pod name to an environment variable:
WASMCLOUD_HOST_POD=$(kubectl get pods -o jsonpath="{.items[*].metadata.name}" -l app.kubernetes.io/instance=wasmcloud-host)
Port-forward the wasmCloud host's port 8080:
kubectl port-forward pods/$WASMCLOUD_HOST_POD 8080
curl
the application:
curl http://localhost:8080
Debugging
You can use kubectl
to get logs from the wasmCloud host running on your kind cluster:
kubectl logs -l app.kubernetes.io/instance=wasmcloud-host -c wasmcloud-host
Common mistakes
- If you're having trouble deploying an application, make sure your wadm application manifest references an OCI image and not a local file.
- If a service is not automatically generated for an application using the httpserver provider, check to ensure that the provider uses
daemonscaler
in the application manifest. (You can see an example of this in thehello-world-application
manifest.)
Manage applications with wash
To connect wash
to the cluster, port-forward into the NATS service running in your Kubernetes cluster. (Note: 4222
is the port for the NATS service, 4223
is the port for NATS websockets.)
kubectl port-forward svc/nats 4222:4222 4223:4223
Now you can connect to wasmCloud on Kubernetes with your local wash
toolchain:
wash app list
View the hello-world
application running on the Kubernetes cluster, manageable via our local wash
CLI:
Name Latest Version Deployed Version Deploy Status Description
hello-world v0.0.1 v0.0.1 Deployed HTTP hello world demo in Rust, using the WebAssembly Component Model and WebAssembly Interfaces Types (WIT)
Clean up
To delete the kind cluster when you are finished:
kind delete cluster