华为云:E-Backup容器迁移实验

弹性云服务器创建完成后,登录ECS

1.2 源端CCE集群节点创建
1.3 安装E-Backup插件
单击“cce-source”集群,进入集群控制台,在左边导航栏的“命名空间”当中,创建名为“velero”的命名空间。
在插件管理页面,安装E-Backup插件,配额参数保持默认。
1.4 部署MySQL服务在集群控制台,选择左侧菜单栏“工作负载”,单击右上角“创建负载”
创建MySQL服务,填写工作负载参数如下:
负载类型:有状态负载负载
名称:mysql命名空间:
default实例数量:1
容器配置的基本信息参数如下:
镜像名称:mysql
镜像版本:5.7

 

在环境变量页面设置四个环境变量参数:
MYSQL_ROOT_PASSWORD:MySQL的root用户密码“password@123”。
MYSQL_DATABASE:镜像启动时要创建的数据库名称“database”。
MYSQL_USER:数据库用户名称“db_user”。
MYSQL_PASSWORD:数据库用户密码“password@123”。

在创建服务页面设置服务参数如下:Service名称:mysql访问类型:集群内访问ClusterIP端口配置:服务端口3306,容器端口3306(mysql镜像的默认访问端口默认为3306,所以容器端口设置为3306,访问端口可以设置为其他端口号,但这里也设置成3306是为了方便使用)这样在集群内部,通过服务名称:访问端口就可以访问MySQL负载,也就是mysql:3306。
1.5 部署WordPress服务首先,购买访问WordPress所需的弹性负载均衡,进入弹性负载均衡控制台页面,点击右上角“购买弹性负载均衡”,配置弹性负载均衡参数。
首先,购买访问WordPress所需的弹性负载均衡,进入弹性负载均衡控制台页面,点击右上角“购买弹性负载均衡”,配置弹性负载均衡参数。
弹性负载均衡参数配置如下:
实例规格类型:
共享型区域:华北-北京四所属
VPC:vpc-cce子网:subnet-cce
弹性公网IP:新创建
弹性公网IP类型:全动态BGP
公网带宽:按流量计费
带宽:5
名称:elb-cce

接下来创建WordPress工作负载,同样在集群控制台的工作负载页面,点击右上角的“创建负载”,工作负载基本信息如下:
负载类型:无状态负载负载
名称:wordpress
命名空间:default
实例数量:1
容器配置的基本信息参数如下:
镜像名称:wordpress
镜像版本:php7.3

在环境变量页面设置四个环境变量参数,让WordPress知道MySQL数据库的信息,根据前面mysql负载的配置:
WORDPRESS_DB_HOST:mysql:3306
WORDPRESS_DB_USER:db_user
WORDPRESS_DB_PASSWORD:password@123
WORDPRESS_DB_NAME:database

在创建服务页面设置服务参数如下:
访问类型:负载均衡LoadBalancer
负载均衡器:elb-cce
服务亲和:保持默认
端口配置:服务端口8000(该端口号将映射到容器端口),容器端口80(容器中应用启动监听的端口)点击右下角“确定”。

1.6 创建PV及PVC
首先创建SFS Turbo文件系统,在控制台服务列表找到存储类服务中的“弹性文件服务SFS”并点击。
在SFS Turbo页面,点击右上角“创建文件系统”。
接下来进行PV及PVC的创建,在cce-source集群控制台,点击到“容器存储”页面,点击“存储卷”,点击右上角“创建存储卷”。
在“创建存储卷”页面,选择存储卷类型为“急速文件存储”,急速文件存储中选择步骤五中创建的“sfs-turbo-source”,PV名称命名为“pv-efs-source”,其余参数保持不变,点击右下角“创建”。
存储卷创建完成后,在存储卷声明页面。点击“创建存储卷声明”。
在创建存储卷声明页面,创建方式选择“使用已有存储卷”,PVC名称命名为“pvc-source”,存储卷类型选择“急速文件存储”,关联存储卷选择刚才创建的“pv-efs-source”,点击右下角“创建”。

1.7 进行数据持久化挂载进入工作负载页面,并点击mysql工作负载。
在mysql工作负载中,点击“容器管理”,并点击右下方的“编辑”。
在生命周期页面,填写以下运行命令:
/bin/bash

