|Index|SUSE Edge Documentação|Integração com terceiros|NATS
Applies to SUSE Edge 3.6

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/
EOF

Agora, 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-namespace

Com o arquivo values.yaml acima, os seguintes componentes estarão no namespace nats:

  1. Versão HA do Statefulset do NATS contendo três contêineres: Servidor NATS + sidecars de recarregador de configuração e métricas.

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

  3. O JetStream também aproveita seu back end de chave-valor que vem com PVCs vinculado aos pods.

29.2.1.1 Testando a configuração

kubectl exec -n nats -it deployment/nats-box -- /bin/sh -l
  1. Crie uma assinatura para o assunto de teste:

    nats sub test &
  2. Envie uma mensagem para o assunto de teste:

    nats pub test hi

29.2.1.2 Limpando

helm -n nats uninstall nats
rm values.yaml

29.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 k3s

O 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 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
Note
Note

Compilar 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.

Note
Note

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

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