Kubernetes数据持久化的几种方法

2025-10-14 18:28:00
丁国栋
原创 38
摘要:本文记录Kubernetes如何实现数据持久化的。

先看看存储是如何挂载给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'



--



发表评论
博客分类