¿Axios en un contenedor Node.js en Kubernetes devuelve “ECONNREFUSED 127.0.0.1:30561”?

¿Axios en un contenedor Node.js en Kubernetes devuelve “ECONNREFUSED 127.0.0.1:30561”?

Mensaje de error completo:connect ECONNREFUSED 127.0.0.1:30561 at TCPConnectWrap.afterConnect

La solicitud de axios se ejecuta en un entorno Node.js (Next.js), que es donde ocurre el error, extrañamente la solicitud de axios funciona perfectamente bien cuando se ejecuta en el navegador.

Mi componente (que se ejecuta en Node.js) que llama axios:

import axios from 'axios'
import Router from 'next/router'
import React, { Component } from 'react'
import { initializeStore } from '~/reducers'
import { authenticate } from '~/actions/auth'
import { getCookieByName } from '~/helpers/cookie'

const isServer = typeof window === 'undefined'
const __NEXT_REDUX_STORE__ = '__NEXT_REDUX_STORE__'

function getOrCreateStore(initialState) {
    // Always make a new store if server, otherwise state is shared between requests
    if (isServer) {
        return initializeStore(initialState)
    }
    // Create store if unavailable on the client and set it on the window object
    if (!window[__NEXT_REDUX_STORE__]) {
        window[__NEXT_REDUX_STORE__] = initializeStore(initialState)
    }
    return window[__NEXT_REDUX_STORE__]
}

export default App => {
    return class AppWithRedux extends Component {
        static async getInitialProps(appContext) {

            const reduxStore = getOrCreateStore()

            appContext.ctx.reduxStore = reduxStore

            let appProps = {}

            if (typeof App.getInitialProps === 'function') {
                appProps = await App.getInitialProps(appContext)
            }

            const JWT = (isServer ? getCookieByName('JWT', appContext.ctx.req.headers.cookie) : getCookieByName('JWT', document.cookie))

            const pathname = appContext.ctx.pathname

            //set axios baseURL
            axios.defaults.baseURL = (isServer ? `${appContext.ctx.req.headers['x-forwarded-proto']}://${appContext.ctx.req.headers.host}` : window.location.origin)

            //if user has a JWT
            if(JWT){
                axios.defaults.headers.common['Authorization'] = `Bearer ${JWT}`
                //get user from API layer
                reduxStore.dispatch(authenticate())
            } 


            return {
                ...appProps,
                initialReduxState: reduxStore.getState()
            }
        }

        constructor(props) {
            super(props)
            this.reduxStore = getOrCreateStore(props.initialReduxState)
        }

        render() {
            return <App {...this.props} reduxStore={this.reduxStore} />
        }
    }
}

EspecíficamentereduxStore.dispatch(authenticate())

Y mi llamada axios real (usando el procesador redux), mirando el authenticatemétodo:

import axios from 'axios'
import { setCookieByName } from '~/helpers/cookie'

const BASE_URL = '/api/auth'
export const TYPE_REGISTER = 'TYPE_REGISTER'
export const TYPE_AUTHENTICATE = 'TYPE_AUTHENTICATE'

export const register = values => (dispatch) => {
    return axios.post(`${BASE_URL}/register`, values)
        .then(function({data: {token, user}}){
            setCookieByName('JWT', token, 365)
            dispatch({
                type: TYPE_REGISTER,
                payload: user
            })
        })
}

export const authenticate = () => (dispatch) => {
    return axios.post(`${BASE_URL}/me`)
        .then(function({data: {user}}){
            dispatch({
                type: TYPE_AUTHENTICATE,
                payload: user
            })
        })
        .catch(function(err){
            console.log(err)
            dispatch({
                type: TYPE_AUTHENTICATE,
                payload: {}
            })
        })
}

Estoy ejecutando mi clúster de Kubernetes local usando Docker para Mac y se accede a mi controlador Ingress en http://kludge.info:30561. Mi dominio está asignado 127.0.0.1 kludge.infolocalmente para permitir que el controlador de Ingress acceda al contenedor. Mi teoría es que cuando envío una solicitud, http://kludge.info:30561/api/auth/mepor ejemplo, el contenedor acoplable que ejecuta la aplicación Node.js cree que es una solicitud a localhost (dentro del contenedor) y genera un error de conexión. Tenga en cuenta que la aplicación Node.js dentro del contenedor se ejecuta en http://localhost:8080. Básicamente, estoy ejecutando localhost en mi máquina y localhost dentro de la instancia de Node. ¿Cómo podría enviar una solicitud al exterior http://kludge.info:30561/donde se está ejecutando el controlador de Ingress?

También configuré baseURLen axios, pero no resuelve el problema. Mi controlador de entrada tiene una ruta /apique apuntará a una instancia de PHP, por lo que necesito que mi llamada axios de Node.js llegue a eso dentro de su contenedor. Cualquier ayuda sería muy apreciada.

Cuando ejecuté mi clúster K8 en Minikube no tuve este problema; sin embargo, minikube le proporciona la IP de la VM, mientras que Docker for Desktop la usa localhostdirectamente en su máquina.

información relacionada