与2个安装路径共享的PersistentVolumeClaim不起作用

时间:2020-06-25 14:38:38

标签: kubernetes digital-ocean nfs persistent-storage persistent-volume-claims

我已经在DigitalOcean块存储上设置了NFS以具有readwritemany访问模式,现在我可以在部署之间共享PV,但是当我有多个具有相同声明名称的装载路径时,就无法在部署内共享PV。有人可以评论一下这是为什么发生的原因,这是使用PV的正确方法,并且如果NFS不支持这一点,我还能使用什么呢?这将使我能够在具有多个安装路径的Pod之间共享卷。

清单

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-data
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 18Gi
  storageClassName: nfs

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: web
    spec:
      containers:
      - image: nginx:latest
        name: nginx
        resources: {}
        volumeMounts:
        - mountPath: /data
          name: data
        - mountPath: /beta
          name: beta
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: nfs-data
      - name: beta
        persistentVolumeClaim:
          claimName: nfs-data

PV描述

NAME                                       STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
data-nfs-server-nfs-server-provisioner-0   Bound    pvc-442af801-0b76-444d-afea-382a12380926   20Gi       RWO            do-block-storage   24h
nfs-data                                   Bound    pvc-0ae84fe2-025b-450d-8973-b74c80275cb7   18Gi       RWX            nfs                1h


Name:          nfs-data
Namespace:     default
StorageClass:  nfs
Status:        Bound
Volume:        pvc-0ae84fe2-025b-450d-8973-b74c80275cb7
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
               volume.beta.kubernetes.io/storage-provisioner: cluster.local/nfs-server-nfs-server-provisioner
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      18Gi
Access Modes:  RWX
VolumeMode:    Filesystem
Mounted By:    <none>
Events:
  Type    Reason                 Age                    From                                                                                                                      Message
  ----    ------                 ----                   ----                                                                                                                      -------
  Normal  ExternalProvisioning   2m16s (x2 over 2m16s)  persistentvolume-controller                                                                                               waiting for a volume to be created, either by external provisioner "cluster.local/nfs-server-nfs-server-provisioner" or manually created by system administrator
  Normal  Provisioning           2m16s                  cluster.local/nfs-server-nfs-server-provisioner_nfs-server-nfs-server-provisioner-0_8dd7b303-b9a1-4a07-8c6b-906b81c07402  External provisioner is provisioning volume for claim "default/nfs-data"
  Normal  ProvisioningSucceeded  2m16s                  cluster.local/nfs-server-nfs-server-provisioner_nfs-server-nfs-server-provisioner-0_8dd7b303-b9a1-4a07-8c6b-906b81c07402  Successfully provisioned volume pvc-0ae84fe2-025b-450d-8973-b74c80275cb7

错误

Name:           web-85f9fbf54-hfcvn
Namespace:      default
Priority:       0
Node:           pool-db4v93z2h-3yg9e/10.132.113.175
Start Time:     Thu, 25 Jun 2020 19:25:40 +0500
Labels:         app=web
                pod-template-hash=85f9fbf54
Annotations:    <none>
Status:         Pending
IP:             
IPs:            <none>
Controlled By:  ReplicaSet/web-85f9fbf54
Containers:
  nginx:
    Container ID:   
    Image:          nginx:latest
    Image ID:       
    Port:           <none>
    Host Port:      <none>
    State:          Waiting
      Reason:       ContainerCreating
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /beta from beta (rw)
      /data from data (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-pdsgk (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             False 
  ContainersReady   False 
  PodScheduled      True 
Volumes:
  data:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  nfs-data
    ReadOnly:   false
  beta:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  nfs-data
    ReadOnly:   false
  default-token-pdsgk:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-pdsgk
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason       Age        From                           Message
  ----     ------       ----       ----                           -------
  Normal   Scheduled    <unknown>  default-scheduler              Successfully assigned default/web-85f9fbf54-hfcvn to pool-db4v93z2h-3yg9e
  Warning  FailedMount  22s        kubelet, pool-db4v93z2h-3yg9e  Unable to attach or mount volumes: unmounted volumes=[data], unattached volumes=[default-token-pdsgk data beta]: timed out waiting for the condition

1 个答案:

答案 0 :(得分:0)

正如我在评论中提到的那样,您可以尝试使用subPath,请查看有关它的kubernetesopenshift文档。

有时,在一个Pod中共享一个卷以用于多种用途很有用。 volumeMounts.subPath属性可用于在引用的卷中指定子路径,而不是其根。

这里是一个使用单个共享卷的带有LAMP堆栈(Linux Apache Mysql PHP)的Pod的示例。 HTML内容映射到其html文件夹,数据库将存储在其mysql文件夹中:

apiVersion: v1
kind: Pod
metadata:
  name: my-lamp-site
spec:
    containers:
    - name: mysql
      image: mysql
      env:
      - name: MYSQL_ROOT_PASSWORD
        value: "rootpasswd"
      volumeMounts:
      - mountPath: /var/lib/mysql
        name: site-data
        subPath: mysql
    - name: php
      image: php:7.0-apache
      volumeMounts:
      - mountPath: /var/www/html
        name: site-data
        subPath: html
    volumes:
    - name: site-data
      persistentVolumeClaim:
        claimName: my-lamp-site-data

数据库存储在 mysql 文件夹中。

HTML内容存储在 html 文件夹中。


如果这对您不起作用,我会说您必须对每个安装路径使用pvc。

例如here

apiVersion: v1
kind: Pod
metadata:
  name: nfs-web
spec:
  volumes:
    # List of volumes to use, i.e. *what* to mount
    - name: myvolume
      < volume details, see below >
    - name: mysecondvolume
      < volume details, see below >

  containers:
    - name: mycontainer
      volumeMounts:
        # List of mount directories, i.e. *where* to mount
        # We want to mount 'myvolume' into /usr/share/nginx/html
        - name: myvolume
          mountPath: /usr/share/nginx/html/
        # We want to mount 'mysecondvolume' into /var/log
        - name: mysecondvolume
          mountPath: /var/log/
相关问题