本文来自于【阿里云官方镜像站:https://developer.aliyun.com/mirror/?utm_content=g_1000307095 】

原文链接:https://developer.aliyun.com/article/746798?spm=a2c6h.12873581.0.0.54c47e46mLfYep

一、前提条件

自建Kubernetes集群通常位于用户自己的IDC中,容器镜像的存储也会使用自建镜像仓库, 在自建Kubernetes应用迁移上云之前,您需要先将容器镜像迁移上云到ACR。具体步骤请参见容器镜像迁移。
本示例中,假设wordpress应用中涉及如下容器镜像:

registry.api.paas.com:5000/admin/wordpress:latest
registry.api.paas.com:5000/admin/mysql:8

迁移上云后的镜像如下:

registry.cn-hangzhou.aliyuncs.com/ack-migration/wordpress:latestregistry.cn-hangzhou.aliyuncs.com/ack-migration/mysql:8

二、背景信息

在本示例中, 我们将对自建Kubernetes集群中的一个wordpress应用整体迁移上云到ACK,wordpress示例应用分wordpress和mysql两个组件, 分别绑定两个不同的nfs volume用于应用数据的持久化存储,最后通过NodePort暴露服务。

三、操作步骤

1. 准备迁移环境

请按照以下步骤,分别在阿里云Kubernetes集群和自建Kubernetes集群中部署Velero。
说明部署Velero包含部署Velero客户端和部署Velero服务器。

安装Velero客户端。下载Velero客户端工具,并执行如下命令安装和验证Velero客户端。
$ curl -o /usr/bin/velero https://public-bucket-1.oss-cn-hangzhou.aliyuncs.com/velero && chmod +x /usr/bin/velero

创建OSS Bucket。请参见创建存储空间。velero 要求您需要先创建一个OSS Bucket,用于存储 Kubernetes 应用数据及其PV数据, 推荐每个Kubernetes集群单独使用各自的OSS Bucket。

登录OSS 管理控制台。登录OSS 管理控制台。您可以在概览页,单击右侧的创建 Bucket。您也可以单击Bucket 列表>创建 Bucket。
在创建 Bucket对话框配置 Bucket 参数。本示例中创建的OSS Bucket名称为ls-velero,创建的区域为华东1(杭州)。
创建RAM账号并生成AccessKey。请参见创建RAM用户。如果您使用主账号AccessKey,可以跳过此步骤。
{ "Version": "1", "Statement": [
{ "Action": [ "ecs:DescribeSnapshots", "ecs:CreateSnapshot", "ecs:DeleteSnapshot", "ecs:DescribeDisks", "ecs:CreateDisk", "ecs:Addtags", "oss:PutObject", "oss:GetObject", "oss:DeleteObject", "oss:GetBucket", "oss:ListObjects"
], "Resource": [ "*"
], "Effect": "Allow"
}
]
}

部署Velero服务端。

将步骤三生成的AccessKey信息填入Velero的部署文件credentials-velero中。ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id>ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>
执行以下命令部署Velero。velero install --provider alibabacloud --image registry.cn-hangzhou.aliyuncs.com/haoshuwei24/velero:v1.2.0 --bucket ls-velero --secret-file ./credentials-velero --use-volume-snapshots=false --backup-location-config region=cn-hangzhou --use-restic --plugins registry.cn-hangzhou.aliyuncs.com/acs/velero-plugin-alibabacloud:v1.2 --wait

执行以下命令,可以查看pod的运行状态。

kubectl -n velero get po
NAME READY STATUS RESTARTS AGE
restic-fqwsc 1/1 Running 0 41s
restic-kfzqt 1/1 Running 0 41s
restic-klxhc 1/1 Running 0 41s
restic-ql2kr 1/1 Running 0 41s
restic-qrsrn 1/1 Running 0 41s
restic-srjmm 1/1 Running 0 41s
velero-67b975f5cb-68nj4 1/1 Running 0 41s

2. 在自建Kubernetes集群备份应用

