Axios em um contêiner Node.js no Kubernetes está retornando “ECONNREFUSED 127.0.0.1:30561”?

Axios em um contêiner Node.js no Kubernetes está retornando “ECONNREFUSED 127.0.0.1:30561”?

Mensagem de erro completa:connect ECONNREFUSED 127.0.0.1:30561 at TCPConnectWrap.afterConnect

A solicitação axios está sendo executada em um ambiente Node.js (Next.js), que é onde ocorre o erro, estranhamente a solicitação axios funciona perfeitamente quando está sendo executada no navegador.

Meu componente (rodando em Node.js) que chama 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} />
        }
    }
}

EspecificamentereduxStore.dispatch(authenticate())

E minha chamada real de axios (usando redux thunk), observando o 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: {}
            })
        })
}

Estou executando meu cluster Kubernetes local usando Docker para Mac e meu controlador Ingress está sendo acessado no http://kludge.info:30561. Meu domínio é mapeado 127.0.0.1 kludge.infolocalmente para permitir que o controlador do Ingress atinja o contêiner. Minha teoria é que quando envio uma solicitação, http://kludge.info:30561/api/auth/mepor exemplo, o contêiner docker que executa o aplicativo Node.js pensa que é uma solicitação para localhost (dentro do contêiner) e resulta em um erro de conexão. Observe que o aplicativo Node.js dentro do contêiner está sendo executado no http://localhost:8080. Basicamente estou executando localhost na minha máquina e localhost dentro da instância do Node. Como posso enviar uma solicitação para fora de http://kludge.info:30561/onde o controlador do Ingress está sendo executado.

Também configurei o baseURLin axios, mas não resolve o problema. Meu controlador de entrada tem um caminho /apique apontará para uma instância PHP, então preciso que minha chamada de axios do Node.js atinja isso dentro de seu contêiner. Qualquer ajuda seria muito apreciada.

Quando executei meu cluster K8 no Minikube não tive esse problema, porém o minikube fornece o IP da VM, enquanto o Docker for Desktop usa localhostdiretamente na sua máquina.

informação relacionada