Kubernetes数据持久化的几种方法

2025-10-14 18:28:00
丁国栋
原创 148
摘要:本文记录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

如果 configMap 是单个文件,需要将这个文件挂载在某个目录下,volumeMounts 需要这样编写:


        volumeMounts:
        - mountPath: /root/.cos.yaml
          name: coscli-config
          subPath: .cos.yaml
      volumes:                         
      - configMap:                
          defaultMode: 420    
          name: coscli-config     
        name: coscli-config 
--


如何将一个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'

创建 PVC(PersistentVolumeClaim)

存储类 nfs-client 为例,创建一个名称为 app-data 访问模式为RWX(卷可以被多个节点以读写方式挂载)的持久卷申领

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    volume.beta.kubernetes.io/storage-provisioner: cluster.local/nfs-subdir-external-provisioner
    volume.kubernetes.io/storage-provisioner: cluster.local/nfs-subdir-external-provisioner
  finalizers:
  - kubernetes.io/pvc-protection
  name: app-data
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: nfs-client

--



发表评论
博客分类