如果只需要备份wordpress应用而不备份PV数据,执行以下操作。$ velero backup create wordpress-backup-without-pv --include-namespaces wordpressBackup request "wordpress-backup-without-pv" submitted successfully.
Run `velero backup describe wordpress-backup-without-pv` or `velero backup logs wordpress-backup-without-pv` for more details.
$ velero backup getNAME STATUS CREATED EXPIRES STORAGE LOCATION SELECTOR
wordpress-backup-without-pv Completed 2019-12-12 14:08:24 +0800 CST 29d default <none>
如果需要备份带PV数据的wordpress应用,执行以下操作。# 首先需要为挂载pv数据卷的pod添加annotation, 例如wordpress应用运行了2个pod, 分别为wordpress-7cf5849f47-mbvx4 mysql-74dddbdcc8-h2tls, wordpress-7cf5849f47-mbvx4# 挂载的volume名为mysql-persistent-storage, mysql-74dddbdcc8-h2tls挂载的volume名为wordpress-persistent-storage, 则添加annotation的命令为$ kubectl -n wordpress annotate pod/wordpress-7cf5849f47-mbvx4 backup.velero.io/backup-volumes=wordpress-persistent-storage
pod/wordpress-7cf5849f47-mbvx4 annotated
$ kubectl -n wordpress annotate pod/mysql-74dddbdcc8-h2tls backup.velero.io/backup-volumes=mysql-persistent-storage
pod/mysql-74dddbdcc8-h2tls annotated# 备份wordpress$ velero backup create wordpress-backup-with-pv --include-namespaces wordpress
Backup request "wordpress-backup-with-pv" submitted successfully.Run `velero backup describe wordpress-backup-with-pv` or `velero backup logs wordpress-backup-with-pv` for more details.
$ velero backup getNAME STATUS CREATED EXPIRES STORAGE LOCATION SELECTOR
wordpress-backup-with-pv Completed 2019-12-12 14:23:40 +0800 CST 29d default <none>
wordpress-backup-without-pv Completed 2019-12-12 14:08:24 +0800 CST 29d default <none>

完成后,在OSS管理控制台,查看OSS Bucket可以看到备份的文件。

3. 在阿里云Kubernetes集群恢复应用

wordpress应用使用NFS类型持久化数据卷,相应的,在ACK中我们可以适配NAS volume,在本示例中,我们创建与Wordpress应用所使用的StorageClass NFS, 但后端存储介质使用SSD云盘块存储。
本示例使用阿里云Kubernetes集群使用CSI plugin, 请参见动态云盘卷。

创建StorageClass。如果在阿里云Kubernetes集群上备份wordpress应用不带PV数据,则跳过此步骤。
$ cat nfs.yamlapiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: nfsprovisioner: diskplugin.csi.alibabacloud.comparameters: type: cloud_ssdreclaimPolicy: Retain
$ kubectl apply -f nfs.yaml
storageclass.storage.k8s.io/nfs created
恢复wordpress应用。使用Velero恢复wordpress应用到阿里云Kubernetes集群,完成wordpress从自建Kubernetes集群到阿里云Kubernetes集群的迁移。
$ velero restore create --from-backup wordpress-backup-with-pv$ velero restore getNAME BACKUP STATUS WARNINGS ERRORS CREATED SELECTOR
wordpress-backup-with-pv-20191212152745 wordpress-backup-with-pv InProgress 0 0 2019-12-12 15:27:45 +0800 CST <none>
$ velero restore get
此时查看wordpress应用运行情况,会有镜像拉取失败的问题。
$ kubectl -n wordpress get po
NAME READY STATUS RESTARTS AGE
mysql-669b4666cd-trsnz 0/1 ErrImagePull 0 19m
mysql-74dddbdcc8-h2tls 0/1 Init:0/1 0 19m
wordpress-7cf5849f47-mbvx4 0/1 Init:0/1 0 19m
wordpress-bb5d74d95-xcjxw 0/1 ErrImagePull 0 19m

4. 更新应用配置

应用配置项主要包含镜像地址、服务暴露方式及存储盘挂载等。本例中 ,仅涉及更新镜像地址。

