Deploy NATS in 5 minutes
This guide walks you step by step through deploying your first NATS cluster on Hikube, from the YAML manifest to initial messaging tests.
Objectivesβ
By the end of this guide, you will have:
- A NATS cluster deployed and running on Hikube
- A high availability configuration with multiple replicas
- JetStream enabled for persistent message storage
- A user configured to connect to your cluster
Prerequisitesβ
Before you begin, make sure you have:
- kubectl configured with your Hikube kubeconfig
- Admin rights on your tenant
- A dedicated namespace to host your NATS cluster
- The NATS CLI (
nats) installed on your workstation (optional, for testing)
Step 1: Create the NATS manifestβ
Create a nats.yaml file with the following configuration:
apiVersion: apps.cozystack.io/v1alpha1
kind: NATS
metadata:
name: example
spec:
external: false
replicas: 3
resourcesPreset: small
storageClass: replicated
jetstream:
enabled: true
size: 10Gi
users:
user1:
password: mypassword
config:
merge:
max_payload: 16MB
write_deadline: 2s
debug: false
trace: false
If resources is defined, the resourcesPreset value is ignored. See the API Reference for the full list of available options.
Step 2: Deploy the NATS clusterβ
Apply the manifest and verify that the deployment starts:
# Apply the manifest
kubectl apply -f nats.yaml
Check the cluster status (may take 1-2 minutes):
kubectl get nats
Expected output:
NAME READY AGE VERSION
example True 2m 0.10.0
Step 3: Pod verificationβ
Verify that all pods are in Running state:
kubectl get pods | grep nats
Expected output:
nats-example-0 1/1 Running 0 2m
nats-example-1 1/1 Running 0 2m
nats-example-2 1/1 Running 0 2m
With replicas: 3, you get 3 NATS pods forming a high-availability cluster with Raft consensus for JetStream.
| Prefix | Role | Count |
|---|---|---|
nats-example-* | NATS Server (messaging + JetStream) | 3 |
Step 4: Retrieve credentialsβ
NATS user passwords are stored in a Kubernetes Secret:
kubectl get secret nats-example-credentials -o json | jq -r '.data | to_entries[] | "\(.key): \(.value|@base64d)"'
Expected output:
user1: mypassword
Step 5: Connection and testingβ
Port-forward the NATS serviceβ
kubectl port-forward svc/nats-example 4222:4222 &
Publish and consume testβ
# Create a JetStream stream
nats -s nats://user1:mypassword@localhost:4222 stream add EVENTS \
--subjects "events.*" --storage file --replicas 3 --retention limits \
--max-msgs -1 --max-bytes -1 --max-age 24h --discard old
# Publish a message
nats -s nats://user1:mypassword@localhost:4222 pub events.test "Hello Hikube!"
# Consume the message
nats -s nats://user1:mypassword@localhost:4222 stream view EVENTS
Expected output:
[1] Subject: events.test Received: 2025-01-15T10:30:00Z
Hello Hikube!
If you don't have the NATS CLI, you can install it from nats-io/natscli.
Step 6: Quick troubleshootingβ
Pods in CrashLoopBackOffβ
# Check the logs of the failing pod
kubectl logs nats-example-0
# Check the pod events
kubectl describe pod nats-example-0
Common causes: insufficient memory (resources.memory too low), JetStream volume full (jetstream.size too low).
NATS not accessibleβ
# Check that the services exist
kubectl get svc | grep nats
# Check the NATS service
kubectl describe svc nats-example
Common causes: port-forward not active, wrong port (4222 for clients), incorrect credentials.
JetStream not workingβ
# Check JetStream status in the logs
kubectl logs nats-example-0 | grep -i jetstream
# Check the JetStream report
nats -s nats://user1:mypassword@localhost:4222 server report jetstream
Common causes: jetstream.enabled: false in the manifest, insufficient JetStream storage space, not enough replicas for the requested replication factor.
General diagnostic commandsβ
# Recent events in the namespace
kubectl get events --sort-by=.metadata.creationTimestamp
# Detailed NATS cluster status
kubectl describe nats example
Step 7: Cleanupβ
To delete the test resources:
kubectl delete -f nats.yaml
This action deletes the NATS cluster and all associated data. This operation is irreversible.
Summaryβ
You have deployed:
- A NATS cluster with 3 replicas in high availability
- JetStream enabled for message persistence
- An authenticated user to connect to the cluster
- Persistent storage for data durability
Next stepsβ
- API Reference: Full configuration of all NATS options
- Overview: Detailed architecture and NATS use cases on Hikube