ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

minikube Persistent Volumes 完全指南:hostPath 持久化、动态供给与 CSI Hostpath Driver

minikube Persistent Volumes 完全指南:hostPath 持久化、动态供给与 CSI Hostpath Driver minikube Persistent Volumes 完全指南hostPath 持久化、动态供给与 CSI Hostpath Driver【免费下载链接】minikubeRun Kubernetes locally项目地址: https://gitcode.com/gh_mirrors/mi/minikube导读minikube 开箱即用地支持 Kubernetes 的 PersistentVolume 展开结合仓库源码详解三件事哪些目录在重启后仍然保留数据、如何手工创建 hostPath 静态 PV、以及 minikube 内置的存储动态供给控制器与 CSI Hostpath Driver 插件的工作原理让你在本地开发环境里放心地把数据库、缓存等有状态应用跑起来。一、开箱即用的 hostPath 持久卷minikube 原生支持hostPath类型的 PersistentVolume无需任何额外配置。这类 PV 的本质是把宿主机minikube VM 内部的一个目录以持久卷的形式暴露给集群中的 Pod。因为 minikube 本身运行在本地所以hostPath是成本最低、最贴合本地开发场景的存储方案。下面是官方文档给出的一个持久化数据到/data目录的静态 PV 配置示例apiVersion: v1 kind: PersistentVolume metadata: name: pv0001 spec: accessModes: - ReadWriteOnce capacity: storage: 5Gi hostPath: path: /data/pv0001/使用时通过kubectl apply -f提交该清单再创建引用它的 PVCPersistentVolumeClaim即可。这种静态供给方式适合需要精确控制数据落点例如指定某个固定路径的场景。注意hostPath属于节点级存储PV 与具体节点绑定。在单节点的 minikube 集群中这没有影响但在多节点集群中默认的 hostPath 供给器存在限制详见下文CSI Hostpath Driver一节。二、mount、持久化与 minikube 主机哪些目录会保留数据理解 minikube 的持久化关键要知道 VM 里哪些目录重启不丢。minikube 配置为持久化保存在以下目录中的文件这些目录在 minikube VM 中创建如果你使用--drivernone在裸机/本机运行时则直接位于你的 localhost 上目录说明/data*数据目录适合存放 PV 后端数据/var/lib/minikubeminikube 自身运行时数据/var/lib/dockerDocker 守护进程数据镜像、容器层等/var/lib/containerdcontainerd 运行时数据/var/lib/buildkitBuildKit 构建缓存/var/lib/containers容器/镜像相关数据/tmp/hostpath_pv*hostPath PV 的存放目录之一/tmp/hostpath-provisioner*内置存储供给器创建 PV 后端目录的根目录* 标记的目录是另一个目录的挂载点实际数据存储在/var之下或独立的数据磁盘上。重要提醒除上述目录外minikube VM 中其他目录中的文件在重启后可能丢失。如果你希望自己的数据跨minikube stop/minikube start甚至跨机器删除重建存活务必把数据放到上表目录中尤其是/data与/tmp/hostpath_pv。源码印证供给器默认写入/tmp/hostpath-provisioner从源码结构看内置存储供给器创建 PV 后端目录的默认根路径正是上表中的/tmp/hostpath-provisionercmd/storage-provisioner/main.go 中声明var pvDir /tmp/hostpath-provisioner随后调用storage.StartStorageProvisioner(pvDir)启动供给服务供给器 Pod 的部署清单 deploy/addons/storage-provisioner/storage-provisioner.yaml.tmpl 中将宿主机的/tmp目录以hostPath卷挂载进容器mountPath: /tmp使供给器写入的文件直接落在 VM 的持久化区域内。这也解释了为什么文档把/tmp/hostpath-provisioner列入持久化目录——动态供给出的每一个 PV 后端目录都创建在它下面。三、通过挂载主机目录实现持久化除了在 VM 内部使用静态 PV你还可以把宿主机物理机上的某个文件夹挂载进 minikube VM再基于挂载目录创建 PV实现本地代码/数据目录 ↔ 集群卷的互通。这是本地开发中最常用的持久化手段之一。minikube 提供mount命令例如把宿主机的/home/user/data挂载到 VM 的/mnt/dataminikube mount /home/user/data:/mnt/data挂载完成后/mnt/data同样属于持久化范畴数据真实存在于宿主机你可以apiVersion: v1 kind: PersistentVolume metadata: name: pv-mounted spec: accessModes: - ReadWriteOnce capacity: storage: 10Gi hostPath: path: /mnt/data创建该 PV 后集群中的 Pod 即可通过 PVC 绑定它。由于底层就是宿主机的真实目录你甚至可以直接在 IDE 里编辑这些文件做到本地文件即集群数据。四、动态供给内置 Storage Provisioner 工作原理minikube 不仅支持静态 PV还内置了一个非常简单、规范的动态存储控制器实现它随集群部署一起运行负责按需供给hostPath卷替代早期 Kubernetes 内置的 in-tree hostPath provider。它演示了如何把一个自定义存储控制器轻松接入 Kubernetes 作为系统存储组件并能为 Pod 动态提供持久化存储方便你测试 Pod 在挂载持久存储时的行为。4.1 这不是 CSI需要特别强调minikube 内置供给器不是基于 CSI 的存储提供方。它的工作方式更朴素——当控制器发现存在未满足的存储请求PVC时动态地声明一个hostpath类型的 PersistentVolume 对象来满足它。也就是说它不实现 CSI 的CreateVolume/DeleteVolumegRPC 接口而是直接通过 Kubernetes API 创建 PV 资源。4.2 供给器标识与核心流程内置供给器实现在 pkg/storage/storage_provisioner.go核心设计如下供给器名称const provisionerName k8s.io/minikube-hostpath它与 StorageClass 中的provisioner字段一一对应身份标识hostPathProvisioner结构体持有一个identity types.UID通过uuid.NewUUID()生成用于标识本供给器创建的 PV并在删除时做归属校验供给Provision收到 PVC 请求后在pvDir即/tmp/hostpath-provisioner下创建namespace/pvc-name目录显式chmod 0777不受 umask 影响然后构造一个PersistentVolume对象返回容量来自 PVC 的资源请求options.PVC.Spec.Resources.Requests[core.ResourceStorage]accessModes沿用 PVC 声明reclaimPolicy取自 StorageClass卷类型为HostPath路径指向刚创建的目录并在 PV 上打上hostPathProvisionerIdentity注解删除Delete删除 PV 时先校验hostPathProvisionerIdentity注解是否与自身身份一致不一致则返回controller.IgnoredError交给控制器忽略一致则os.RemoveAll清理后端目录启动StartStorageProvisioner通过rest.InClusterConfig()获取集群内配置创建 clientset读取服务端版本然后用controller.NewProvisionController(clientset, provisionerName, hostPathProvisioner, serverVersion.GitVersion)启动供给控制器并pc.Run(context.Background())常驻运行。4.3 部署形态与默认 StorageClass供给器以独立 Pod 形式部署在kube-system命名空间清单见 deploy/addons/storage-provisioner/storage-provisioner.yaml.tmpl使用storage-provisionerServiceAccount并通过 ClusterRoleBinding 绑定system:persistent-volume-provisioner集群角色hostNetwork: true容器直接以宿主机网络运行命令为/storage-provisioner以hostPath方式把宿主机/tmp挂载到容器/tmp供供给器在 VM 持久化目录内创建 PV 后端目录。同时minikube 会创建一个名为standard的默认 StorageClass见 deploy/addons/storageclass/storageclass.yamlkind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: standard annotations: storageclass.kubernetes.io/is-default-class: true provisioner: k8s.io/minikube-hostpath由于它被标记为默认 StorageClass不指定storageClassName的 PVC 会自动走动态供给由k8s.io/minikube-hostpath供给器创建 hostPath PV——这正是本地开发中最省事的用法apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mypvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi提交后无需关心 PV 如何创建kubectl get pv即可看到自动生成的后端卷。4.4 相关 addon 与行为验证storage-provisioner与default-storageclass都是可开关的 addon注册于 pkg/addons/config.gopkg/addons/addons_storage_classes.go 展示了切换默认 StorageClass的完整逻辑defaultStorageClassProvisioner standard而storage-provisioner-rancheraddon 则使用local-path作为供给器启用后通过storageclass.SetDefaultStorageClass把对应类标记为默认集成测试 test/integration/addons_test.go 中也包含对 CSI hostpath 驱动的端到端验证创建 PVC、挂载 PV 的 Pod、创建快照、再从快照恢复 PVC 与 Pod见其中validateCSIDriverAndSnapshots测试。五、CSI Hostpath Driver addon多节点与快照当单节点的内置供给器无法满足需求时minikube 还提供了CSI Hostpath Driveraddon对应教程见 site/content/en/docs/tutorials/volume_snapshots_and_csi.md它带来两个关键能力多节点集群支持默认的 hostPath 供给器不支持多节点集群详见 site/content/en/docs/tutorials/multi_node.md 的说明。而csi-hostpath-driveraddon 以 DaemonSet 形式在每个节点上运行 hostpath 驱动从而支持在多节点集群中供给与声明卷卷快照Volume Snapshot内置供给器不实现 CSI 接口因此无法创建/处理快照CSI 驱动则补上了这一能力。启用方式minikube addons enable volumesnapshots minikube addons enable csi-hostpath-drivervolumesnapshotsaddon 负责部署快照所需的 CRD 与 Volume Snapshot Controller默认禁用csi-hostpath-driveraddon 将驱动资源部署到kube-system命名空间驱动名为hostpath.csi.k8s.io并创建一个专用 StorageClasscsi-hostpath-sc清单见 deploy/addons/csi-hostpath-driver/deploy/csi-hostpath-storageclass.yamlprovisioner: hostpath.csi.k8s.ioPVC 需要显式引用该 StorageClass在 pkg/addons/config.go 中csi-hostpath-driveraddon 带有isVolumesnapshotsEnabled校验即启用它之前需要先启用volumesnapshotsCSI 驱动创建的所有持久卷数据存放在 minikube 主机的/var/lib/csi-hostpath-data/目录中。如需让 CSI 类成为默认存储可以参考教程中的做法禁用内置供给器相关 addon再把csi-hostpath-sc打上默认类注解minikube addons disable storage-provisioner minikube addons disable default-storageclass kubectl patch storageclass csi-hostpath-sc -p {metadata: {annotations:{storageclass.kubernetes.io/is-default-class:true}}}六、总结与选型建议场景推荐方案数据落点单节点、快速验证有状态应用静态 hostPath PV写入/data等持久化目录VM 内持久化目录单节点、想省去 PV 管理默认 StorageClassstandard动态供给/tmp/hostpath-provisioner/ns/pvc需要与宿主机文件互通minikube mount hostPath PV宿主机真实目录多节点集群csi-hostpath-driveraddon/var/lib/csi-hostpath-data/需要卷快照/恢复volumesnapshotscsi-hostpath-driver/var/lib/csi-hostpath-data/总而言之minikube 的持久化体系围绕VM 内持久化目录 hostPath 卷 内置动态供给控制器构建静态 PV 适合精确控制standardStorageClass 让 PVC 即申即得而 CSI Hostpath Driver 则把能力延伸到多节点与快照场景。只要把数据放到文档列出的持久化目录内你的本地集群数据就能在重启、重建之间安稳保留。【免费下载链接】minikubeRun Kubernetes locally项目地址: https://gitcode.com/gh_mirrors/mi/minikube创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表