2017-07-03 28 views
1

是否可以在两个应用程序(每个使用一个吊舱)之间共享一个持久性卷索赔(PVC)?无法在应用程序之间为EBS卷共享持久性卷索赔

我看过:Share persistent volume claims amongst containers in Kubernetes/OpenShift但没有完全得到答案。

我试图在同一个项目中添加一个PHP应用程序和MySQL应用程序(使用持久存储)。删除原始永久卷(PV)并创建一个新的,具有读,写,多模式。我设置MySQL数据库的根密码,并且数据库工作。

然后,我使用具有不同子路径的相同持久量声明向PHP应用程序添加存储。我发现我无法打开这两个应用程序。打开后,当我尝试打开下一个时,它会卡在创建容器中。在openshift部署步骤

MySQL的.yaml:

... 
    template: 
    metadata: 
     creationTimestamp: null 
     labels: 
     name: mysql 
    spec: 
     volumes: 
     - name: mysql-data 
      persistentVolumeClaim: 
      claimName: mysql 
     containers: 
     - name: mysql 
     ... 
      volumeMounts: 
      - name: mysql-data 
       mountPath: /var/lib/mysql/data 
       subPath: mysql/data 
      ... 
      terminationMessagePath: /dev/termination-log 
      imagePullPolicy: IfNotPresent 
     restartPolicy: Always 
     terminationGracePeriodSeconds: 30 
     dnsPolicy: ClusterFirst 

PHP .yaml从部署的步骤:

template: 
    metadata: 
     creationTimestamp: null 
     labels: 
     app: wiki2 
     deploymentconfig: wiki2 
    spec: 
     volumes: 
     - name: volume-959bo <<---- 
      persistentVolumeClaim: 
      claimName: mysql 
     containers: 
     - name: wiki2 
      ... 
      volumeMounts: 
      - name: volume-959bo 
       mountPath: /opt/app-root/src/w/images 
       subPath: wiki/images 
      terminationMessagePath: /dev/termination-log 
      imagePullPolicy: Always 
     restartPolicy: Always 
     terminationGracePeriodSeconds: 30 
     dnsPolicy: ClusterFirst 
     securityContext: {} 

卷装入名称是不同的。但是这不应该使两个吊舱不能共享PVC。或者,问题是他们不能同时安装相同的音量?我无法在/ dev上获得终止日志,因为如果无法挂载该卷,则该pod无法启动,并且我无法获取该日志。

的PVC的.yaml(oc get pvc -o yaml

apiVersion: v1 
items: 
- apiVersion: v1 
    kind: PersistentVolumeClaim 
    metadata: 
    annotations: 
     pv.kubernetes.io/bind-completed: "yes" 
     pv.kubernetes.io/bound-by-controller: "yes" 
     volume.beta.kubernetes.io/storage-class: ebs 
     volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/aws-ebs 
    creationTimestamp: YYYY-MM-DDTHH:MM:SSZ 
    name: mysql 
    namespace: abcdefghi 
    resourceVersion: "123456789" 
    selfLink: /api/v1/namespaces/abcdefghi/persistentvolumeclaims/mysql 
    uid: ________-____-____-____-____________ 

    spec: 
    accessModes: 
    - ReadWriteMany 
    resources: 
     requests: 
     storage: 1Gi 
    volumeName: pvc-________-____-____-____-____________ 
    status: 
    accessModes: 
    - ReadWriteMany 
    capacity: 
     storage: 1Gi 
    phase: Bound 
kind: List 
metadata: {} 
resourceVersion: "" 
selfLink: "" 

可疑从oc get events

Warning FailedMount {controller-manager } 
    Failed to attach volume "pvc-________-____-____-____-____________" 
    on node "ip-172-__-__-___.xx-xxxx-x.compute.internal" 
with: 
    Error attaching EBS volume "vol-000a00a00000000a0" to instance 
    "i-1111b1b11b1111111": VolumeInUse: vol-000a00a00000000a0 is 
    already attached to an instance 

Warning FailedMount {kubelet ip-172-__-__-___.xx-xxxx-x.compute.internal} 
    Unable to mount volumes for pod "the pod for php app": 
    timeout expired waiting for volumes to attach/mount for pod "the pod". 
    list of unattached/unmounted volumes= 
     [volume-959bo default-token-xxxxx] 

项我想:

  1. 打开MySQL的应用程序,然后再尝试打开PHP应用程序
  2. 发现php应用程序无法启动
  3. 关闭这两个应用程序
  4. 先打开PHP应用程序,然后尝试打开MySQL应用程序。
  5. 发现MySQL的应用程序无法启动

奇怪的是,事件日志从来没有说,它不能用于MySQL的应用程序安装量。

要安装的其余volumen是default-token-xxxxx或volume-959bo(PHP应用程序中的卷名称),但从来没有mysql-data(MySQL应用程序中的卷名称)。

+0

他们是在同一个命名空间中的许多项目都做到了这一点?你应该可以做到这一点。事件日志中的任何内容? – user2983542

+0

他们肯定在相同的名字空间。 –

+0

看起来没问题,从'oc获取事件'和底层存储类型是什么? – user2983542

回答

2

所以这个错误似乎是由您使用的底层存储引起的,在这种情况下是EBS。 OpenShift文档实际上明确指出这是块存储的情况,请参阅here

我知道这将NFS和Glusterfs存储工作,并使用这些存储类型,但不幸的是,在你的情况下,它不支持

+0

谢谢。我从来没有想过我自己。 –

+0

很酷,没问题。记分作为接受的答案?谢谢 – user2983542