是否可以在两个应用程序(每个使用一个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: {}
卷装入名称不同。但这不应该使两个豆荚不能共享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应用程序安装卷。
要挂载的剩余卷是default-token-xxxxx,或者卷-959bo(PHP app中的卷名),但绝不是mysql-data(MySQL应用程序中的卷名)。
答案 0 :(得分:2)
因此,错误似乎是由您使用的基础存储引起的,在本例中为EBS
。 OpenShift文档实际上特别声明了块存储的情况,请参阅here。
我知道这对NFS和Glusterfs存储都有效,并且已经在使用这些存储类型的众多项目中完成了这项工作,但遗憾的是,在您的情况下它不受支持