Kubernetes의 Node.js 컨테이너에 있는 Axios가 "ECONNREFUSED 127.0.0.1:30561"을 반환합니까?

Kubernetes의 Node.js 컨테이너에 있는 Axios가 "ECONNREFUSED 127.0.0.1:30561"을 반환합니까?

전체 오류 메시지:connect ECONNREFUSED 127.0.0.1:30561 at TCPConnectWrap.afterConnect

axios 요청은 오류가 발생하는 Node.js 환경(Next.js)에서 실행되고 있는데, 이상하게도 axios 요청이 브라우저에서 실행될 때 완벽하게 작동합니다.

axios를 호출하는 내 구성 요소(Node.js에서 실행):

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

구체적으로reduxStore.dispatch(authenticate())

그리고 내 실제 axios 호출(redux 썽크 사용)에서 authenticate메서드를 살펴봅니다.

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: {}
            })
        })
}

Mac용 Docker를 사용하여 로컬 Kubernetes 클러스터를 실행 중이고 Ingress 컨트롤러가 http://kludge.info:30561. 내 도메인은 127.0.0.1 kludge.infoIngress 컨트롤러가 컨테이너에 도달할 수 있도록 로컬 에서 매핑됩니다 . 내 이론은 예를 들어 요청을 보낼 때 http://kludge.info:30561/api/auth/meNode.js 앱을 실행하는 Docker 컨테이너가 그것이 localhost(컨테이너 내부)에 대한 요청이라고 생각하고 연결 오류가 발생한다는 것입니다. 컨테이너 내부의 Node.js 앱은 에서 실행되고 있습니다 http://localhost:8080. 기본적으로 내 컴퓨터에서는 localhost를 실행하고 Node 인스턴스에서는 localhost를 실행하고 있습니다. http://kludge.info:30561/Ingress 컨트롤러가 실행되는 외부로 요청을 보내려면 어떻게 해야 합니까 ?

in axios 도 구성했지만 baseURL문제가 해결되지 않습니다. 내 수신 컨트롤러에는 PHP 인스턴스를 가리키는 경로가 있으므로 /api컨테이너 내부에서 이를 실행하려면 Node.js axios 호출이 필요합니다. 어떤 도움이라도 주시면 감사하겠습니다.

Minikube에서 K8 클러스터를 실행했을 때 이 문제가 발생하지 않았습니다. 그러나 Minikube는 VM의 IP를 제공하는 반면 Desktop for Docker는 localhost컴퓨터에서 직접 사용합니다.

관련 정보