32 NATS #
NATS é uma tecnologia conectiva projetada para o mundo cada vez mais hiperconectado. Trata-se de uma tecnologia única que permite que os aplicativos se comuniquem de forma segura com qualquer combinação de fornecedores de nuvem, ambientes locais e dispositivos de borda, web e móveis. O NATS consiste em uma família de produtos de código-fonte aberto estreitamente integrados, mas que podem ser implantados com facilidade e de modo independente. O NATS é usado mundialmente por milhares de empresas, atendendo a casos de uso como microsserviços, computação de borda, dispositivos móveis e IoT, e pode ser usado para expandir ou substituir o serviço de mensagens tradicional.
32.1 Arquitetura #
O NATS é uma infraestrutura que permite a troca de dados entre aplicativos na forma de mensagens.
32.1.1 Aplicativos clientes do NATS #
É possível usar as bibliotecas de clientes do NATS para permitir que os
aplicativos publiquem, assinem, solicitem e respondam entre instâncias
diferentes. Esses aplicativos costumam ser chamados de aplicativos
clientes
.
32.1.2 Infraestrutura de serviço do NATS #
Os serviços do NATS são fornecidos por um ou mais processos do servidor NATS, que são configurados para interconexão uns com os outros e oferecem a infraestrutura de serviço do NATS, que pode ajustar a escala de um único processo do servidor NATS executado em um dispositivo de endpoint para um supercluster público global com muitos clusters, envolvendo todos os principais provedores de nuvem de todas as regiões do mundo.
32.1.3 Design de mensagens simples #
O NATS facilita a comunicação dos aplicativos ao enviar e receber mensagens. Essas mensagens são endereçadas e identificadas por strings de assunto e não dependem do local da 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 subscritores.
32.1.4 NATS JetStream #
O NATS tem um sistema de persistência distribuída incorporado chamado JetStream. O JetStream foi criado para solucionar os problemas de transmissão identificados nas tecnologias atuais: complexidade, fragilidade e falta de escalabilidade. O JetStream também soluciona o problema de acoplamento entre publicador e subscritor (os subscritores precisam estar em funcionamento para receber a mensagem quando ela for publicada). Há mais informações sobre o NATS JetStream aqui.
32.2 Instalação #
32.2.1 Instalando o NATS no K3s #
O NATS foi projetado para várias arquiteturas para ser facilmente instalado no K3s (Capítulo 15, 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/
EOF
Agora vamos instalar o NATS pelo Helm:
helm repo add nats https://nats-io.github.io/k8s/helm/charts/
helm install nats nats/nats --namespace nats --values values.yaml \
--create-namespace
Com o arquivo values.yaml
acima, os seguintes componentes
estarão no namespace nats
:
Versão de alta disponibilidade do NATS Statefulset com três contêineres: servidor NATS, recarregador de configurações e sidecars de métricas.
Contêiner NATS box, que vem com um conjunto de utilitários do
NATS
que são usados para verificar a configuração.O JetStream também aproveita o back end de chave-valor incluído nos
PVCs
vinculados aos pods.
32.2.1.1 Testando a configuração #
kubectl exec -n nats -it deployment/nats-box -- /bin/sh -l
Crie uma assinatura para a entidade de teste:
nats sub test &
Envie uma mensagem para a entidade de teste:
nats pub test hi
32.2.1.2 Limpando #
helm -n nats uninstall nats
rm values.yaml
32.2.2 NATS como back end para K3s #
Um componente que o K3s usa é o KINE, um shim que permite a substituição do etcd por back ends de armazenamento alternativos originalmente destinados a bancos de dados relacionais. Como o JetStream fornece uma API de chave-valor, é possível usar o NATS como back end para o cluster K3s.
Já existe uma PR mesclada que simplifica o NATS incorporado no K3s, 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 criado manualmente.
32.2.2.1 Criando o K3s #
git clone --depth 1 https://github.com/k3s-io/k3s.git && cd k3s
O seguinte comando adiciona o nats
às tags de build para
habilitar o recurso NATS incorporado no K3s:
sed -i '' 's/TAGS="ctrd/TAGS="nats ctrd/g' scripts/build
make local
Substitua <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/k3s
A criação local do K3s requer o plug-in buildx Docker CLI. Ele pode ser
manualmente
instalado em caso de falha no $ make local
.
32.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}
32.2.2.3 Executando o NATS como back end do K3s #
Vamos acessar o nó por ssh
e executar o K3s com o
sinalizador --datastore-endpoint
apontando para
nats
.
O comando a seguir inicia o K3s como um processo em primeiro plano, assim é
possível acompanhar os registros facilmente para ver se há problemas. Para
não bloquear o terminal atual, adicione o sinalizador
&
antes do comando para iniciá-lo como um processo em
segundo plano.
k3s server --datastore-endpoint=nats://
Para tornar o servidor K3s com o NATS como back end permanente em sua VM
slemicro
, execute o script abaixo para criar 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 -
32.2.2.4 Solução de problemas #
É possível executar os seguintes comandos no nó para verificar se tudo funciona corretamente com o fluxo:
nats str report -a
nats str view -a