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

标签 kubernetes persistent-volumes kubernetes-statefulset persistent-volume-claims gce-persistent-disk

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

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

但是,我在创建第二个 Pod 时遇到错误。

kubectl describe pod car-server-statefulset-1

AttachVolume.Attach failed for volume "my-app-data" : googleapi: Error 400: RESOURCE_IN_USE_BY_ANOTHER_RESOURCE - The disk resource 'projects/.../disks/carx-disk' is already being used by '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时,每个副本使用自己的卷是很常见的,为此使用 StatefulSet list 的 volumeClaimTemplate: 部分。

示例:

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

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

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

关于kubernetes - Kubernetes 中的 StatefulSet 中的 3 个副本可以使用相同的 PersistentVolume 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64032305/

相关文章:

angular - K8s/Angular CORS 问题 REST 服务器

kubernetes - 如何重用现有的持久卷声明

kubernetes - 附加到无状态集的 headless 服务上的端口问题

amazon-web-services - 在 KOP 中定义自定义 SSH key 或查找自动生成的 SSH key

kubernetes - 使用 AWS Container Insights 监控 Kubernetes CronJob 完成

amazon-web-services - AWS EKS Fargate Ingress 没有地址

kubernetes - 如何在持久卷声明中启用存储大小参数?

kubernetes - 如何在不丢失数据的情况下在 AKS 上为 Cassandra 扩展 PVC?

kubernetes - 公开一个 redis 集群 - 使用 kubernetes statefulset 到互联网