【问题标题】:Can't Share a Persistent Volume Claim for an EBS Volume between Apps无法在应用程序之间共享 EBS 卷的持久卷声明
【发布时间】:2017-12-07 03:18:29
【问题描述】:

是否可以在两个应用程序(每个应用程序使用一个 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]

我尝试过:

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

奇怪的是,事件日志从来没有说它不能为 MySQL 应用安装卷。

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

【问题讨论】:

  • 它们是否在同一个命名空间中?你应该能够做到这一点。事件日志中有任何内容吗?
  • 它们肯定在同一个命名空间中。
  • 看起来不错,来自oc get events 的任何内容以及底层存储类型是什么?
  • 警告是挂载失败。它说不能将相同的卷附加到两个不同的实例。
  • openshift 网站现在只允许创建 ebs 存储...

标签: openshift kubernetes


【解决方案1】:

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

我知道这适用于 NFS 和 Glusterfs 存储,并且在许多使用这些存储类型的项目中都这样做了,但不幸的是,在您的情况下它不受支持

【讨论】:

  • 谢谢。我自己永远也想不通。
猜你喜欢
  • 2021-05-22
  • 2016-05-23
  • 1970-01-01
  • 2019-11-12
  • 2022-07-12
  • 2019-02-01
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
相关资源
最近更新 更多