create-react-app 和 Skaffold kubernetes 的行为不稳定且缓慢
Erratic and slow behavior with create-react-app and Skaffold kubernetes
我让 Skaffold 与本地开发服务器和数据库部署配合得很好。我正尝试着手开发 create-react-app
前端,但其行为极其缓慢且不稳定。
问题
主要问题如下:
- 从 运行宁
skaffold dev --port-forward --tail
开始用了五分钟以上,它终于开始旋转起来。 运行只需 docker build
不到 30 秒。
- 当它最终开始旋转时,它会在
Starting the development server...
上再停留两分钟。
然后,十分之九,我在几分钟后收到以下错误(有 3 个,因为那是副本的数量):
十分之一,它实际上会进入 Compiled Successfully! You can now view in the browser.
但它永远不会在 Chrome 中启动。
- create-react-app 中对 JS 的更改永远不会反映在新浏览器中。您必须停止并再次 运行 Skaffold。 Skaffold 确实显示
Syncing 1 files for <image>... Watching for changes...
,但即使刷新后也没有任何变化。
我试过的
- 我真的简化了我正在尝试做的事情,以便更容易地解决这个问题,所以我只使用了一个 OOTB
create-react-app
应用程序。不管怎样,行为都是一样的。
minikube delete
和 minikube 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
。我将不得不跳过所有这些的安装过程,因为它相当冗长,因此以下步骤假设您已经安装了这些。
制作项目目录:
mkdir project
制作一个 Kubernetes 清单目录并移入其中:
mkdir k8s && cd k8s
制作一个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
制作一个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
移回父级:
cd ..
创建一个 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
开始一个新的 create-react-app
项目:
npx create-react-app test-app
进入目录:
cd test-app
创建一个 Dockerfile.dev
并添加以下内容:
FROM node:alpine
WORKDIR '/app'
EXPOSE 3000
CMD ["npm", "run", "start"]
COPY package* ./
RUN npm install
COPY . .
创建一个 .dockerignore
文件并添加以下内容:
node_modules
*.swp
回到父目录:
cd ..
确保minikube
是运行ning:
minikube start
运行 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'
的新虚拟机。现在一切都好。
我让 Skaffold 与本地开发服务器和数据库部署配合得很好。我正尝试着手开发 create-react-app
前端,但其行为极其缓慢且不稳定。
问题
主要问题如下:
- 从 运行宁
skaffold dev --port-forward --tail
开始用了五分钟以上,它终于开始旋转起来。 运行只需docker build
不到 30 秒。 - 当它最终开始旋转时,它会在
Starting the development server...
上再停留两分钟。 然后,十分之九,我在几分钟后收到以下错误(有 3 个,因为那是副本的数量):
十分之一,它实际上会进入
Compiled Successfully! You can now view in the browser.
但它永远不会在 Chrome 中启动。- create-react-app 中对 JS 的更改永远不会反映在新浏览器中。您必须停止并再次 运行 Skaffold。 Skaffold 确实显示
Syncing 1 files for <image>... Watching for changes...
,但即使刷新后也没有任何变化。
我试过的
- 我真的简化了我正在尝试做的事情,以便更容易地解决这个问题,所以我只使用了一个 OOTB
create-react-app
应用程序。不管怎样,行为都是一样的。 minikube delete
和minikube 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
。我将不得不跳过所有这些的安装过程,因为它相当冗长,因此以下步骤假设您已经安装了这些。
制作项目目录:
mkdir project
制作一个 Kubernetes 清单目录并移入其中:
mkdir k8s && cd k8s
制作一个
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
制作一个
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
移回父级:
cd ..
创建一个
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
开始一个新的
create-react-app
项目:npx create-react-app test-app
进入目录:
cd test-app
创建一个
Dockerfile.dev
并添加以下内容:FROM node:alpine WORKDIR '/app' EXPOSE 3000 CMD ["npm", "run", "start"] COPY package* ./ RUN npm install COPY . .
创建一个
.dockerignore
文件并添加以下内容:node_modules *.swp
回到父目录:
cd ..
确保
minikube
是运行ning:minikube start
运行
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'
的新虚拟机。现在一切都好。