使用create-react-app和Skaffold kubernetes时行为不稳定且缓慢

时间:2019-10-14 21:32:52

标签: reactjs docker kubernetes minikube skaffold

我让Skaffold与本地开发服务器和数据库部署紧密配合。我正在尝试开发create-react-app前端,但是该行为异常缓慢且不稳定。

问题

主要问题如下:

  1. 运行skaffold dev --port-forward --tail最多需要五分钟的时间,它终于开始旋转。仅运行docker build只需不到30秒。
  2. 当它终于开始旋转时,它仅停留在Starting the development server...上两分钟。
  3. 然后,十分之九,几分钟后出现以下错误(有3个,因为那是多少个副本): enter image description here

    十分之一,它实际上会进入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之后服务器部署也开始出现异常)

代码和复制步骤

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

  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正在运行:

    minikube start

  13. 运行skaffold.yaml

    skaffold dev --port-forward --tail

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

1 个答案:

答案 0 :(得分:1)

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

skaffold ssh,然后执行top。内存用完了……利用率高达86%。将其从默认的2GB增加到8GB,现在可以正常使用了。

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