在Kubernetes中,从React前端应用程序向Node JS后端应用程序发出API请求的推荐方法是什么?它们都托管在同一个容器上,dockerfile如下:
COPY frontend/package.json .
COPY frontend/yarn.lock .
RUN npm install
COPY frontend/tsconfig.json .
COPY frontend/src ./src
COPY frontend/public/ ./public
WORKDIR /app/backend
COPY backend/package.json .
RUN npm install
COPY backend/index.js .
COPY backend/controllers ./controllers
COPY backend/models ./models
COPY backend/routes ./routes
EXPOSE 3000
EXPOSE 3001
WORKDIR /app/frontend
RUN npm run build
RUN npm install -g serve
WORKDIR /app
RUN mkdir newImages
RUN mkdir exportedData
COPY image/* newImages/
COPY startup.sh /app
CMD /app/startup.sh
startup.sh导航到前端和后端文件夹并启动两个服务器。在我的机器上本地运行这些程序运行得很好,api请求也能正确通过。然而,当我部署到Kubernetes时,浏览器发出的API请求都会超时。我尝试使用pod的友好名称-因此这些请求被发送到http://podname:PORT/api/XXX。如果我执行到pod中并通过curl运行请求,api请求就可以正常工作。类似地,如果我使用LoadBalancer公开API端口并替换"podname";使用硬编码的外部IP服务,一切都可以正常工作。然而,这不是一个可行的长期解决方案,因为外部IP可以很容易地改变,如果pod down/重新启动。
是否有一些简单的方法可以通过前端的代理正确路由这些请求,或者我需要设置一个NGINX控制器来处理这里的一切?我认为问题是React直接在我访问前端的浏览器中运行-导致请求来自我的计算机,这意味着IP不能正确解析(甚至不能访问,因为友好的名称解析为内部集群IP)
任何帮助将不胜感激!
2;
-
不能使用pod名连接集群外的服务。这是因为pod名称是DNS名称,它被解析为集群内部的IP地址,并且无法从外部访问该子网。而你不应该使用pod名称从外部连接到您的pod,这就是服务的作用。因为一旦您的应用程序增长到更大的规模(100个pod),就不可能在客户端维护pod名称。
-
LoadBalancer
服务类型,你的设计将非常好工作。你不必再担心IP地址的变化和不能"映射到pod"了。这是因为您的pod是由服务连接的。即使您的LoadBalancer
IP地址不断变化,此服务与您的pod之间的连接也是一致的。所有这些将改变的是您将连接到Service
对象的方式。服务和它的pod之间的内部连接根本不是你所关心的。
另外,请注意,以这种方式设计应用程序是一个非常糟糕的主意,其中两个独立的逻辑组件位于同一个容器上。这是一个纯粹的单片设计,很难扩展和维护。一开始,你甚至不应该使用不同的容器,而应该使用不同的pod。没有问题,因为在Kubernetes中所有pod都可以透明地相互通信,不需要额外的配置。
理想情况下,你必须设置两个不同的服务,它们将相互连接。
底线是,没有必要设置一个代理直接连接您的pod到您的客户端。相反,只需使用LoadBalancer
类型的服务,该服务公开客户机可以使用的端点。并且无需担心更改外部ip。如果您在内部使用应用程序,则可以固定一个易于使用的私有IP地址。如果您要将此应用程序部署到更大的规模,您真的需要重新考虑您的设计,并投资于静态公共IP地址。