Kubernetes持久化卷和主机路径

9

我正在尝试使用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上不起作用?

感谢您的回答!


部署名称是否打错了?它看起来与 PVC 名称 store-persistent-volume-claim 不同。 - Daein Park
是的,打错了,抱歉我已经修正了... - posthumecaver
激活 PV/VPC 的顺序和 pod 激活似乎会导致这个问题,特别是如果在现有的 pod 中添加 PVC,我遇到了同样的问题。然而,按照 配置持久卷 中的步骤对我来说很好用。 - void4
你的理解似乎是正确的,我在本地尝试了一下,看到了你期望看到的行为。我使用的是minikube版本v1.5.2和Kubernetes客户端版本v1.16.3,服务器版本v1.16.2。 - Amit Kumar Gupta
我移除了您的Deployment中的Serviceports,并将image更改为nginx,以使此示例尽可能简洁且易于重现。我可以执行到pod并写入/data中的文件,然后当我执行minikube ssh并检查主机路径时,我可以看到它们。反之,当我在主机路径中写入数据后,稍后再执行容器时,我也能看到数据。所以确实是双向工作的。我尝试了两种情况,一种是在定义PV之前先创建主机路径目录,另一种则没有。两者都可以正常工作。 - Amit Kumar Gupta
提醒:请检查绑定状态是否已绑定。 - doughgle
3个回答

3
假设您正在使用多节点Kubernetes集群,您应该能够在运行该Pod的特定工作节点上本地挂载数据,路径为 /Volumes/Data/data。
您可以使用命令 kubectl get pods -o wide -n test 来查看您的Pod被调度到哪个工作节点上。
请注意,根据Kubernetes文档,HostPath(仅用于单节点测试-本地存储不受任何支持并且在多节点群集中不起作用)PersistentVolume
但在我的情况下它是有效的。

另一个选择是“本地”卷,它们得到支持并且在多节点情况下(由于nodeAffinity)可以正常工作:https://kubernetes.io/docs/concepts/storage/volumes/#local - remram

0

由于您正在使用主机路径,因此应在运行Pod的工作节点中检查此“/data”。


-2

就像上面那位说的一样。您需要运行“kubectl get po -n test -o wide”命令,然后您将看到托管Pod的节点。然后,如果您SSH该工作节点,您可以查看卷。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接