create-react-app 和 Skaffold kubernetes 的行为不稳定且缓慢

soc*_*pet 5 docker reactjs kubernetes minikube skaffold

我的 Skaffold 与本地开发服务器和数据库部署配合良好。我正在尝试在create-react-app前端工作,但行为非常缓慢且不稳定。

问题

主要问题如下:

  1. skaffold dev --port-forward --tail从运行到最终开始旋转需要五分钟以上的时间。仅运行一次docker build只需不到 30 秒。
  2. 当它最终开始旋转时,它只会再停留Starting the development server...两分钟。
  3. 然后,十有八九,几分钟后我会收到以下错误(有 3 个错误,因为这就是副本的数量): 在此输入图像描述

    十分之一的情况是,它实际上会进入“Compiled Successfully! You can now view in the browser.它从未在 Chrome 中启动”。

  4. create-react-app 中 JS 的更改永远不会反映在新浏览器中。您必须停止并再次运行 Skaffold。Skaffold 确实说了Syncing 1 files for <image>... Watching for changes...,但即使刷新后也没有任何变化。

我尝试过的

  1. 我确实简化了我想要做的事情,以便更轻松地解决这个问题,因此我只使用 OOTBcreate-react-app应用程序。无论如何,行为都是一样的。
  2. minikube deleteminikube start多次(这样做是因为即使服务器部署在尝试后也开始不稳定create-react-app

代码和重现步骤

我在 macOS Mojave (10.14.6) 上使用 Docker for Mac、Kubernetes (v1.16.0)、minikube (v1.4.0)、Skaffold (v0.39.0) 和create-react-app. 我将不得不跳过所有这些的安装过程,因为它相当冗长,因此以下步骤假设您已经进行了设置。

  1. 建立一个项目目录:

    mkdir project

  2. 创建 Kubernetes 清单目录并移入其中:

    mkdir k8s && cd k8s

  3. 制作client-deployment.yaml并添加以下内容:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: client-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          component: web
      template:
        metadata:
          labels:
            component: web
        spec:
          containers:
            - name: client
              image: testapp/client
              ports:
                - containerPort: 3000
    
    Run Code Online (Sandbox Code Playgroud)
  4. 制作client-cluster-ip-service.yaml并添加以下内容:

    apiVersion: v1
    kind: Service
    metadata:
      name: client-cluster-ip-service
    spec:
      type: ClusterIP
      selector:
        component: web
      ports:
        - port: 3000
          targetPort: 3000
    
    Run Code Online (Sandbox Code Playgroud)
  5. 移回父级:

    cd ..

  6. 创建skaffold.yaml并添加以下内容:

    apiVersion: skaffold/v1beta15
    kind: Config
    build:
      local:
        push: false
      artifacts:
        - image: testapp/client
          context: web
          docker:
            dockerfile: Dockerfile.dev
          sync:
            manual:
              - src: "**/*.js"
                dest: .
              - src: "**/*.html"
                dest: .
              - src: "**/*.css"
                dest: .
    deploy:
      kubectl:
        manifests:
          - k8s/client-deployment.yaml
          - k8s/client-cluster-ip-service.yaml
    portForward:
      - resourceType: service
        resourceName: client-cluster-ip-service
        port: 3000
        localPort: 3000
    
    Run Code Online (Sandbox Code Playgroud)
  7. 开始一个新create-react-app项目:

    npx create-react-app test-app

  8. 切换到目录:

    cd test-app

  9. 创建Dockerfile.dev并添加以下内容:

    FROM node:alpine
    
    WORKDIR '/app'
    EXPOSE 3000
    CMD ["npm", "run", "start"]
    
    COPY package* ./
    RUN npm install
    COPY . .
    
    Run Code Online (Sandbox Code Playgroud)
  10. 创建一个.dockerignore文件并添加以下内容:

    node_modules
    *.swp
    
    Run Code Online (Sandbox Code Playgroud)
  11. 返回父目录:

    cd ..

  12. 确保minikube正在运行:

    minikube start

  13. 跑过skaffold.yaml

    skaffold dev --port-forward --tail

这就是给我带来问题的原因。

soc*_*pet 3

好的。漠视。从一个复制品开始,效果很好。两个工作得很好。如果已经运行,则三个可以工作skaffold,但不能从新的skaffold dev --port-forward --tail.

skaffold ssh然后做了一个top. RAM 即将耗尽……利用率为 86%。将其从默认的 2GB 增加到 8GB,现在工作正常。

首先使用 删除虚拟机minikube delete,然后使用 新建虚拟机minikube start --memory='8g'。现在一切都好了。