2

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

我的项目命名:carx;服务器名称:汽车服务器

但是,在创建第二个 pod 时出现错误。

kubectl describe pod car-server-statefulset-1

卷“my-app-data”的 AttachVolume.Attach 失败:googleapi:错误 400:RESOURCE_IN_USE_BY_ANOTHER_RESOURCE - 磁盘资源“projects/.../disks/carx-disk”已被“projects/.../instances”使用/gke-cluster-...-2dw1'


汽车服务器-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
4

2 回答 2

2

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用于复制到另一个 AZ的区域磁盘。请参阅区域永久磁盘,但它仍然具有相同的访问模式

于 2020-09-23T16:38:14.580 回答
1

文档

PD 的一个特点是它们可以同时被多个消费者以只读方式安装。这意味着您可以使用数据集预填充 PD,然后根据需要从尽可能多的 Pod 并行提供它。不幸的是,PD 只能由单个使用者以读写模式安装 - 不允许同时写入。

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

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

于 2020-09-23T16:49:13.977 回答