我正在尝试使用Kubernetes持久卷进行实验,但是在Kubernetes文档中找不到清晰的解释,并且行为与我的期望不符,因此我想在这里询问。
我配置了以下持久卷和持久卷声明。
kind: PersistentVolume
apiVersion: v1
metadata:
name: store-persistent-volume
namespace: test
spec:
storageClassName: hostpath
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/Volumes/Data/data"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: store-persistent-volume-claim
namespace: test
spec:
storageClassName: hostpath
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
以下是部署和服务配置。
kind: Deployment
apiVersion: apps/v1beta2
metadata:
name: store-deployment
namespace: test
spec:
replicas: 1
selector:
matchLabels:
k8s-app: store
template:
metadata:
labels:
k8s-app: store
spec:
volumes:
- name: store-volume
persistentVolumeClaim:
claimName: store-persistent-volume-claim
containers:
- name: store
image: localhost:5000/store
ports:
- containerPort: 8383
protocol: TCP
volumeMounts:
- name: store-volume
mountPath: /data
---
#------------ Service ----------------#
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: store
name: store
namespace: test
spec:
type: LoadBalancer
ports:
- port: 8383
targetPort: 8383
selector:
k8s-app: store
如您所见,我将“/Volumes/Data/data”定义为持久卷,并期望将其挂载到“/data”容器中。
因此,我假设主机上的“/Volumes/Data/data”中的所有内容都应该在容器的“/data”目录中可见。这个假设是否正确?因为目前绝对没有发生这种情况。
我的第二个假设是,无论我在“/data”保存什么,都应该在主机上可见,但实际上并没有发生。
我可以从Kubernetes控制台看到一切都启动正确(持久卷、声明、部署、Pod、服务...)
请问我是否完全正确地理解了持久卷的概念?
PS. 我正在尝试在带有Docker(18.05.0-ce-mac67(25042)-Channel edge)的Mac上进行此操作,可能在Mac上不起作用?
感谢您的回答!
Deployment
中的Service
和ports
,并将image
更改为nginx,以使此示例尽可能简洁且易于重现。我可以执行到pod并写入/data
中的文件,然后当我执行minikube ssh
并检查主机路径时,我可以看到它们。反之,当我在主机路径中写入数据后,稍后再执行容器时,我也能看到数据。所以确实是双向工作的。我尝试了两种情况,一种是在定义PV之前先创建主机路径目录,另一种则没有。两者都可以正常工作。 - Amit Kumar Gupta