Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在同一个Kubernetes吊舱中将所有流量从一个集装箱路由到另一个集装箱?_Node.js_Docker_Nginx_Kubernetes_Amazon Eks - Fatal编程技术网

Node.js 如何在同一个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

我正在创建一个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舱单-为简洁而编辑

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