并填写以下运行参数:
-c
rm -rf  /var/lib/mysql/lost+found;docker-entrypoint.sh mysqld;

在数据存储页面,点击“数据卷声明”,并点击下面的“+”号。
选择刚才创建的存储卷声明“pvc-source”,点击“确定”。
在挂载路径处填写“/var/lib/mysql”,表示挂载到容器的以上路径下,点击右下角“升级工作负载”,确认YAML文件后,点击“提交”,并等待mysql工作负载恢复至运行中。
2 迁移准备工作
2.1 创建OBS桶创建备份存储OBS桶,在控制台找到“对象存储服务OBS”并进入,在对象存储服务的桶列表页面,点击右上角“创建桶”。

2.2 创建并下载密钥
右上角华为云用户名处,点击“我的凭证”。

 

  • 下载kubernetes包
wget https://dl.k8s.io/v1.19.10/kubernetes-client-linux-amd64.tar.gz

解压kubectl安装包:

tar -xvf kubernetes-client-linux-amd64.tar.gz

将kubectl拷贝至/home目录下:

cp /root/kubernetes/client/bin/kubectl /home/

 

进入CCE集群的“集群信息”页,在连接信息模块点击kubectl后的“点击查看”,在弹窗中点击下载kubectl配置文件。

下载完成后,在第一个Xfce终端上将上一步下载的kubectl配置文件kubeconfig.json上传到ecs-test,上传完成后可以看到/home目录下已存在该配置文件。

scp /home/user/Downloads/kubeconfig.json root@EIP:/home

在ecs-test的home目录下可以看到上传的kubeconfig.json文件

cd /home
chmod +x kubectl
mv -f kubectl /usr/local/bin

将配置文件复制到$HOME/.kube/config文件中。

mkdir $HOME/.kube
cp kubeconfig.json $HOME/.kube/config

切换kubectl的访问模式为VPC网络内接入访问。

如有报错请检查/usr/local/bin/kubectl 是否有权限

kubectl config use-context internal

验证kubectl安装结果。

kubectl cluster-info
2.4 密钥转码
切换回root目录下:
cd

创建credential-for-huawei-obs文件:
vim credential-for-huawei-obs

文件中填写以下内容:
HUAWEI_CLOUD_ACCESS_KEY_ID=2.2中下载的密钥文件中的Access Key Id
HUAWEI_CLOUD_SECRET_ACCESS_KEY=2.2中下载的密钥文件中的Secret Access Key


输入以下命令,使用base64格式化字符串:
base64 -w 0 credential-for-huawei-obs
2.5 创建备份存储库访问密钥
在集群中创建备份存储库访问密钥secret,首先创建secure-opaque-secret.yaml文件。
vim secure-opaque-secret.yaml

文件内容为:
apiVersion: v1
data:
  cloud: #填写2.4中将密钥文件转码后的结果
kind: Secret
metadata:
  labels:
    backup.everest.io/secret: "true"
  name: secure-opaque-secret
  namespace: velero
type: cfe/secure-opaque

文件创建完成后,执行以下命令创建secret:
kubectl create -f secure-opaque-secret.yaml

返回成功:
secret/secure-opaque-secret created

使用以下命令查看secret是否存在:
kubectl get secret -n velero

返回成功:
NAME                                      TYPE                                  DATA   AGE
default-secret                            kubernetes.io/dockerconfigjson        1      20m
default-token-rs4r2                       kubernetes.io/service-account-token   3      21m
paas.elb                                  cfe/secure-opaque                     3      20m
secure-opaque-secret                      cfe/secure-opaque                     1      27s
sh.helm.release.v1.cceaddon-e-backup.v1   helm.sh/release.v1                    1      21m
velero-token-qj9t4                        kubernetes.io/service-account-token   3      21m

注意:
 •  secret所在namespace必须和E-Backup实例所在namespace一致,即velero。
 •  secret.data中存储的是访问对象存储服务的秘钥,其中key必须为 cloud,而value为上文中通过base64编码得到的字符串。
 •  secret需要打上标签“secret.everest.io/backup: true”,标识该secret是用于备份存储库的管理的。

 

