1 迁移过程
为保障项目顺利实施,现对迁移项目中主要的技术参考汇总如下。
1.1 容器镜像迁移
在迁移的场景中,镜像迁移是前提,一般的客户都在使用自己的私有镜像仓库,所以在迁移应用前有两种选择,一种是把镜像仓库放开公网访问 (不安全),另外一种选择就是把当前的镜像仓库迁移到目标集群可以访问的位置。
在迁移到AWS的环境中时,镜像仓库有两种选择,一种是在Amazon EC2上自建镜像仓库,另外一种是使用托管的镜像仓库 Amazon ECR。
选择自建镜像仓库的客户几乎都会沿袭之前的技术方向,因此这部分内容我们不讨论。如果是在AWS上自建 Kubernetes 集群,这时可以不用迁移镜像仓库,因为是可以直接被访问到的。我们重点在如何将自建的镜像仓库迁移到Amazon ECR中,以下过程将描述迁移过程。
1.1.1 **镜像迁移方法概述**
在迁移过程中,当镜像个数较少时,可以通过 docker pull 或docker push命令完成镜像迁移,如果涉及到成千上百个镜像,甚至几 T 的镜像仓库数据时,迁移过程就变得非常漫长,并且可能丢失数据。
1). **镜像数量少于、等于50:docker pull 或docker push**
2). **镜像数量大于50:利用工具迁移或脚本**
1.1.2 **镜像迁移过程**
1) **迁移工具**:
<https://github.com/docker-archive/migrator>
建议将迁移工具安装在和私有镜像仓库物理位置最近的地方,以便于快速拉取。
工具安装的主机的磁盘一定要设置为可以容纳需要一次拉取镜像的大小之和。
工具运行环境需要安装docker engine。
2) **迁移过程**
1\.创建私有镜像仓库可参考(默认客户已经搭建完成):<https://stackoverflow.com/questions/38247362/how-i-can-use-docker-registry-with-login-password>
或
<https://docs.docker.com/registry/deploying/>
2\.下载工具migrator
$git clone https://github.com/docker-archive/migrator.git
3\.运行如下命令
`\$docker run -it -v /run/docker.sock:/var/run/docker.sock -e AWS\\_ACCESS\\_KEY\\_ID=XXXXXXXXXX -e AWS\\_SECRET\\_ACCESS\\_KEY=XXXXXXXXX -e AWS\\_REGION=cn-northwest-1 -e V1\\_REGISTRY=docker.io -e USE\\_INSECURE\\_CURL=true -e V2\\_REGISTRY=249178916876.dkr.ecr.cn-northwest-1.amazonaws.com.cn docker/migrator bash`
这样就进入到了容器中,此容器负责迁移镜像。(需要修改容器内脚本参数)
特别参数说明:
- AWS\_REGION:AWS region一定要填写
- V1\_REGISTRY:源镜像仓库
- V2\_REGISTRY:目标镜像仓库(ECR)
具体请参考:<https://github.com/docker-archive/migrator>
4.修改容器中/usr/local/bin/migrator.sh文件
将下面这行正则修改(中国区迁移需要修改):
![image.png](https://dev-media.amazoncloud.cn/4ee8fdcd1d624504924905833ce69dea_image.png "image.png")
`修改前:if [[ \${V2\\_REGISTRY} =~ .\\*ecr.\\*amazonaws.com\$ ]]
修改后:if [[ \${V2\\_REGISTRY} =~ .\\*ecr.\\*amazonaws.com.cn\$ ]]`
5\.运行迁移脚本
bash-4.3# /usr/local/bin/migrator.sh
6\.输入私有镜像仓库用户名和密码、邮箱进行登录,回车开始迁移镜像。
![image.png](https://dev-media.amazoncloud.cn/f5217ae669004864ba32835966c83c3a_image.png "image.png")
可根据情况来选择实际的鉴权方式,也可选择CA
7\.同步完成,检查ECR:
![image.png](https://dev-media.amazoncloud.cn/d6c486266b1d4cbab49081e3a129b787_image.png "image.png")
1.2 使用 Velero 迁移
Velero 基于go语言开发,安装和使用也比较方便。下面我们将介绍针对使用Kubeadm 或kops基于Amazon EC2自建的 Kubernetes 集群迁移到 [Amazon EKS](https://aws.amazon.com/cn/eks/?trk=cndc-detail) 托管服务的实施过程。
1.2.1 **安装指南**
Velero 支持两种安装方式,一种是下载安装,另外一种是 helm chart 两种安装方法二选一,我推荐采用第一种方法。
**请分别在AWS EKS集群和自建 Kubernetes 集群中部署 Velero。在迁移源集群和目标集群中的可执行 kubectl 的机器上执行下安装操作。注意,备份存储的存储桶是同一个,两个集群都需要有访问权限。**
**安装要求**
1)在启用DNS和容器联网的情况下访问Kubernetes集群v1.10或更高版本。
2)Kubectl安装配置完成
3)存储支持范围
![image.png](https://dev-media.amazoncloud.cn/6d776cc805cc49b6924ed47dc81d365e_image.png "image.png")
![image.png](https://dev-media.amazoncloud.cn/98c9d61a68c841dda66b8832110dbf51_image.png "image.png")
**下载客户端安装包**
1)下载,根据平台选择不同版本:<https://github.com/vmware-tanzu/velero/releases/tag/v1.3.1>
`\$ cd ~/
\$mkdir velero
\$cd velero`
$ curl -sSL -o velero-v1.3.1-darwin-amd64.tar.gz <https://github.com/vmware-tanzu/velero/releases/download/v1.3.1/velero-v1.3.1-darwin-amd64.tar.gz>
2)解压安装
`\$tar -xvf velero-v1.3.1-darwin-amd64.tar.gz
\$cd velero-v1.3.1-linux-amd64/
\$sudo mv velero /usr/local/bin/
`
1. **服务端安装和配置**
请提前创建--secret-file 参数指定的credentials文件在~/.aws/目录下,并不要命名为credentials,以免引起混乱,你可以起名为:credentials-velero。此credentials的用途是访问存储桶,要使用aksk,但请注意安全性。
1)安装命令如下:
`\$ velero install --provider aws --plugins velero/velero-plugin-for-aws:v1.0.0 --bucket bucketname --secret-file ~/.aws/credentials-velero --backup-location-config region=cn-northwest-1 --snapshot-location-config region=cn-northwest-1 --use-restic`
注意,如果是需要备份持久存储,请一定要在安装velero server时带上此参数 --use-restic
2)检查状态
`
\$ kubectl logs deployment/velero -n velero`
![image.png](https://dev-media.amazoncloud.cn/180d977f43164ba1a2a40e9ce519d3aa_image.png "image.png")
1.2.2 **备份与恢复应用**
1. **例子准备工作**
进入velero的目录中:/home/ec2-user/velero/velero-v1.3.1-linux-amd64
$cd /home/ec2-user/velero/velero-v1.3.1-linux-amd64
2. **无状态应用**
1)\.启动一个无状态应用(在源集群中)
$kubectl apply -f examples/nginx-app/base.yaml
2)\.创建一个备份(在源集群中)
$velero backup create nginx-backup --include-namespaces nginx-example
3\. **从一个备份中恢复应用(在目标集群中)**
$velero restore create --from-backup nginx-backup
4\.**验证**
在控制台中查看新创建的alb,然后使用DNS访问
通过以上的步骤我们完成了无状态和有状态的服务迁移,在此我们对迁移过程中的经验总结如下:
- 迁移前请认真的做调研,以防因版本不匹配或组件信息缺失导致迁移失败;
- 在安装 Velero 工具时,请注意安装客户端和服务器端是有区别的;
- 在安装 Velero 服务端时,在创建secret-file时,请不要指定和默认的credential相同的名字,容易引起混乱(尤其是在和 kubectl 在一台机器上共用时)
- Velero工具不支持跨云平台的有状态服务迁移(底层 driver 不同)
- 不支持 hostpath 的迁移,例如:/var/lib/docker
- 在恢复完迁移的服务后,请注意:如果使用的是不同的镜像仓库请一定要记得修改镜像地址
# <a name="_toc37702457"></a>附录
**Velero**
<https://velero.io/>
Velero Github:
<https://github.com/vmware-tanzu/velero/releases/tag/v1.3.1>
**镜像仓库搭建:**
<https://stackoverflow.com/questions/38247362/how-i-can-use-docker-registry-with-login-password>
或
<https://docs.docker.com/registry/deploying/>
**docker/migrator Github:**
<https://github.com/docker-archive/migrator>
11
**AWS Confidential – Internal Use Only**