我正在尝试将我的Express服务器部署从Kubernetes集群中的Deployment更改为Statefulsets。将volumeMounts添加到yaml文件后,我从Pod的日志中收到以下错误:
npm ERR! path /usr/src/app/package.json
npm ERR! code ENOENT
npm ERR! errno -2
npm ERR! syscall open
npm ERR! enoent ENOENT: no such file or directory, open '/usr/src/app/package.json'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent
npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2019-08-23T13_55_03_058Z-debug.log
我以前的文件:
Dockerfile
FROM node:10.16-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
CMD [ "npm", "start" ]
服务Yaml文件
apiVersion: v1
kind: Service
metadata:
name: image-server-cluster-ip-service
spec:
type: ClusterIP
selector:
component: image-server
ports:
- port: 3001
targetPort: 3001
部署Yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: image-server-deployment
spec:
replicas: 1
selector:
matchLabels:
component: image-server
template:
metadata:
labels:
component: image-server
spec:
containers:
- name: image-server
image: gcr.io/my-project/image-server:v0.0.10
ports:
- containerPort: 3001
env:
- name: MONGO_HOST
value: mongo-cluster-ip-service
- name: MONGO_PORT
value: '27017'
我当前的文件:
headless service file
apiVersion: v1
kind: Service
metadata:
name: image-server-cluster-ip-service
spec:
clusterIP: None
selector:
component: image-server
ports:
- port: 3001
targetPort: 3001
statefulsets yaml文件
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: image-server-deployment
spec:
serviceName: "image-server-cluster-ip-service"
replicas: 2
selector:
matchLabels:
component: image-server
template:
metadata:
labels:
component: image-server
spec:
containers:
- name: image-server
image: gcr.io/my-project/image-server:v0.0.10
ports:
- containerPort: 3001
env:
- name: MONGO_HOST
value: mongo-cluster-ip-service
- name: MONGO_PORT
value: '27017'
volumeMounts:
- mountPath: /usr/src/app
name: image-server-vol
volumeClaimTemplates:
- metadata:
name: image-server-vol
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
我认为添加卷挂载时可能会删除package.json文件。
将卷安装到吊舱的正确方法是什么?
答案 0 :(得分:2)
在评论讨论中,您的用例是处理用户上传的文件。
出于各种原因,您不应在此用例中使用PV。原因之一是您的两个StatefulSet副本将装载不同的卷,因此,如果用户上载文件,并且该请求由一个副本处理,然后稍后他们尝试查看其文件,而该请求由另一个副本处理,则它不会在那里。考虑使用blobstore服务,例如S3,Google Cloud Filestore,Minio等。这将需要更多代码来编写,并且可能会引入一些客户端库,但这是一个更好的做法。
为了您的启发,尽管您不应该在该用例中使用PV,但这是为什么它导致您看到的特定错误的原因:您正在将卷装入/usr/src/app
,所以无论如何它都会被吹走在容器中文件系统中的那个位置,即在构建Docker映像时通过COPY
命令放置的所有应用程序源代码。将来在使用PV时,请确保将卷挂载到其他路径,以免破坏您故意放置的文件。
答案 1 :(得分:0)
您的 StatefulSet 声明似乎没问题。
但是,当您使用 volumeClaimTemplates 时,是否在应用配置之前声明了 PersistentVolume ?
要使用 volumeClaimTemplate ,您需要处于official documentation中所述的情况。特别是这句话:
本教程假定您的集群已配置为动态设置PersistentVolumes。如果您的集群未配置为执行此操作,则在开始本教程之前,您将必须手动配置两个1 GiB卷
答案 2 :(得分:0)
这似乎工作正常:
volumeMounts:
- mountPath: /usr/src/app
name: image-server-vol
但是您正在安装应用程序的工作目录/usr/src/app
。而是将卷挂载到/usr/image
之类的其他位置。
答案 3 :(得分:0)
您正在复制尚未创建的voulume image-server-vol