documentation.suse.com / Documentação do SUSE Edge / Integração de terceiros / NATS

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:

  1. Versão de alta disponibilidade do NATS Statefulset com três contêineres: servidor NATS, recarregador de configurações e sidecars de métricas.

  2. Contêiner NATS box, que vem com um conjunto de utilitários do NATS que são usados para verificar a configuração.

  3. 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
  1. Crie uma assinatura para a entidade de teste:

    nats sub test &
  2. 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
Nota
Nota

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.

Nota
Nota

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://
Nota
Nota

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
Documentation survey