32 NATS #
NATS es una tecnología de conectividad diseñada para un mundo cada vez más hiperconectado. Se trata de una tecnología única que permite a las aplicaciones comunicarse de forma segura a través de cualquier combinación de proveedores de la nube, instalaciones locales, dispositivos periféricos, Web y móviles. NATS consta de una familia de productos de código abierto estrechamente integrados, pero que pueden desplegarse de forma independiente y sencilla. NATS se utiliza en miles de empresas de todo el mundo y abarca casos de uso que incluyen microservicios, edge computing, dispositivos móviles e IoT. También se puede utilizar para ampliar o sustituir la mensajería tradicional.
32.1 Arquitectura #
NATS es una infraestructura que permite el intercambio de datos entre aplicaciones en forma de mensajes.
32.1.1 Aplicaciones cliente de NATS #
Las bibliotecas cliente NATS permiten que las aplicaciones publiquen, se
suscriban, soliciten y respondan entre diferentes instancias. Estas
aplicaciones se denominan generalmente aplicaciones
cliente
.
32.1.2 Infraestructura de servicios NATS #
Los servicios NATS son proporcionados por uno o varios procesos de servidor NATS configurados para interconectarse entre sí y ofrecer una infraestructura. Esta infraestructura puede escalarse desde un único proceso de servidor NATS que se ejecuta en un dispositivo final hasta un superclúster global público compuesto por muchos clústeres que abarca todos los principales proveedores de nube y todas las regiones del mundo.
32.1.3 Diseño de mensajería sencillo #
Con NATS, las aplicaciones pueden comunicarse fácilmente enviando y recibiendo mensajes. Estos mensajes se dirigen e identifican mediante cadenas de asunto y no dependen de la ubicación de la red. Los datos se cifran y se estructuran como mensajes, y son enviados por un editor. El mensaje es recibido, descifrado y procesado por uno o varios suscriptores.
32.1.4 NATS JetStream #
NATS cuenta con un sistema de persistencia distribuida integrado llamado JetStream. JetStream se creó para resolver los problemas de transmisión identificados de la tecnología actual: complejidad, fragilidad y falta de escalabilidad. JetStream también resuelve el problema del acoplamiento entre el editor y el suscriptor (los suscriptores deben estar activos y en funcionamiento para recibir el mensaje cuando se publica). Para obtener más información sobre NATS JetStream, consulte este documento.
32.2 Instalación #
32.2.1 Instalación de NATS sobre K3s #
NATS está diseñado para múltiples arquitecturas, por lo que se puede instalar fácilmente en K3s (Capítulo 15, K3s).
Vamos a crear un archivo de valores para sobrescribir los valores predeterminados de 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
Ahora, se instala NATS mediante 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
Con el archivo values.yaml
anterior, los componentes
siguientes estarán en el espacio de nombres nats
:
Una versión de alta disponibilidad de NATS Statefulset que incluye tres contenedores: el servidor de NATS, el recargador de configuración y sidecars de métricas.
Un contenedor de caja de NATS, que incluye un conjunto de utilidades
NATS
que se pueden utilizar para verificar la configuración.JetStream también aprovecha su interfaz final de clave-valor incluida con
PVC
vinculados a los pods.
32.2.1.1 Prueba de la configuración #
kubectl exec -n nats -it deployment/nats-box -- /bin/sh -l
Cree una suscripción de prueba:
nats sub test &
Envíe un mensaje de prueba:
nats pub test hi
32.2.1.2 Limpieza #
helm -n nats uninstall nats
rm values.yaml
32.2.2 NATS como interfaz final para K3s #
Uno de los componentes que aprovecha K3s es KINE, que es un shim que permite sustituir etcd por interfaces finales de almacenamiento alternativas destinadas originalmente a bases de datos relacionales. Dado que JetStream proporciona una API de clave-valor, esto hace posible utilizar NATS como interfaz final para el clúster K3s.
Ya existe una solicitud para simplificar la integración de NATS en K3s, pero los cambios aún no se han incluido en las versiones de K3s.
Por eso, el binario de K3s debe crearse manualmente.
32.2.2.1 Creación de K3s #
git clone --depth 1 https://github.com/k3s-io/k3s.git && cd k3s
El siguiente comando añade nats
en las etiquetas de
creación para habilitar la integración de NATS en K3s:
sed -i '' 's/TAGS="ctrd/TAGS="nats ctrd/g' scripts/build
make local
Sustituya <node-ip> con la IP real del nodo donde se iniciará K3s:
export NODE_IP=<node-ip>
sudo scp dist/artifacts/k3s-arm64 ${NODE_IP}:/usr/local/bin/k3s
Para crear K3s localmente se necesita el complemento buildx Docker CLI. Se
puede instalar
manualmente si $ make local
falla.
32.2.2.2 Instalación de la interfaz de línea de comandos de 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 Ejecución de NATS como interfaz final de K3s #
Vamos a usar ssh
en el nodo y a ejecutar K3s con el
indicador --datastore-endpoint
apuntando a
nats
.
El siguiente comando inicia K3s como un proceso en primer plano, por lo que
es posible consultar fácilmente en el registro si hay algún problema. Para
no bloquear el terminal actual, se puede añadir el indicador
&
antes del comando para iniciarlo como un proceso en
segundo plano.
k3s server --datastore-endpoint=nats://
Para hacer permanente el servidor K3s con la interfaz final de NATS en su
máquina virtual slemicro
, puede ejecutar el siguiente
guion, que crea un servicio systemd
con la configuración
necesaria.
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 Solución de problemas #
Los siguientes comandos se pueden ejecutar en el nodo para verificar que todo lo relacionado con la transmisión funciona correctamente:
nats str report -a
nats str view -a