
# 使用k8clone工具进行集群备份恢复
CCE备份恢复为无状态和有状态应用的备份和恢复提供了一套可靠、安全、灵活且高效的解决方案。通过遵循CCE备份恢复的全流程指导，您可以顺利地完成应用的备份和恢复。
![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/note_3.0-zh-cn.png)
建议在用户业务量小时执行备份和恢复操作。
#### 方案优势
- 易用性：在应用备份和恢复阶段，已实现工具自动化。这些工具免安装，简单轻量且配置灵活。

- 多版本：支持在维版本的应用备份和恢复。版本策略详情请参阅[Kubernetes版本策略](https://support.huaweicloud.com/bulletin-cce/cce_bulletin_0033.html)。

- 无依赖：工具不需要任何外部依赖，可以独立运行。

- 多架构：工具支持在x86和ARM的Linux环境中运行。

- 不停机：过程无需停机，不影响集群内的业务。
 
#### 数据备份及恢复原理
k8clone是一个简便的Kubernetes元数据克隆工具，它可以将Kubernetes元数据（如Deployment、ConfigMap、Service）保存为本地压缩包，实现应用备份能力。同时可以将本地压缩包恢复回Kubernetes元数据，实现应用的恢复能力。
数据备份的流程参考如下：
图1数据备份流程   
![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001552293325.png "点击放大")
数据恢复的流程参考如下：
图2数据恢复流程   
![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001533981869.png "点击放大")
在执行恢复操作前，需要准备一个数据恢复配置文件"restore.json"，目的是在应用恢复时自动更换PVC、StatefulSet的存储类名称，以及工作负载所使用镜像的Repository地址。
文件内容如下：
```
{
    "StorageClass": 
          "OldStorageClassName": "NewStorageClassName"  //支持修改PVC、StatefulSet的StorageClassName字段
    "ImageRepo": 
          "OldImageRepo1": "NewImageRepo1",   //eg:"dockerhub.com": "cn-north-4.swr.huaweicloud.com"
          "OldImageRepo2": "NewImageRepo2",   //eg:"dockerhub.com/org1": "cn-north-4.swr.huaweicloud.com/org2"
          "NoRepo": "NewImageRepo3"   //eg:"golang": "swr.cn-north-4.myhuaweicloud.com/paas/golang"
}
```
- StorageClass：支持PVC、有状态应用VolumeClaimTemplates中存储类名称按照配置进行自动更换。
- ImageRepo：支持工作负载所使用镜像的Repository地址的更换，工作负载包括Deployment（含initContainer）、StatefulSet、Orphaned Pod、Job、CronJob、Replica Set、Replication Controller、DaemonSet。
 
#### 准备工作
**资源要求**
在开始进行备份恢复工作之前，请确保您已经准备了一台安装了kubectl的服务器，用来连接集群。工具支持在Linux（x86、ARM）环境中运行，因此您可以任选一种架构的服务器作为操作服务器。该服务器需要至少拥有5GB左右的本地磁盘空间和≥8G的内存，以确保工具可以正常运行，并存储相关数据。
**工具获取**
在安装了kubectl的服务器上下载以下工具：
| 工具      | 说明                                                                           | 下载链接                                                                                                                                                                                                                                     |
|:---|:---|:---|
| k8clone | k8clone是一个简便的Kubernetes元数据克隆工具，它可以将Kubernetes元数据（对象）保存为本地压缩包，然后将这些元数据恢复到集群中。 | Linux x86：<https://ucs-migration.obs.cn-north-4.myhuaweicloud.com/toolkits/k8clone-linux-amd64> Linux arm：<https://ucs-migration.obs.cn-north-4.myhuaweicloud.com/toolkits/k8clone-linux-arm64> |
   
使用工具前，需要运行**chmod u+x**命令（例如 chmod u+x k8clone-linux-amd64），授予工具可执行权限。
#### 备份操作步骤
1. 通过kubectl连接源集群。具体方法可参考[使用kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html#section3)。
2. 进入k8clone工具所在目录，执行备份命令，即可备份数据到本地目录，并打包成压缩包。 
   [k8clone备份使用方法]的示例中提供了几种常见的备份方式，您可以按需选择，也可以自定义备份方式。
   ![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/caution_3.0-zh-cn.png)
   当PV回收策略为Delete时，在恢复阶段PV先于PVC恢复，会触发Kubernetes删除PV对象，同时移除所关联的底层存储资源。因此，当集群中存在回收策略为Delete的PV资源时，默认会排除PV资源类型的备份，避免底层存储资源被误删。您需要通过复制YAML到新集群创建的方式进行恢复。
   关于PV回收策略，请参见[存储基础知识](https://support.huaweicloud.com/usermanual-cce/cce_10_0378.html#section5)。
   
   
 
#### 恢复操作步骤
1. 通过kubectl连接目标集群。
2. 准备数据恢复配置文件：restore.json。 
   新建一个restore.json文件，按照格式修改，并将文件放置在k8clone工具所在目录下。
   示例：
   ```
   {
     "StorageClass": {
       "csi-disk": "csi-disk-new"
     },
     "ImageRepo": {
       "quay.io/coreos": "swr.cn-north-4.myhuaweicloud.com/paas"
     }
   }
   ```
   
   
3. 进入k8clone工具所在目录，执行恢复命令，将备份数据恢复到目标集群。 
   示例：
   **./k8clone-linux-amd64 restore -d ./k8clone-dump.zip -f ./restore.json**
   
   
 
 #### k8clone备份使用方法
![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/note_3.0-zh-cn.png)
k8clone工具支持在Linux（x86、arm）和Windows环境中运行，使用方法相似。本文将以Linux（x86）环境为例进行介绍。
若使用Linux（arm）或Windows环境，请将下述命令中的**k8clone-linux-amd64** 分别替换为**k8clone-linux-arm64** 或**k8clone-windows-amd64.exe**。
在使用k8s restore时， 默认跳过回收策略为Delete的PersistentVolume对象，用户可进行手动处理。
在k8clone工具所在目录下执行**./k8clone-linux-amd64 backup -h**，可以查看k8clone工具备份的使用方法。
- -k, --kubeconfig：指定kubectl的KubeConfig位置，默认是$HOME/.kube/config。kubeConfig文件：用于配置对Kubernetes集群的访问，KubeConfig文件中包含访问注册Kubernetes集群所需要的认证凭据以及Endpoint（访问地址），详细介绍可参见[Kubernetes文档](https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/)。
- -s, --api-server：Kubernetes API Server URL，默认是""。
- -q, --context：Kubernetes Configuration Context，默认是""。
- -n, --namespace：备份指定命名空间的云原生应用，多个命名空间用逗号分隔（如：ns1,ns2,ns3），默认是""，表示备份整个集群。
- -e, --exclude-namespaces：排除指定命名空间对象的备份，不能和--namespace一起使用。
- -x, --exclude-kind：排除指定资源类型的备份。
- -i, --include-kind : 指定资源类型的备份。
- -y, --exclude-object：排除指定资源对象的备份。
- -z, --include-object：指定资源对象的备份。
- -w, --exclude-having-owner-ref：排除拥有ownerReferences资源对象的备份，默认是false。布尔类型传参过程中需要带上等号，如："-w=true" ，"-w true"不会生效,它将使用默认值。
- -d, --local-dir：备份数据放置的路径，默认是当前目录下k8clone-dump文件夹。
```
$ ./k8clone-linux-amd64 backup -h
Backup Workload Data as yaml files
Usage:
    k8clone backup [flags]
Flags:
   -s, --api-server string            Kubernetes api-server url
   -q, --context string               Kubernetes configuration context
   -w, --exclude-having-owner-ref     Exclude all objects having an Owner Reference. The default value is false. The equal sign (=) must be added when a Boolean parameter is transferred, for example, -w=true. -w  true does not take effect, and the default value will be used.
   -x, --exclude-kind strings         Resource kind to exclude. Eg. 'deployment'
   -i, --include-kind strings         Resource kind to include. Eg. 'deployment'
   -e, --exclude-namespaces strings   Namespaces to exclude. Eg. 'temp.*' as regexes. This collects all namespaces and then filters them. Don't use it with the namespace flag.
   -y, --exclude-object strings       Object to exclude. The form is '<kind>:<namespace>/<name>',namespace can be empty when object is not namespaced. Eg. 'configmap:kube-system/kube-dns'
   -z, --include-object strings       Object to include. The form is '<kind>:<namespace>/<name>',namespace can be empty when object is not namespaced. Eg. 'configmap:kube-system/kube-dns' 
   -h, --help                         help for backup
   -k, --kubeconfig string            The kubeconfig of k8s cluster's. Default is the $HOME/.kube/config. 
   -d, --local-dir string             Where to dump yaml files (default "./k8clone-dump")
   -n, --namespace string             Only dump objects from this namespace
```
示例如下：
- 整个集群对象的备份，默认路径为当前目录下"k8clone-dump"文件夹 **./k8clone-linux-amd64 backup**
  
- 整个集群对象的备份，并指定备份数据路径 **./k8clone-linux-amd64 backup -d ./xxxx**
  
- 指定命名空间对象的备份 **./k8clone-linux-amd64 backup -n default**
  
- 排除命名空间对象的备份 **./k8clone-linux-amd64 backup -e kube-system,kube-public,kube-node-lease**
  
- 排除指定资源类型的备份 **./k8clone-linux-amd64 backup -x endpoints,endpointslice**
  
- 指定资源类型的备份 **./k8clone-linux-amd64 backup -i rolebinding**
  
- 排除指定资源对象的备份 **./k8clone-linux-amd64 backup -y configmap:kube-system/kube-dns**
  
- 指定资源对象的备份 **./k8clone-linux-amd64 backup -z configmap:kube-system/kube-dns**
  
- 排除拥有ownerReferences资源对象的备份 **./k8clone-linux-amd64 backup -w=true**
  
 
#### k8clone恢复使用方法
![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/note_3.0-zh-cn.png)
k8clone工具支持在Linux（x86、arm）和Windows环境中运行，使用方法相似。本文将以Linux（x86）环境为例进行介绍。
若使用Linux（arm）或Windows环境，请将下述命令中的**k8clone-linux-amd64** 分别替换为**k8clone-linux-arm64** 或**k8clone-windows-amd64.exe**。
在使用k8s restore时， 默认跳过回收策略为Delete的PersistentVolume对象，用户可进行手动处理。
在k8clone工具所在目录下执行**./k8clone-linux-amd64 restore -h**，可以查看k8clone工具恢复的使用方法。
- -k, --kubeconfig：指定kubectl的KubeConfig位置，默认是$HOME/.kube/config。kubeConfig文件：用于配置对Kubernetes集群的访问，KubeConfig文件中包含访问注册Kubernetes集群所需要的认证凭据以及Endpoint（访问地址），详细介绍可参见[Kubernetes文档](https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/)。
- -s, --api-server：Kubernetes API Server URL，默认是""。
- -q, --context：Kubernetes Configuration Context，默认是""。
- -f, --restore-conf：指定restore.json的路径，默认是k8clone工具所在目录下。
- -d, --local-dir：备份数据放置的路径，默认是k8clone工具所在目录下。
```
$ ./k8clone-linux-amd64 restore -h
ProcessRestore from backup
Usage:
     k8clone restore [flags]
Flags:
   -s, --api-server string     Kubernetes api-server url
   -q, --context string        Kubernetes configuration context
   -h, --help                  help for restore
   -k, --kubeconfig string     The kubeconfig of k8s cluster's. Default is the $HOME/.kube/config. 
   -d, --local-dir string      Where to restore (default "./k8clone-dump.zip")
   -f, --restore-conf string   restore conf file (default "./restore.json")
```
示例：
**./k8clone-linux-amd64 restore -d ./k8clone-dump.zip -f ./restore.json**
