如何访问 docker-for-desktop 上的 PersistentVolume 文件?

How to access PersistentVolume files on docker-for-desktop?

我想在我的本地计算机 (macOS) 上访问和编辑我的 Kubernetes PersistentVolume 中的文件,但我不知道在哪里可以找到这些文件!

我将我的 hostPath 指向 /tmp/wordpress-volume,但我无法在任何地方找到它。我想念的隐藏秘密是什么

我在 docker-for-desktop 集群 Version 2.0.0.2 (30215).

上使用以下配置

持久卷

kind: PersistentVolume
metadata:
  name: wordpress-volume
spec:
  # ...
  hostPath:
    path: /tmp/wordpress-volume

PersistentVolumeClaim

kind: PersistentVolumeClaim
metadata:
  name: wordpress-volume-claim
# ...

部署

kind: Deployment
metadata:
  name: wordpress
# ...
spec:
  containers:
  - image: wordpress:4.8-apache
    # ...
    volumeMounts:
    - name: wordpress-volume
      mountPath: /var/www/html
  volumes:
  - name: wordpress-volume
    persistentVolumeClaim:
      claimName: wordpress-volume-claim

首先,您需要记住的是 Kubernetes 运行正在 minikube 集群上运行。 minikube 本身 运行 在虚拟机上。因此该路径不会在您的主机上,而是虚拟机中的路径。

但是使用 minikube 我们可以轻松地做到这一点。首先,您必须将主机目录挂载到 minikube

(如果您使用的是云提供商,您将有一些方法来创建存储。对于 GCE,您有 gcePersistentDisk

minikube mount /path/to/dir/to/mount:/vm-mount-path

现在

kind: PersistentVolume
metadata:
  name: wordpress-volume
spec:
  # ...
  hostPath:
    path: /vm-mount-path

如果您创建此资源,这应该会在您的主机中保存文件。

Follow this minikube documentation for more detail

感谢@aman-tuladhar 和在互联网上浪费的一些时间,我发现您只需要确保为您设置 storageClassName PersistentVolumePersistentVolumeClaim

根据 documentation 如果你想避免 Kubernetes 动态生成 PersistentVolumes 而不考虑你静态声明的那个,你可以只设置一个空字符串 " ".

在我的例子中,我设置了 storageClassName: manual

持久卷

kind: PersistentVolume
metadata:
  name: wordpress-volume
spec:
  # ...
  storageClassName: manual
  hostPath:
    path: /tmp/wordpress-volume

PersistentVolumeClaim

kind: PersistentVolumeClaim
metadata:
  name: wordpress-volume-claim
spec:
  storageClassName: manual
  # ...

这与 docker-for-desktop 群集开箱即用(只要 mountPath 设置为绝对路径)。

参考文献:

在 MacOS 和 Docker 内的 Kubernetes 的情况下 Mac。如何找到基于目录的本地卷的真实位置 into VM

1) 创建一个具有唯一路径的新 PersistentVolume:

blablabla.yml:

kind: PersistentVolume
apiVersion: v1
metadata:
  name: blablabla
spec:
  storageClassName: manual
  capacity:
    storage: 1G
  accessModes:
    - ReadWriteMany
  hostPath:
    path: "/mnt/blablabla"

kubectl apply -f blablabla.yml

2) 登录虚拟机:

screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
# then press Enter

3) 查找您的音量:

find / -name blablabla
/containers/services/docker/rootfs/mnt/blablabla # <= got it!
/containers/services/docker/tmp/upper/mnt/blablabla

4) 退出屏幕:Ctrl-a k y,脱离屏幕:Ctrl-a d

备注

有时您有机会遇到中断的屏幕会话,它看起来像是带有混乱符号的垃圾标准输出,但标准输入仍然可以正常工作。在这种情况下,尝试终止所有屏幕会话并重新连接到第一个。或者重新启动 docker 以获得 mac.

我创建了一个 PersistentVolume 并使用了 storageClassName(下面示例中的 local-storage)。确保用 Mac.

上的实际路径替换 path (/Users/user/data-pv1)
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv1
spec:
  capacity:
    storage: 30Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /Users/user/data-pv1
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - docker-desktop

如果您想访问 hostPath,您需要使用 nsenter:

docker run -it --rm --privileged --pid=host alpine:edge nsenter -t 1 -m -u -n -i sh

nsenter1

docker run -it --rm --privileged --pid=host justincormack/nsenter1

并导航到以下目录:

/var/lib/k8s-pvs