登录容器服务管理控制台。在 Kubernetes 菜单下,单击左侧导航栏的应用>无状态,选择目标集群和命名空间。在wordpress应用右侧操作列单击更多>查看Yaml。在编辑 YAML页面把image字段替换成迁移后的镜像地址后,单击更新。
说明您可以在前提条件中获取迁移后的镜像地址。
查看wordpress应用运行情况。
$ kubectl -n wordpress get po
NAME READY STATUS RESTARTS AGE
mysql-678b5d8499-vckfd 1/1 Running 0 100s
wordpress-8566f5f7d8-7shk6 1/1 Running 0 3m18s
测试环境绑定hosts后,通过http://wordpress.myk8s.paas.com:31570/访问wordpress应用。

5. 调试并启动应用

wordpress示例应用分wordpress和mysql两个组件, 分别绑定两个不同的nfs volume用于应用数据的持久化存储,最后通过NodePort暴露服务。yaml文件示例如下:

# 1. 创建nfs storageclass$ cat nfs-sc.yamlapiVersion: storage.k8s.io/v1kind: StorageClassmetadata:
name: nfsprovisioner: helm.default/nfsreclaimPolicy: Delete$ kubectl apply -f nfs-sc.yaml# 2. 创建mysql password的secret, echo -n "mysql" |base64$ cat secret.yamlapiVersion: v1kind: Secretmetadata:
name: mysqltype: Opaquedata:
password: bXlzcWw=$ kubectl apply -f secret.yaml# 3. 创建mysql的pvc deployment service$ cat mysql.yamlapiVersion: v1kind: Servicemetadata:
name: mysql
labels:
app: mysqlspec:
type: ClusterIP
ports:
- port: 3306
selector:
app: mysql---apiVersion: v1kind: PersistentVolumeClaimmetadata:
name: mysql-volumeclaim
annotations:
volume.beta.kubernetes.io/storage-class: "nfs"spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi---apiVersion: apps/v1kind: Deploymentmetadata:
name: mysql
labels:
app: mysqlspec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
securityContext:
runAsUser: 999
runAsGroup: 999
fsGroup: 999
containers:
- image: registry.api.paas.com:5000/admin/mysql:8
name: mysql
args:
- "--default-authentication-plugin=mysql_native_password"
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-volumeclaim
$ kubectl apply -f mysql.yaml
# 4. 创建wordpress的pvc deployment service
$ cat wordpress.yamlapiVersion: v1kind: Servicemetadata:
labels:
app: wordpress
name: wordpressspec:
ports:
- port: 80
targetPort: 80
protocol: TCP
nodePort: 31570
selector:
app: wordpress
type: NodePort---apiVersion: v1kind: PersistentVolumeClaimmetadata:
name: wordpress-volumeclaim
annotations:
volume.beta.kubernetes.io/storage-class: "nfs"spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi---apiVersion: apps/v1kind: Deploymentmetadata:
name: wordpress
labels:
app: wordpressspec:
replicas: 1
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- image: registry.api.paas.com:5000/admin/wordpress
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: mysql:3306
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql
key: password
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wordpress-volumeclaim
$ kubectl apply -f wordpress.yaml

测试环境绑定hosts后,通过http://wordpress.myk8s.paas.com:31570/访问wordpress应用,确保wordpress应用访问正常。


更多相关文章

  1. android apk安装结束的系统广播的监听
  2. Android中ShareUserId注意问题
  3. Android应用程序启动画面
  4. Multiple APK Support in Android(安卓)Market
  5. android之视频播放控件VideoView简单应用
  6. Android(安卓)APP的发布流程
  7. Android(安卓)Spinner控件的简单应用
  8. Android(安卓)ClickableSpan 应用实例
  9. android DatePickerDialog的应用举例

随机推荐

  1. 尝试将纬度和经度发布到数据库时,Android
  2. C标准库中的函数定义在哪里?
  3. Mysql 使用 select into outfile
  4. 检索每n行的最高值
  5. 如何在C中删除多个闪存地址?
  6. MySQL数据库引擎ISAM MyISAM HEAP InnoDB
  7. mysql 数据库中表不同 但是列名相同,怎么
  8. SQL从结果数据库中选择subCode及其得分,并
  9. 什么时候最推荐使用mysql_real_escape_st
  10. Atitit 数据库 标准库 &#160;sdk 函数库