【问题标题】:Setting up a React application and NodeJS backend in Kubernetes?在 Kubernetes 中设置 React 应用程序和 NodeJS 后端?
【发布时间】:2022-02-09 17:19:46
【问题描述】:

我正在尝试将示例 React 应用程序作为 Kubernetes 中的两个 pod 连接到 NodeJS 后端。这是(大部分)默认 CRA 和带有 Express 的 NodeJS 应用程序,即npx create-react-app my_app

两个应用程序分别通过yarn startnpm app.js 在本地运行良好。 React 应用程序使用package.json 中定义的代理与 NodeJS 后端通信。

反应 package.json

...
  "proxy": "http://localhost:3001/"
...

反应 Dockerfile

FROM node:10
WORKDIR /usr/src/app
COPY package*.json ./
RUN yarn
COPY . .
CMD [ "yarn", "start" ]

NodeJS Dockerfile

FROM node:10
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3001
CMD [ "node", "app.js" ]

ui-部署

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
    name: sample-ui
    namespace: my_namespace
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my_namespace
      component: sample-ui
  template:
    metadata:
      labels:
        app: my_namespace
        component: sample-ui
    spec:
      containers:
      - 
        name: sample-ui
        image: xxx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3000
          name: http
          protocol: TCP
        resources:
          limits:
            cpu: 100m
            memory: 128Mi
          requests:
            cpu: 100m
            memory: 128Mi

服务器部署

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
    name: sample-server
    namespace: my_namespace
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my_namespace
      component: sample-server
  template:
    metadata:
      labels:
        app: my_namespace
        component: sample-server
    spec:
      containers:
      - 
        name: sample-server
        image: xxx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3001
          name: http
          protocol: TCP
        resources:
          limits:
            cpu: 100m
            memory: 128Mi
          requests:
            cpu: 100m
            memory: 128Mi

ui-服务

apiVersion: v1
kind: Service
metadata:
  name: sample-ui
  namespace: my_namespace
  labels: {app: sample-ui}
spec:
  type: LoadBalancer
  selector:
    component: sample-ui
  ports:
  - name: listen
    protocol: TCP
    port: 3000

服务器服务

apiVersion: v1
kind: Service
metadata:
  name: sample-server
  namespace: my_namespace
  labels: {app: sample-server}
spec:
  selector:
    component: sample-server
  ports:
  - name: listen
    protocol: TCP
    port: 3001

这两项服务在我的系统上运行良好。

获取服务

sample-server            ClusterIP      10.19.255.171   <none>           3001/TCP                     26m
sample-ui                LoadBalancer   10.19.242.42    34.82.235.125    3000:31074/TCP               26m

但是,我的 CRA 部署多次崩溃,尽管表明它仍然是 running

获取 pod

sample-server-598776c5fc-55jsz                     1/1     Running     0          42m
sample-ui-c75ccb746-qppk2                          1/1     Running     4          2m38s

我怀疑我的 React Dockerfile 配置不正确,但我不确定如何编写它以与 kubernetes 中的 NodeJS 后端一起使用。

a) 如何为我的 CRA 设置我的 Dockerfile 以使其在 pod 中运行?

b) 如何设置我的 docker 服务和 pod 以便它们进行通信?

【问题讨论】:

  • 活动中有任何信息吗? kubectl describe deployment sample-ui ? kubectl describe pod sample-ui-c75ccb746-qppk2 ? it crashes 到底是什么意思?如果它真的崩溃了,你应该在日志中看到一些关于它的信息。 kubectl logs sample-ui-c75ccb746-qppk2 说什么?
  • 谢谢,我已经在问题中更新了我的 Dockerfile。我只从 kubectl 日志中得到 yarn run v1.17.3 $ react-scripts start
  • pod 事件中有什么东西吗?

标签: node.js docker kubernetes


【解决方案1】:

你必须在你的服务器前使用来 API 网关,或者你可以使用来自 kubernetes 的大使。

然后你就可以让你的客户端连接到服务器了。

【讨论】:

    【解决方案2】:

    a) 我如何为我的 CRA 设置我的 Dockerfile,以便它可以在 豆荚?

    React docker 文件看起来不错,您需要检查 pod 容器失败的原因。

    使用kubectl describe pod &lt;POD name&gt;或使用命令kubectl logs &lt;pod name&gt;调试更多日志

    如何设置我的 docker 服务和 pod,以便它们 交流?

    为此,您在 Kubernetes 中使用服务名称 进行通信的方式是正确的。

    这在第一级可能很奇怪,但 Kubernetes DNS 会处理它。

    如果你有两个服务前端(sample-ui)和后端(sample-server)

    sample-ui 会将请求发送到 sample-server,以便它们以这种方式连接。

    您也可以通过进入 sample-ui POD(container)

    进行尝试
    kubect exec -it sample-ui-c75ccb746-qppk2 -- /bin/bash
    

    现在您在 sample-ui 容器内,让我们从这里向 sample-server 发送请求

    如果 curl 不存在,您可以使用 apk install curlapt-get install curlyum install curl 安装它

    curl http://sample-server:3001   
    

    您可能会看到来自服务器的响应。

    所以你的 while 流程是这样的

    用户来到 frontend 负载均衡器服务 > 现在调用 sample-ui 服务 > internally 在 kubernetes 集群中您的 sample-ui 调用 sample-server

    您在 K8s 中创建的所有服务都可以通过其名称访问。

    【讨论】:

      猜你喜欢
      • 2019-06-30
      • 2020-10-24
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 2019-08-24
      • 1970-01-01
      • 2015-11-22
      • 2022-07-12
      相关资源
      最近更新 更多