摘要:apiVersion: backup.appuio.ch/v1alpha1 kind: Restore metadata: name: restore2pvc namespace: default spec: backend: repoPasswordSecretRef: key: password name: backup s3: accessKeyIDSecretRef: key: token name: s3secret bucket: dustise endpoint: https://s3.amazonaws.com secretAccessKeySecretRef: key: key name: s3secret restoreMethod: folder: claimName: restore。k8up 會選擇命名空間中註解爲 appuio.ch/backup: "true" 的 PVC 進行備份,我們用下文的工作負載生成兩個 PVC,運行起來之後,兩個 PVC 分別掛載到容器的 /data1 和 /data2 目錄中,可以登錄到 Pod,在其中生成文件:。

k8up 是一個基於 Restic 的備份工具,可以一次性的或者週期性的把指定的 PVC 備份到 S3 協議的對象存儲上去,備份內容還可以使用 Restic 恢復到 S3 或者 PVC 上。除了 PVC,後續還可以用命令的方式,例如 mysqldump ,把數據庫等內容備份出來。

安裝和初始化

Helm 安裝即可:

helm repo add appuio https://charts.appuio.ch
helm repo update
helm install appuio/k8up

安裝過程會生成一系列的 CRD,會在後續步驟中使用。

後續過程中需要兩個 Secret,分別用來加密備份和訪問 S3:

$ kubectl create secret generic s3secret --from-literal token=[hidden] \
    --from-literal key=[hidden]
secret/s3secret created
$ kubectl create secret generic backup --from-literal password=PassW0rd
secret/backup created

備份 PVC

k8up 會選擇命名空間中註解爲 appuio.ch/backup: "true" 的 PVC 進行備份,我們用下文的工作負載生成兩個 PVC,運行起來之後,兩個 PVC 分別掛載到容器的 /data1/data2 目錄中,可以登錄到 Pod,在其中生成文件:

$ kubectl exec -it debugger-7b8f654484-hrcg9 bash
bash-4.4# echo "Hello world" > /data/data.txt

創建一次性任務:

apiVersion: backup.appuio.ch/v1alpha1
kind: Backup
metadata:
  name: backup-now
spec:
  keepJobs: 4
  backend:
    repoPasswordSecretRef:
      name: backup
      key: password
    s3:
      endpoint: https://s3.amazonaws.com
      bucket: dustise
      accessKeyIDSecretRef:
        name: s3secret
        key: token
      secretAccessKeySecretRef:
        name: s3secret
        key: key

查看 Pod 日誌:

$ kubectl logs -f k8up-1578112449-84d7d4d6cc-q6qsh
2020/01/04 14:30:10 [INFO] New backup job received backup-now in namespace default
2020/01/04 14:30:10 [INFO] Listing all PVCs with annotation appuio.ch/backup in namespace default
2020/01/04 14:30:10 [INFO] Adding data to list
...
2020/01/04 14:30:29 [INFO] default/backupjob-1578148210 is running
2020/01/04 14:30:37 [INFO] default/backupjob-1578148210 finished successfully

兩個卷的備份均已完成,查看 S3 的情況:

$ s3cmd la
                       DIR   s3://dustise/data/
                       DIR   s3://dustise/index/
                       DIR   s3://dustise/keys/
                       DIR   s3://dustise/snapshots/
2020-01-04 14:30       155   s3://dustise/config

發現已經初始化了一個備份結構。

還原

備份成功之後,我們希望還原一下,看看備份的內容。

新建一個 PVC 用作還原目標:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: restore
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

創建一個還原命令:

apiVersion: backup.appuio.ch/v1alpha1
kind: Restore
metadata:
  name: restore2pvc
  namespace: default
spec:
  backend:
    repoPasswordSecretRef:
      key: password
      name: backup
    s3:
      accessKeyIDSecretRef:
        key: token
        name: s3secret
      bucket: dustise
      endpoint: https://s3.amazonaws.com
      secretAccessKeySecretRef:
        key: key
        name: s3secret
  restoreMethod:
    folder:
      claimName: restore

查看運行日誌:

$ kubectl logs -f k8up-1578112449-84d7d4d6cc-q6qsh
2020/01/04 14:43:45 [INFO] Received restore job restore-now in namespace default
2020/01/04 14:43:45 [INFO] default/restorejob-1578149025 is running
2020/01/04 14:43:45 [INFO] default/restorejob-1578149025 is running
2020/01/04 14:43:59 [INFO] default/restorejob-1578149025 is running
2020/01/04 14:44:15 [INFO] default/restorejob-1578149025 finished successfully

查看該卷內容,會發現其中有一個 data/data 目錄,包含了我們的備份內容。

附錄

連接

  • https://k8up.io/

  • https://github.com/restic/restic

源碼

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: debugger
  name: debugger
spec:
  replicas: 1
  selector:
    matchLabels:
      app: debugger
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: debugger
    spec:
      containers:
      - image: dustise/sleep
        name: sleep
        resources: {}
        volumeMounts:
        - name: data
          mountPath: /data
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: data
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: data
  annotations:
    appuio.ch/backup: "true"
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
相關文章