es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Configuración de despliegue de Kubernetes para conectarse al bus de eventos NATS.

Antes usaba Nats Streaming para mis microservicios basados en Docker y Kubernetes y node.js, pero como Nats Streaming está actualmente en desuso, quiero migrar a NATS y NATS JetStream.

Este es el archivo de configuración yaml de implementación que usé para el servidor NATS Streaming en mi carpeta k8s, que está siendo utilizado por skaffold para aplicarlo y funciona bien:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nats-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nats
  template:
    metadata:
      labels:
        app: nats
    spec:
      containers:
        - name: nats
          image: nats-streaming:0.23.2
          args:
            [
              '-p',
              '4222',
              '-m',
              '8222',
              '-hbi',
              '5s',
              '-hbt',
              '5s',
              '-hbf',
              '2',
              '-SD',
              '-cid',
              'adrian',
            ]
---
apiVersion: v1
kind: Service
metadata:
  name: nats-srv
spec:
  selector:
    app: nats
  ports:
    - name: client
      protocol: TCP
      port: 4222
      targetPort: 4222
    - name: monitoring
      protocol: TCP
      port: 8222
      targetPort: 8222

Mi clúster se llama adrian y puedo conectarme al servidor NATS Streaming como cliente de esta manera en mi aplicación node.js:

import nats from 'node-nats-streaming';

const stan = nats.connect( 'adrian', 'abc', {
  url: "http://localhost:4222"
} );

Ahora quiero migrar a NATS y NATS JetStream. Por lo tanto, cambié mi configuración de implementación de Kubernetes a lo siguiente:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nats-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nats
  template:
    metadata:
      labels:
        app: nats
    spec:
      containers:
        - name: nats
          image: nats
          args:
            [
              '-p',
              '4222',
              '-m',
              '8222',
              '-D',
              '-js',
              '--cluster_name',
              'adrian',
            ]
---
apiVersion: v1
kind: Service
metadata:
  name: nats-srv
spec:
  selector:
    app: nats
  ports:
    - name: client
      protocol: TCP
      port: 4222
      targetPort: 4222
    - name: monitoring
      protocol: TCP
      port: 8222
      targetPort: 8222

Y cuando intento conectarme al servidor NATS con el nuevo método connect de NATS client de esta manera:

import { connect } from 'nats';

const natsPublisher = async () => {
  try {
    const nc = await connect( { servers: "http://localhost:4222" } );
    console.log(`connected to ${nc.getServer()}`);
  } catch ( error ) {
    console.log( '--- NATS ERROR:', error )
  }
}

natsPublisher();

Obtengo este error en la terminal:

--- NATS ERROR:  NatsError: CONNECTION_REFUSED
    at Function.errorForCode (E:\Projects\express-projects\adrian-microservices\nats-test\node_modules\nats\nats-base-client\error.ts:119:12)
    at NodeTransport.<anonymous> (E:\Projects\express-projects\adrian-microservices\nats-test\node_modules\nats\src\node_transport.ts:92:21)
    at Generator.throw (<anonymous>)
    at rejected (E:\Projects\express-projects\adrian-microservices\nats-test\node_modules\nats\lib\src\node_transport.js:6:65)
    at processTicksAndRejections (node:internal/process/task_queues:96:5) {
  code: 'CONNECTION_REFUSED',
  chainedError: Error: connect ECONNREFUSED 127.0.0.1:4222
      at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1161:16) {
    errno: -4078,
    code: 'ECONNREFUSED',
    syscall: 'connect',
    address: '127.0.0.1',
    port: 4222
  }
}

Entonces, ¿cómo puedo resolver el problema y conectarme a NATS sin ningún problema?

Cualquier ayuda sería apreciada.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Según el mensaje de error, parece que se está rechazando la conexión entre el cliente y el servidor de NATS. Puede intentar seguir los siguientes pasos para resolver el problema:

    1. Asegúrese de que la implementación del servidor de NATS esté en marcha revisando los registros o el estado de la implementación.
    2. Verifique que el servidor de NATS esté escuchando en el puerto 4222 ejecutando el comando netstat en la cápsula:

      kubectl exec <nombre-de-la-cápsula-de-nats> -- netstat -tulpn | grep 4222
      

      Esto le mostrará el proceso que escucha en el puerto 4222. Si el servidor de NATS no está escuchando en el puerto 4222, debe actualizar la configuración de la implementación y reiniciarla.

    3. Revise las políticas de red en su clúster de Kubernetes para ver si hay alguna restricción en la comunicación entre el cliente y el servidor de NATS.

    4. Verifique las reglas del firewall en la máquina host o el clúster para ver si hay alguna regla que bloquee la comunicación entre el cliente y el servidor de NATS.

    5. Verifique de nuevo la URI del servidor de NATS para asegurarse de que sea correcta.

    6. Si todo lo demás falla, intente usar una biblioteca o versión diferente del cliente de NATS para ver si persiste el problema.

    Espero que estas sugerencias le ayuden a resolver el problema de conectividad y conectarse con éxito a NATS.</nombre-de-la-cápsula-de-nats>

Comments are closed.