首页 文章

无法在应用之间共享EBS卷的持久卷声明

提问于
浏览
1

是否可以在两个应用程序(每个使用一个pod)之间共享一个持久性卷声明(PVC)?

我看了:Share persistent volume claims amongst containers in Kubernetes/OpenShift但是没有得到答案 .

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

然后,我使用具有不同子路径的相同持久卷声明向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: {}

卷装入名称不同 . 但这不应该使两个pod无法共享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]

我试过了:

  • 首先打开MySQL应用程序,然后尝试打开PHP应用程序

  • 发现php app无法启动

  • 关闭这两个应用

  • 首先打开PHP应用程序,然后尝试打开MySQL应用程序 .

  • 发现mysql app无法启动

奇怪的是,事件日志永远不会说它无法为MySQL应用程序安装卷 .

要挂载的剩余卷是default-token-xxxxx或volume-959bo(PHP应用程序中的卷名),但绝不是mysql-data(MySQL应用程序中的卷名) .

1 回答

  • 2

    因此,错误似乎是由您使用的底层存储引起的,在本例中为 EBS . OpenShift文档实际上特别声明这是块存储的情况,请参阅here .

    我知道这对NFS和Glusterfs存储都有效,并且已经在使用这些存储类型的众多项目中完成了这项工作,但遗憾的是,在您的情况下它不受支持

相关问题