【发布时间】: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]
我尝试过:
- 先开启MySQL应用,再尝试开启PHP应用
- 发现 php 应用无法启动
- 关闭这两个应用程序
- 先开启PHP应用,再尝试开启MySQL应用。
- 发现 mysql 应用无法启动
奇怪的是,事件日志从来没有说它不能为 MySQL 应用安装卷。
要挂载的剩余卷是 default-token-xxxxx 或 volume-959bo(PHP 应用程序中的卷名),但绝不是 mysql-data(MySQL 应用程序中的卷名)。
【问题讨论】:
-
它们是否在同一个命名空间中?你应该能够做到这一点。事件日志中有任何内容吗?
-
它们肯定在同一个命名空间中。
-
看起来不错,来自
oc get events的任何内容以及底层存储类型是什么? -
警告是挂载失败。它说不能将相同的卷附加到两个不同的实例。
-
openshift 网站现在只允许创建 ebs 存储...
标签: openshift kubernetes