2.6 创建备份存储库
创建backup-storage.yaml文件:
vim backup-storage.yaml

内容如下:
apiVersion: velero.io/v1
kind: BackupStorageLocation
metadata: 
  name: backup-location-001 #备份存储库的名称
  namespace: velero  #必须和E-Backup处于同一namespace
spec: 
  config:
    endpoint: obs.cn-north-4.myhuaweicloud.com
  credential: 
    name: secure-opaque-secret  #此前创建的secret的名字
    key: cloud  #secret.data中的key值,不需要改
  objectStorage: 
    bucket: cce-backup  ##改成对象存储桶名字
  provider: huawei  #使用华为云OBS服务

其中spec.config.endpoint参数在2.1创建的OBS桶“cce-backup”中的概览页面可以获取到:
文件编辑完成后,输入以下命令进行备份存储库的创建:
kubectl create -f backup-storage.yaml
成功返回:
backupstoragelocation.velero.io/backup-location-001 created

输入以下命令查看备份存储库的状态:
kubectl get backupstoragelocation -n velero
成功返回:
NAME PHASE LAST VALIDATED AGE DEFAULT
backup-location-001 Available 3s 3s 

PHASE为“Available”即表示备份存储库可用

 

4 目标端恢复集群资源并验证迁移结果
4.1 创建目标端CCE集群
集群名称:cce-target
节点规格:通用型 | s6.xlarge.2 | 4核 | 8GB

4.2 安装E-Backup插件
参考1 源端集群环境搭建中的1.3,创建名为“velero”的命名空间,并安装E-backup插件。

4.3 创建集群存储卷
参考1 源端集群环境搭建中的1.6创建目标端SFS Turbo存储卷并命名为“sfs-turbo-target”,注意文件系统类型和容量与源端存储卷保持一致。
在cce-target集群中创建存储卷,使用急速文件存储“sfs-turbo-target”,并命名为“pv-efs-target”:

4.4 配置目标端集群的kubectl客户端
下载“cce-target”集群的配置文件:
将配置文件重命名为kubeconfignew.json。
将文件上传至“ecs-test”的home目录下:
回到ecs-test远程登录窗口,并在home目录下,执行如下命令,替换配置文件:
cd /home
cp kubeconfignew.json $HOME/.kube/config
并执行以下命令,切换kubectl的访问模式为VPC网络内接入访问:
kubectl config use-context internal
返回成功:
Switched to context "internal".

验证集群信息:
kubectl cluster-info
返回成功
Kubernetes master is running at https://192.168.0.192:5443
CoreDNS is running at https://192.168.0.192:5443/api/v1/namespaces/kube-system/services/coredns:dns/proxy

 

4.5 创建secret和备份存储库
回到/root目录下,参考迁移准备工作当中的2.5和2.6,创建secret和备份存储库,secure-opaque-secret.yaml和backup-storage.yaml文件可以复用,无需更改。
cd
kubectl delete -f secure-opaque-secret.yaml
kubectl create -f secure-opaque-secret.yaml

kubectl delete -f backup-storage.yaml
kubectl create -f backup-storage.yaml

kubectl get backupstoragelocation backup-location-001 -n velero


返回成功
NAME                  PHASE       LAST VALIDATED   AGE   DEFAULT
backup-location-001   Available   8s               8s    

 

4.6 恢复集群资源并验证迁移结果
创建如下restore.yaml文件:
vim restore.yaml

内容
apiVersion: velero.io/v1
kind: Restore
metadata:
  name: restore-backup-001
  namespace: velero
spec:
  backupName: backup-001
  includedNamespaces:
  - default
执行以下命令,恢复集群资源:
kubectl create -f restore.yaml

执行以下命令,查看恢复情况:
kubectl get restores -n velero
若状态为“Completed”,则表示恢复成功。

也可执行命令,查看工作负载恢复情况:
kubectl get po -w

返回成功
NAME                                    READY   STATUS    RESTARTS   AGE
mysql-0                                 1/1     Running   0          94s
restore-backup-001-z2cn2-worker-vm2cj   0/1     Error     0          6m15s
word-779bb7f7f6-6mdlj                   1/1     Running   0          94s