首页 > 解决方案 > GKE Kubernetes 持久卷

问题描述

我尝试为我的 rethinkdb 服务器使用持久卷。但我得到了这个错误:

Unable to mount volumes for pod "rethinkdb-server-deployment-6866f5b459-25fjb_default(efd90244-7d02-11e8-bffa-42010a8400b9)": timeout expired waiting for volumes to attach/mount for pod "default"/"rethinkdb-server-deployment-
Multi-Attach error for volume "pvc-f115c85e-7c42-11e8-bffa-42010a8400b9" Volume is already used by pod(s) rethinkdb-server-deployment-58f68c8464-4hn9x

我认为 Kubernetes 部署了一个新节点而没有删除旧节点,因此它无法在两者之间共享文件卷,因为我的 pvc 是 ReadWriteOnce。这个永久卷必须以自动方式创建,所以我不能使用永久磁盘,格式化它......

我的配置:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  namespace: default
  name: rethinkdb-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi



apiVersion: apps/v1beta1
kind: Deployment
metadata:
  namespace: default
  labels:
    db: rethinkdb
    role: admin
  name: rethinkdb-server-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: rethinkdb-server
  template:
    metadata:
      name: rethinkdb-server-pod
      labels:
        app: rethinkdb-server
    spec:
      containers:
      - name: rethinkdb-server
        image: gcr.io/$PROJECT_ID/rethinkdb-server:$LAST_VERSION
        env:
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        ports:
        - containerPort: 8080
          name: admin-port
        - containerPort: 28015
          name: driver-port
        - containerPort: 29015
          name: cluster-port
        volumeMounts:
        - mountPath: /data/rethinkdb_data
          name: rethinkdb-storage
      volumes:
       - name: rethinkdb-storage
         persistentVolumeClaim:
          claimName: rethinkdb-pvc

你如何管理这个?

标签: kubernetesgoogle-kubernetes-enginepersistent-volumes

解决方案


我看到您已经PersistentVolumeClaimdeployment. 我还看到您正在尝试扩展节点池。

APersistentVolumeClaim将适用于部署,但前提是您不扩展deployment. 这就是出现该错误消息的原因。您看到的错误表明,在复制新 pod 时,该卷已被现有 pod 使用。

因为您正在尝试扩展deployment,其他副本将尝试安装和使用相同的卷。

解决方案:将 PersistentVolumeClaim 部署在statefulset对象中,而不是deployment. statefulset可以在本文中找到有关如何部署 a 的说明。使用statefulset,您将能够将 PersistentVolumeClaim 附加到 pod,然后扩展节点池。


推荐阅读