Kubernetes数据持久化的几种方法
- 2025-10-14 18:28:00
- 丁国栋
- 原创 38
先看看存储是如何挂载给Pod的:
JSON PATH: spec.template.spec.containers.[].volumeMounts
volumeMounts: - mountPath: /data name: data subPath: gitfox
数据持久化的几种类型
使用 pvc
volumes: - name: data persistentVolumeClaim: claimName: app-mysql-data
使用 hostPath
JSON PATH: spec.template.spec.volumes
volumes: - hostPath: path: /data/local/quickon-app/gitfox-data type: DirectoryOrCreate name: data
注意:hostPath 类型通常与 sepc.template.spec.nodeSelector 一起使用。
关于hostPath的命名规范可以参考 selfLink(在 Kubernetes 中,selfLink是 API 对象元数据(metadata)中的一个字段,用于表示该对象的唯一 API 路径。它的主要用途是提供一种标准化的方式来表示和访问该资源。selfLink可以用于唯一标识资源,例如:/apis/apps/v1/namespaces/qc-system/deployments/app 表示这是一个位于 qc-system命名空间下、名为 app 的 Deployment资源)。例如 /data/namespaces/qc-system/deployments/app/data/。
使用 secret
volumes: - name: ssl secret: defaultMode: 420 secretName: tls-thedf-cc
使用 configMap
volumes: - configMap: defaultMode: 420 name: gitfox-nginx name: nginx
如何将一个pvc转换成hostPath
可以将应用设置为数据只读,防止应用写入数据卷。
如果卷的管理器能自行备份或快照导出也是个办法。
如果应用自带备份功能,可以给Pod新增一个hostPath类型的存储,将数据备份到hostPath中,或者直接把应用数据同步到hostPath中。
查询pvc名称:
kubectl get pod -n namespaceName podName -o json | jq '.spec.volumes[].persistentVolumeClaim'得到 persistentVolumeClaim 名称 claimName,通过这个名称过滤得到persistentvolume 名称
kubectl get persistentvolume |grep <claimName>
通过 Pod 获取Pod所在的节点
kubectl get pod -o wide
如果应用无法设置为只读,那只能将应用关闭,再额外创建一个“空”Pod挂载数据卷,再把数据导出。
如果卷的管理器能自行备份或快照导出也是个办法。
如果需要创建一个不会写入数据卷的Pod可以这样:apiVersion: v1 kind: Pod metadata: name: volume-export-pod spec: containers: - name: exporter image: nginx:stable-bookworm volumeMounts: - name: longhorn-volume mountPath: /data volumes: - name: longhorn-volume persistentVolumeClaim: claimName: app-mysql-data nodeSelector: kubernetes.io/hostname: hostname
登录该节点,通过 mount |grep persistentvolumeName 得到在节点上的挂载路径,将数据复制到本机目录
通过以下命令获取节点的唯一label:kubernetes.io/hostname
kubectl get node nodeName -o json |jq '.metadata.labels'
--
发表评论