Node.js 如何在同一个Kubernetes吊舱中将所有流量从一个集装箱路由到另一个集装箱?
我正在创建一个web应用程序,它由React前端和node.js express服务器组成。前端对express server进行内部api调用,然后express server进行外部api调用以收集一些数据。前端和服务器位于同一Kubernetes吊舱内的不同容器中 前端服务是一个nginx:1.14.0-alpine映像。静态文件是在CI管道中构建的npm build,构建目录在docker构建期间复制到映像中。package.json包含一个代理密钥proxy:http://localhost:8080,它将流量从应用程序路由到localhost:8080,这是express服务器正在侦听内部api调用的端口。我认为,一旦文件被打包成静态文件并提供到nginx映像上,代理密钥就没有意义了 在本地运行时,即运行npm start而不是npm build,这一切都可以正常工作。express服务器接收前端在端口8080上发送的api请求 express服务器是一个简单的服务,它将身份验证添加到前端进行的api调用中,仅此而已。但是身份验证依赖于秘密作为环境变量,这使得它们与React不兼容。通过运行node server.js启动服务器;在本地,服务器服务成功地侦听app.listen8080到来自React前端的api调用,向请求添加一些身份验证,然后向外部api发出请求,并在收到响应后将其传递回前端 在生产中,在Kubernetes吊舱中,事情并不是那么简单。React前端通过节点服务器代理的流量现在需要由kubernetes处理,我还没有弄清楚 可能需要注意的是,在任何情况下,前端都不会直接进行任何外部api调用,它们都将通过服务器进行 React前端Dockerfile 快速节点服务器 Kubernetes舱单-为简洁而编辑Node.js 如何在同一个Kubernetes吊舱中将所有流量从一个集装箱路由到另一个集装箱?,node.js,docker,nginx,kubernetes,amazon-eks,Node.js,Docker,Nginx,Kubernetes,Amazon Eks,我正在创建一个web应用程序,它由React前端和node.js express服务器组成。前端对express server进行内部api调用,然后express server进行外部api调用以收集一些数据。前端和服务器位于同一Kubernetes吊舱内的不同容器中 前端服务是一个nginx:1.14.0-alpine映像。静态文件是在CI管道中构建的npm build,构建目录在docker构建期间复制到映像中。package.json包含一个代理密钥proxy:http://localh
apiVersion: apps/v1beta1
kind: Deployment
containers:
- name: frontend
image: frontend-image:1.0.0
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- mountPath: /etc/nginx/conf.d/default.conf
name: config-dir
subPath: my-config.conf
- name: server
image: server-image:1.0.0
imagePullPolicy: IfNotPresent
volumes:
- name: config-tmpl
configMap:
name: app-config
defaultMode: 0744
- name: my-config-directory
emptyDir: {}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: my-namespace
data:
my-conf.conf: |-
server {
listen 80;
server_name _;
location api/ {
proxy_pass http://127.0.0.1:8080/;
}
.....
在Kubernetes中,pod与其中的所有容器共享相同的网络接口,因此对于前端容器localhost:8080是后端,对于后端容器localhost:80是前端。 对于任何容器应用程序,如果需要来自外部的流量,则应确保它们在127.0.0.1以外的其他接口中侦听 将应用程序从一台服务器(其中每个应用程序都从127.0.0.1进行通信)迁移到一个pod是为了像在专用机器中一样简单 您的nginx.conf看起来有点奇怪,应该是location/api/{ 以下是功能示例: nginx.conf 创建此配置映射: app.js Dockerfile 您可以创建此图像或使用我制作的hectorvido/express 然后,创建pod YAML定义: 豆荚 在群集上放置:
kubectl create -f pod.yml
获取IP:
kubectl get pods -o wide
我使用Minikube进行了测试,因此如果pod IP为172.17.0.7,我必须:
米尼库贝宋承宪
旋度-L 172.17.0.7/api
如果前面有一个入口,它应该还能工作。我在minikube上启用了一个nginx入口控制器,所以我们需要创建一个服务和入口:
服务
kubectl暴露吊舱前后-端口80
安格尔
测试仍然有效:
旋度-vLhttp://fb.192-168-39-163.nip.io/api/
在Kubernetes中,pod与其中的所有容器共享相同的网络接口,因此对于前端容器localhost:8080是后端,对于后端容器localhost:80是前端。 对于任何容器应用程序,如果需要来自外部的流量,则应确保它们在127.0.0.1以外的其他接口中侦听 将应用程序从一台服务器(其中每个应用程序都从127.0.0.1进行通信)迁移到一个pod是为了像在专用机器中一样简单 您的nginx.conf看起来有点奇怪,应该是location/api/{ 以下是功能示例: nginx.conf 创建此配置映射: app.js Dockerfile 您可以创建此图像或使用我制作的hectorvido/express 然后,创建pod YAML定义: 豆荚 在群集上放置:
kubectl create -f pod.yml
获取IP:
kubectl get pods -o wide
我使用Minikube进行了测试,因此如果pod IP为172.17.0.7,我必须:
米尼库贝宋承宪
旋度-L 172.17.0.7/api
如果前面有一个入口,它应该还能工作。我在minikube上启用了一个nginx入口控制器,所以我们需要创建一个服务和入口:
服务
kubectl暴露吊舱前后-端口80
安格尔
测试仍然有效:
旋度-vLhttp://fb.192-168-39-163.nip.io/api/
127.0.0.1:8080不是express服务器的地址,因为前端docker容器中的8080端口上没有运行任何内容。您需要对其中一个express服务器pod的地址执行代理传递。因为所有p
ods有一个DNS地址,这可以简单到http://..svc.cluster.locaThe 前端应用程序最终在用户的浏览器中运行;这怎么知道要联系Express server?127.0.0.1:8080不是Express server的地址,因为前端docker容器中的8080端口上没有运行任何内容。您需要向其中一个express服务器吊舱的地址执行代理传递。由于所有的pod都有一个DNS地址,所以这可能非常简单http://..svc.cluster.locaThe 前端应用程序最终在用户的浏览器中运行;他怎么知道要联系快递服务人员?嘿,赫克托,我把这个答案标记为正确,因为我相信它对我问的问题是正确的,但是,它对我不起作用。我忘记了我有一个Kong入口来处理我的命名空间中的流量,因为上面的方法不起作用,所以我用它来路由流量——我现在让它起作用了。感谢您花时间回答!:哼对于ingress,过程是相同的,如果您愿意,我可以在上面的示例中添加一个ingress,但是Minikube使用nginx-应该是相同的函数。不过,我设法让它与Kong ingress一起工作,谢谢。虽然我不完全明白为什么我不能让它与nginxStrange一起工作。。。即使有入口,它仍然在这里工作:/I将更新答案。也许一些注释可以解决问题,甚至可以在nginx.conf上用斜杠或不用斜杠重定向。Hey Hector,我将这个答案标记为正确,因为我相信它对我提出的问题是正确的,但是,它对我不起作用。我忘记了我有一个Kong入口来处理我的命名空间中的流量,因为上面的方法不起作用,所以我用它来路由流量——我现在让它起作用了。感谢您花时间回答!:哼对于ingress,过程是相同的,如果您愿意,我可以在上面的示例中添加一个ingress,但是Minikube使用nginx-应该是相同的函数。不过,我设法让它与Kong ingress一起工作,谢谢。虽然我不完全明白为什么我不能让它与nginxStrange一起工作。。。即使有入口,它仍然在这里工作:/I将更新答案。也许一些注释会解决问题,甚至会在nginx.conf上使用或不使用斜杠重定向。
const express = require('express')
const app = express()
const port = 8080
app.get('/', (req, res) => res.send('Hello from Express!'))
app.listen(port, () => console.log(`Example app listening on port ${port}!`))
FROM alpine
RUN apk add nodejs npm && mkdir -p /app
COPY . /app
WORKDIR /app
RUN npm install express --save
EXPOSE 8080
CMD node app.js
apiVersion: v1
kind: Pod
metadata:
name: front-back
labels:
app: front-back
spec:
containers:
- name: front
image: nginx:alpine
volumeMounts:
- name: nginx-conf
mountPath: /etc/nginx/conf.d/
ports:
- containerPort: 80
- name: back
image: hectorvido/express
ports:
- containerPort: 8080
volumes:
- name: nginx-conf
configMap:
name: nginx
kubectl create -f pod.yml
kubectl get pods -o wide
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: front-back
spec:
rules:
- host: fb.192-168-39-163.nip.io # minikube ip
http:
paths:
- path: /
backend:
serviceName: front-back
servicePort: 80