3个副本可以在Kubernetes的StatefulSet中使用相同的PersistentVolume吗?

问题描述

我创建了一个StatefulSet来运行带有3个副本的NodeJS,并希望将其附加到gce磁盘上,该磁盘可以成为用户上传文件的数据存储。

我的项目命名:carx;服务器名称:car-server

但是在创建第二个容器时出现错误

kubectl describe pod car-server-statefulset-1

AttachVolume.Attach无法对卷“ my-app-data”进行附加:googleapi:错误 400:RESOURCE_IN_USE_BY_ANOTHER_RESOURCE-磁盘资源 'projects /.../ disks / carx-disk'已经被使用 'projects /.../ instances / gke-cluster -...- 2dw1'


car-server-statefulset.yml

apiVersion: v1
kind: Service
Metadata:
  name: car-server-service
  labels:
    app: car-server
spec:
  ports:
  - port: 8080
    name: car-server
  clusterIP: None
  selector:
    app: car-server
---
apiVersion: apps/v1
kind: StatefulSet
Metadata:
  name: car-server-statefulset
spec:
  serviceName: "car-server-service"
  replicas: 3
  template:
    Metadata:
      labels:
        app: car-server
    spec:
      containers:
        - name: car-server
          image: myimage:latest
          ports:
            - containerPort: 8080
              name: nodejs-port
          volumeMounts:
          - name: my-app-data
            mountPath: /usr/src/app/mydata
      volumes:
      - name: my-app-data
        persistentVolumeClaim:
          claimName: example-local-claim
  selector:
    matchLabels:
      app: car-server

pvc.yml

kind: PersistentVolumeClaim
apiVersion: v1
Metadata:
  name: example-local-claim
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  storageClassName: standard

pv.yml

apiVersion: v1
kind: PersistentVolume
Metadata:
  name: my-app-data
  labels:
    app: my-app
spec:
  capacity:
    storage: 60Gi
  storageClassName: standard
  accessModes:
    - ReadWriteMany
  gcePersistentdisk:
    pdName: carx-disk
    fsType: ext4

解决方法

Access Mode字段被视为请求,但是不能确定您得到的请求。就您而言,GCEPersistentDisk仅支持ReadWriteOnceReadOnlyMany

您的PV现在已安装为ReadWriteOnce,但只能同时安装在一个节点上。因此其他副本将无法装入该卷。

在使用StatefulSet时,通常每个副本使用其自己的卷,为此使用volumeClaimTemplate:清单的StatefulSet部分。

示例:

  volumeClaimTemplates:
  - metadata:
      name: example-claim
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "standard"
      resources:
        requests:
          storage: 5Gi

如果您只能使用一个卷,则可以考虑仅使用一个副本来运行StatefulSet,例如replicas: 1

如果要进行磁盘复制,也可以对已复制到另一个可用区的区域磁盘使用 StorageClass 。请参见Regional Persistent Disk,但它仍然具有相同的访问模式

,

AST Matcher Reference

PD的一个功能是可以将它们作为只读文件安装在多个设备上 消费者同时。这意味着您可以预填充PD 与您的数据集一起使用,然后从尽可能多的Pod中并行提供 你需要。不幸的是,PD只能由单个使用者安装 在读写模式下-不允许同时写入。

另一种解决方案是NAS产品Google Cloud Filestore。您可以在Compute Engine和Kubernetes Engine实例中挂载文件存储。但是,Filestore的问题在于它在设计时就考虑到了大型文件存储系统,并且最小容量为1TB,这对于小型用例来说是昂贵的。

解决该问题的一种廉价方法是在由ReadWriteOnce PV备份的群集中设置NFS服务器,然后使用此NFS服务器创建基于NFS的PV(支持ReadWriteMany)