最近在 K3s 集群里部署了 Longhorn,创建的每个 PVC 会有两个副本,这样某个 VPS 宕机,还有副本可以继续提供服务。但是之前已经有一些 Pod 使用的 local-path 的方式挂载的 PVC。所以准备迁移他们到 Longhorn 上。

迁移步骤

创建新的 PVC

首先在 Longhorn 上创建一个新的 PVC。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: freshrss-pvc-new # 新创建的 PVC 名字
spec:
  storageClassName: longhorn
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi # 设置为与原 PVC 相同或更大的大小

创建一个 pod

然后创建一个 Pod,同时挂载两个 PVC。

apiVersion: v1
kind: Pod
metadata:
  name: migrator
spec:
  containers:
    - name: migrator
      image: busybox
      command: ["/bin/sh", "-c", "sleep 3600"]
      volumeMounts:
        - name: old-volume
          mountPath: /old
        - name: new-volume
          mountPath: /new
  volumes:
    - name: old-volume
      persistentVolumeClaim:
        claimName: freshrss-pvc # 原 PVC 名字
    - name: new-volume
      persistentVolumeClaim:
        claimName: freshrss-pvc-new # 新创建的 PVC 名字

在 Pod 里复制

cp -a /old/. /new/

修改 deployment 里面的 PVC

将 deployment 里面的 PVC 信息改成新的,就可以了。
如果 PVC 只允许挂载一个 Pod,就需要将前面的 migrator 这个 Pod 删掉。