繁体   English   中英

如何在Kubernetes中将卷安装到Pod

[英]How to mount a volume to a pod in Kubernetes

我正在尝试将我的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

我以前的文件:

Docker文件

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文件。

将卷安装到吊舱的正确方法是什么?

在评论讨论中,您的用例是处理用户上传的文件。

出于各种原因,您不应为此用途使用PV。 原因之一是您的两个StatefulSet副本将装载不同的卷,因此,如果用户上载文件,并且该请求由一个副本处理,然后稍后他们尝试查看其文件,而该请求由另一个副本处理,则它不会在那里。 考虑使用blobstore服务,例如S3,Google Cloud Filestore,Minio等。这将需要更多代码来编写,并且可能会引入一些客户端库,但这是一种更好的做法。

为了您的启发,尽管您不应该在此用例中使用PV,但这是为什么它导致您看到的特定错误的原因:您正在将卷挂载到/usr/src/app因此无论什么时候它都会消失容器中文件系统中的位置,即在构建Docker映像时通过COPY命令放置的所有应用程序源代码。 将来在使用PV时,请确保将卷安装到其他路径,以免损坏您故意放置的文件。

您的StatefulSet声明似乎还可以。
但是,当您使用volumeClaimTemplates时 ,是否应用配置之前声明了PersistentVolume

为了使用volumeClaimTemplate ,您需要处于官方文档中所述的情况。 特别是这句话:

本教程假定您的集群已配置为动态设置PersistentVolumes。 如果您的集群未配置为这样做,那么在开始本教程之前,您将必须手动配置两个1 GiB卷

这似乎工作正常:

    volumeMounts:
      - mountPath: /usr/src/app
        name: image-server-vol

但是,您正在安装应用程序的工作目录/usr/src/app 而是将卷挂载到/usr/image

您正在迁移尚未创建的voulume image-server-vol

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM