NATS Server Configuration
A wasmCloud deployment requires at least one NATS server configured to use JetStream. A production deployment should use at least one NATS cluster with three or five servers depending on your reliability requirements.
It's difficult to offer a one-size-fits-all guide for deploying NATS, since the topology of a cluster can vary significantly depending on your requirements. The NATS Configuration options and the topology examples provided by NATS by Example are helpful resources for becoming familiar with how to set up a cluster.
The following sections will cover running a single server and a three node cluster suitable for production use cases. Advanced topics such as configuring a NATS operator hierarchy or enabling TLS—while strongly recommended—are out of scope.
A single server deployment​
Below is a minimal example of a server configuration file:
# Use an appropriate server name for your environment
server_name: myserver
jetstream: enabled
jetstream {
store_dir = /path/to/data/directory
# Use a domain suitable for your environment
domain = wasmcloud
}
This configures a single NATS server with JetStream enabled and data stored in a known location. This configuration sets a JetStream domain, which enables fanning out the deployment using leaf node sidecars later.
To start a server with this configuration file, run:
nats-server -c sample.conf
Clustering NATS​
A NATS cluster is a set of servers configured to communicate with one another and "gossip" the existence of new members of the cluster.
In production, run a cluster consisting of at least three nodes for high availability and resiliency. Clustering enables replicating lattice data, such as the NATS Key Value bucket that stores link definitions, so data is available even if a server becomes unavailable.
Clusters require at least three or five servers because JetStream uses RAFT as its consensus algorithm for ensuring data consistency. Using an odd number of clustered servers allows the algorithm to function as intended.
Configuring a cluster​
The following shows how to configure a cluster composed of three servers on three different hosts.
The first server acts as the seed for the cluster. The is nothing special about a seed server, other than the fact it starts the discovery process for other nodes.
server_name: wasmcloud-0
host: 0.0.0.0
cluster {
name: wasmcloud
}
jetstream {
store_dir = /path/to/data/directory
# Use a domain suitable for your environment
domain = wasmcloud
}
Start this server up with the following command:
nats-server -c server-0.conf
Next, bring up two additional servers on different machines:
server_name: wasmcloud-1
host: 0.0.0.0
cluster {
name: wasmcloud
routes: [
nats://wasmcloud-0.dns.or.ip
]
}
jetstream {
store_dir = /path/to/data/directory
# Use a domain suitable for your environment
domain = wasmcloud
}
server_name: wasmcloud-2
host: 0.0.0.0
cluster {
name: wasmcloud
routes: [
nats://wasmcloud-0.dns.or.ip
]
}
jetstream {
store_dir = /path/to/data/directory
# Use a domain suitable for your environment
domain = wasmcloud
}
You can use the same set of NATS routes in the cluster
configuration block in each server configuration file. NATS will disambiguate between duplicate routes.
Start these two new servers, and now you have a three node cluster!
nats-server -c server-1.conf
nats-server -c server-2.conf
Kubernetes​
If you are running Kubernetes, deploy NATS using the official Helm charts.
Below is an example values.yaml
file for a simple wasmCloud deployment:
config:
cluster:
enabled: true
replicas: 3
jetstream:
enabled: true
domain: wasmcloud
# Decide on how large you need your volumes to be
fileStore:
pvc:
size: 10Gi
podTemplate:
topologySpreadConstraints:
kubernetes.io/hostname:
maxSkew: 1
whenUnsatisfiable: DoNotSchedule
You can start the cluster by running
helm repo add nats https://nats-io.github.io/k8s/helm/charts/
helm upgrade --install nats nats/nats -f sample.yaml
JetStream data replication​
Once you have a running cluster, create the lattice metadata and wadm Key Value buckets configured with replication across more than one NATS server. This makes the wasmCloud cluster resilient to node and instance failures.
The following commands create these buckets with the appropriate configuration. If you are using a lattice with a different name than default
, remember to use the correct name here:
nats --domain wasmcloud kv add --replicas 3 LATTICEDATA_default
nats --domain wasmcloud kv add --replicas 3 wadm_manifests
If the buckets already exist, you can increase the number of replicas:
nats --domain wasmcloud stream edit --replicas 3 KV_LATTICEDATA_default
nats --domain wasmcloud stream edit --replicas 3 wadm_manifests