Let's create a super cluster using NATS Gateways. First let's create 3 different clusters in NYC, Amsterdam, and San Francisco:
doctl kubernetes cluster create nats-k8s-nyc1 --count 3 --region nyc1doctl kubernetes cluster create nats-k8s-sfo2 --count 3 --region sfo2doctl kubernetes cluster create nats-k8s-ams3 --count 3 --region ams3
Next, open up the firewall across the 3 regions to be able to access the client, leafnode and gateways ports:
for firewall in `doctl compute firewall list | tail -n 3 | awk '{print $1}'`; dodoctl compute firewall add-rules $firewall --inbound-rules protocol:tcp,ports:4222,address:0.0.0.0/0doctl compute firewall add-rules $firewall --inbound-rules protocol:tcp,ports:7422,address:0.0.0.0/0doctl compute firewall add-rules $firewall --inbound-rules protocol:tcp,ports:7522,address:0.0.0.0/0done
For this setup, we will create a super cluster using the external IPs from the nodes of the 3 clusters. For a production type of setup, it is recommended to use a DNS entry and an A record for each one of the servers.
for ctx in do-ams3-nats-k8s-ams3 do-nyc1-nats-k8s-nyc1 do-sfo2-nats-k8s-sfo2; doecho "name: $ctx"for externalIP in `kubectl --context $ctx get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'`; doecho "- nats://$externalIP:7522";doneechodone
The Helm definition would look as follows for the 3 clusters:
# super-cluster.yamlnats:externalAccess: truelogging:debug: falsetrace: false​cluster:enabled: true​gateway:enabled: true​# NOTE: defined via --set gateway.name="$ctx"# name: $ctx​gateways:- name: do-ams3-nats-k8s-ams3urls:- nats://142.93.251.181:7522- nats://161.35.12.245:7522- nats://161.35.2.153:7522​- name: do-nyc1-nats-k8s-nyc1urls:- nats://142.93.251.181:7522- nats://161.35.12.245:7522- nats://161.35.2.153:7522​- name: do-sfo2-nats-k8s-sfo2urls:- nats://142.93.251.181:7522- nats://161.35.12.245:7522- nats://161.35.2.153:7522​natsbox:enabled: true
Let's deploy the super cluster with Helm using the name of cluster as the name of the gateway:
for ctx in do-ams3-nats-k8s-ams3 do-nyc1-nats-k8s-nyc1 do-sfo2-nats-k8s-sfo2; dohelm --kube-context $ctx install nats nats/nats -f super-cluster.yaml --set gateway.name=$ctxdone
That's it! It should now be possible to send some messages across regions:
# Start subscription in Amsterdamnats-box:~# kubectl --context do-ams3-nats-k8s-ams3 exec -it nats-box -- /bin/sh -lnats-box:~# nats-sub -s nats hello​# Send messages from San Francisco regionnats-box:~# kubectl --context do-sfo2-nats-k8s-sfo2 exec -it nats-box -- /bin/sh -lnats-box:~# nats-pub -s nats hello 'Hello World!'​# From outside of k8s can use the external IPs$ nats-sub -s 142.93.251.181 hello$ nats-pub -s 161.35.2.153 hello 'Hello World!'