GKE Kubernetes 持久卷

GKE Kubernetes Persistent Volume

我尝试为我的 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

你是如何处理的?

我看到您在 deployment 中添加了 PersistentVolumeClaim。我还看到您正在尝试扩展节点池。

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

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

解决方案:将 PersistentVolumeClaim 部署在 statefulset 对象中,而不是 deployment。有关如何部署 statefulset 的说明,请参见 in this article. With a statefulset,您将能够将 PersistentVolumeClaim 附加到 pod,然后扩展节点池。