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

Erratic and slow behavior with create-react-app and Skaffold kubernetes

我让 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. 我真的简化了我正在尝试做的事情,以便更容易地解决这个问题,所以我只使用了一个 OOTB create-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
    
  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
    
  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
    
  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 . .
    
  10. 创建一个 .dockerignore 文件并添加以下内容:

    node_modules
    *.swp
    
  11. 回到父目录:

    cd ..

  12. 确保minikube是运行ning:

    minikube start

  13. 运行 skaffold.yaml:

    skaffold dev --port-forward --tail

这就是我遇到问题的原因。

好的。漠视。从一个副本开始,效果很好。两个工作正常。如果 skaffold 已经是 运行,则三个有效,但不是来自新的 skaffold dev --port-forward --tail

skaffold ssh 然后做了 top。 运行 RAM 不足...利用率为 86%。将其从默认的 2GB 增加到 8GB,现在可以正常工作了。

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