如何访问 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
如果您创建此资源,这应该会在您的主机中保存文件。
感谢@aman-tuladhar 和在互联网上浪费的一些时间,我发现您只需要确保为您设置 storageClassName
PersistentVolume和 PersistentVolumeClaim。
根据 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
docker run -it --rm --privileged --pid=host justincormack/nsenter1
并导航到以下目录:
/var/lib/k8s-pvs
我想在我的本地计算机 (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
如果您创建此资源,这应该会在您的主机中保存文件。
感谢@aman-tuladhar 和在互联网上浪费的一些时间,我发现您只需要确保为您设置 storageClassName
PersistentVolume和 PersistentVolumeClaim。
根据 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
docker run -it --rm --privileged --pid=host justincormack/nsenter1
并导航到以下目录:
/var/lib/k8s-pvs