29 NATS #
NATS é uma tecnologia de conectividade criada para o mundo cada vez mais hiperconectado. É uma tecnologia única que permite que os aplicativos se comuniquem com segurança em qualquer combinação de fornecedores de nuvem, no local, computação distribuída, Web e dispositivos móveis. O NATS consiste em uma família de produtos de código aberto que são fortemente integrados, mas podem ser implantados de forma fácil e independente. O NATS é usado globalmente por milhares de empresas, abrangendo casos de uso que incluem microsserviços, computação distribuída, dispositivos móveis e IoT, e pode ser usado para aumentar ou substituir o sistema de mensagens tradicional.
29.1 Arquitetura #
O NATS é uma infraestrutura que permite a troca de dados entre aplicativos na forma de mensagens.
29.1.1 Aplicativos clientes do NATS #
As bibliotecas de cliente do NATS podem ser usadas para permitir que os aplicativos publiquem, assinem, solicitem e respondam entre diferentes instâncias.
Esses aplicativos são geralmente chamados de client applications.
29.1.2 Infraestrutura de serviço NATS #
Os serviços NATS são fornecidos por um ou mais processos de servidor NATS que são configurados para se interconectarem e fornecerem uma infraestrutura de serviço NATS. A infraestrutura de serviço NATS pode escalar de um único processo de servidor NATS em execução em um dispositivo final até um supercluster global público de muitos clusters abrangendo todos os principais provedores de nuvem e todas as regiões do mundo.
29.1.3 Design de mensagens simples #
O NATS facilita a comunicação entre aplicativos por meio do envio e recebimento de mensagens. Essas mensagens são endereçadas e identificadas por strings de assunto e não dependem da localização na rede. Os dados são codificados e estruturados como uma mensagem e enviados por um publicador. A mensagem é recebida, decodificada e processada por um ou mais assinantes.
29.1.4 NATS JetStream #
O NATS possui um sistema de persistência distribuído integrado chamado JetStream. O JetStream foi criado para resolver os problemas identificados com o streaming na tecnologia atual — complexidade, fragilidade e falta de escalabilidade. O JetStream também resolve o problema do acoplamento entre o publicador e o assinante (os assinantes precisam estar ativos e em execução para receber a mensagem quando ela é publicada). Mais informações sobre o NATS JetStream podem ser encontradas aqui.
29.2 Instalação #
29.2.1 Instalando o NATS sobre o K3s #
O NATS é criado para múltiplas arquiteturas, portanto, pode ser facilmente instalado no K3s. (Chapter 11, K3s)
Vamos criar um arquivo de valores para substituir os valores padrão do NATS.
cat > values.yaml <<EOF
cluster:
# Enable the HA setup of the NATS
enabled: true
replicas: 3
nats:
jetstream:
# Enable JetStream
enabled: true
memStorage:
enabled: true
size: 2Gi
fileStorage:
enabled: true
size: 1Gi
storageDirectory: /data/
EOFAgora, vamos instalar o NATS via Helm:
helm repo add nats https://nats-io.github.io/k8s/helm/charts/
helm install nats nats/nats --namespace nats --values values.yaml \
--create-namespaceCom o arquivo values.yaml acima, os seguintes componentes estarão no namespace nats:
Versão HA do Statefulset do NATS contendo três contêineres: Servidor NATS + sidecars de recarregador de configuração e métricas.
Contêiner NATS box, que vem com um conjunto de utilitários
NATSque podem ser usados para verificar a configuração.O JetStream também aproveita seu back end de chave-valor que vem com
PVCsvinculado aos pods.
29.2.1.1 Testando a configuração #
kubectl exec -n nats -it deployment/nats-box -- /bin/sh -lCrie uma assinatura para o assunto de teste:
nats sub test &Envie uma mensagem para o assunto de teste:
nats pub test hi
29.2.1.2 Limpando #
helm -n nats uninstall nats
rm values.yaml29.2.2 NATS como back end para o K3s #
Um componente que o K3s aproveita é o KINE, que é um shim que permite a substituição do etcd por back ends de armazenamento alternativos originalmente voltados para bancos de dados relacionais. Como o JetStream fornece uma API de chave-valor, isso torna possível ter o NATS como um back end para o cluster K3s.
Existe um PR já mesclado que torna o NATS incorporado no K3s simples, mas a alteração ainda não está incluída nas versões do K3s.
Por esse motivo, o binário do K3s deve ser compilado manualmente.
29.2.2.1 Compilando o K3s #
git clone --depth 1 https://github.com/k3s-io/k3s.git && cd k3sO comando a seguir adiciona nats nas tags de compilação para habilitar o recurso incorporado do NATS no K3s:
sed -i '' 's/TAGS="ctrd/TAGS="nats ctrd/g' scripts/build
make localSubstitua <node-ip> pelo IP real do nó onde o K3s será iniciado:
export NODE_IP=<node-ip>
sudo scp dist/artifacts/k3s-arm64 ${NODE_IP}:/usr/local/bin/k3sCompilar o K3s localmente requer o plugin buildx da CLI do Docker.
Ele pode ser instalado manualmente se $ make local falhar.
29.2.2.2 Instalando a CLI do NATS #
TMPDIR=$(mktemp -d)
nats_version="nats-0.0.35-linux-arm64"
curl -o "${TMPDIR}/nats.zip" -sfL https://github.com/nats-io/natscli/releases/download/v0.0.35/${nats_version}.zip
unzip "${TMPDIR}/nats.zip" -d "${TMPDIR}"
sudo scp ${TMPDIR}/${nats_version}/nats ${NODE_IP}:/usr/local/bin/nats
rm -rf ${TMPDIR}29.2.2.3 Executando o NATS como back end do K3s #
Vamos ssh no nó e executar o K3s com a flag --datastore-endpoint apontando para nats.
O comando abaixo inicia o K3s como um processo em primeiro plano, para que os logs possam ser facilmente acompanhados para ver se há algum problema.
Para não bloquear o terminal atual, uma flag & pode ser adicionada antes do comando para iniciá-lo como um processo em segundo plano.
k3s server --datastore-endpoint=nats://Para tornar o servidor K3s com o back end NATS permanente na sua slemicro VM, o script abaixo pode ser executado, o qual cria um serviço systemd com as configurações necessárias.
export INSTALL_K3S_SKIP_START=false
export INSTALL_K3S_SKIP_DOWNLOAD=true
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server \
--datastore-endpoint=nats://" sh -29.2.2.4 Solução de problemas #
Os comandos a seguir podem ser executados no nó para verificar se tudo com o stream funciona corretamente:
nats str report -a
nats str view -a