我想设置一个由 kind 集群中的 Pod 共享的持久卷(PV 和 PVC)。但是,我需要确保数据也保留在我的笔记本电脑(主机服务器)上。因此,该卷的路径应该在我的笔记本电脑上,我可以直接访问。
如果我删除
kind cluster
,该卷应该会被保留而不是被破坏。
我还希望能够在我的笔记本电脑主机上轻松添加、更新或复制该卷中的文件。
如何让
Kind cluster
中的 Pod 知道此设置?
请找到我的
kind.yaml
文件供您参考。
$ kind
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker
创建类型集群时,您可以指定要安装在虚拟节点上的主机目录。如果这样做,那么您可以使用
hostPath
存储配置卷,它们将引用节点上的安装路径。
因此您将创建一个配置文件:
apiVersion: kind.x-k8s.io/v1alpha4
kind: Cluster
nodes:
- role: control-plane
extraMounts:
- hostPath: /home/bill/work/foo
containerPath: /foo
然后运行
kind create cluster --config kind-config.yaml
创建集群。
在 Kubernetes YAML 文件中,您需要将其挂载为节点上的“主机路径”。 Pod 规范可能包含部分内容:
containerPath
请注意,此设置对于种类来说是极其特定的。一般来说,主机路径不是可靠的存储:您无法控制将 Pod 安排在哪个节点上,并且在现实集群中 Pod 和节点都可能被删除。在某些托管设置(AWS EKS、Google GKE)中,您可能根本无法控制主机内容。
您可能会重新审视您的应用程序设计,以尽量减少对“文件”作为第一类对象的需求。考虑部署一个包含更新内容的新 Docker 镜像,而不是“更新卷”;考虑可以通过入口控制器公开的 HTTP 服务,而不是“复制文件”。
volumes:
- name: foo
hostPath:
path: /foo # matches kind containerPath:
containers:
- name: foo
volumeMounts:
- name: foo
mountPath: /data # in the container filesystem
,您应该使用
Kind
,这样真实集群上的配置只会在pv的定义上有所不同。因此,如果您在 Kind 集群上配置 extraMounts:
pv / pvc
然后在该集群上创建 PV 和 PVC:
apiVersion: kind.x-k8s.io/v1alpha4
kind: Cluster
nodes:
- role: control-plane
extraMounts:
- hostPath: /home/bill/work/www
containerPath: /www
之后您可以像这样在部署中使用它:
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-www
spec:
storageClassName: standard
accessModes:
- ReadWriteOnce
capacity:
storage: 2Gi
hostPath:
path: /www/
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-www
spec:
volumeName: pv-www
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
因此,您本地的
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
volumes:
- name: www
persistentVolumeClaim:
claimName: pvc-www
containers:
- name: nginx
image: nginx:1.14.2
volumeMounts:
- name: www
mountPath: /var/www
将被安装到容器内的
/home/bill/work/www
。/var/www
因此,您的主机(笔记本电脑)中的路径是
...
extraMounts:
- hostPath: /home/bill/work/www
containerPath: /www
...
,kubernetes 节点中的路径是
/home/bill/work/www
您正在运行,并且可以利用它正在运行 docker 的事实来检查节点。做一个
/www
这将向您展示那种 docker 镜像,它们都是 kubernetes 节点。因此,您可以通过从上面的 docker ps -a 获取 CONTAINER_ID 来检查节点并执行 a
docker ps -a
现在您已经在该节点上运行了一个 shell。检查节点是否正确安装了您的主机文件系统
只需检查
docker exec -it CONTAINER_ID /bin/bash
在节点上。你应该看到
ls /www
的内容因此,您所归档的是节点文件系统的这一部分由主机(笔记本电脑)保存。因此,您可以销毁集群并使用相同的 kind-config 文件重新创建它。节点将重新挂载并且不会丢失任何信息。
因此,通过此工作设置,您可以创建一个持久卷 (pv),并使用如上所述的持久卷声明 (pvc) 声明此 pv。
希望这有帮助。
/home/bill/work/www
和
Persistent Volume (PV)
并将数据保留在您的笔记本电脑上,您可以按照以下步骤操作:在您的笔记本电脑上创建一个目录作为 PV。
为 PV 和 PVC 创建一个 YAML 文件,指定笔记本电脑上目录的路径作为 PV 的源。
将 YAML 文件应用到您的 KIND 集群以创建 PV 和 PVC。
在您的 pod 规范中,通过名称引用 PVC 来挂载卷。
以下是 PV 和 PVC 的 YAML 文件示例:
Persistent Volume Claim (PVC)
要应用 YAML 文件,请运行:
apiVersion: v1
kind: PersistentVolume
metadata:
name: mypv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /path/to/your/laptop/directory
persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
在您的 Pod 规范中,通过名称引用 PVC 来挂载卷:
kubectl apply -f pv-pvc.yaml
注意:需要调整并测试。