Kubernetes应用迁移
更新时间:2020-03-03 11:03:16
本文记录使用Velero Restic快速完成云原生应用及PV数据从自建Kubernetes迁移到阿里云Kubernetes集群的实践过程。 此过程也同样适用于其他云厂商Kubernetes集群内的应用及PV数据迁移至阿里云Kubernetes集群。
前提条件
自建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:latest
registry.cn-hangzhou.aliyuncs.com/ack-migration/mysql:8
背景信息
在本示例中, 我们将对自建Kubernetes集群中的一个wordpress应用整体迁移上云到ACK,wordpress示例应用分wordpress和mysql两个组件, 分别绑定两个不同的nfs volume用于应用数据的持久化存储,最后通过NodePort暴露服务。
操作步骤
准备迁移环境
请按照以下步骤,分别在阿里云Kubernetes集群和自建Kubernetes集群中部署Velero。
说明 部署Velero包含部署Velero客户端和部署Velero服务器。
在自建Kubernetes集群备份应用
- 如果只需要备份wordpress应用而不备份PV数据,执行以下操作。
$ velero backup create wordpress-backup-without-pv --include-namespaces wordpress Backup 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 get NAME 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 get NAME 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可以看到备份的文件。
在阿里云Kubernetes集群恢复应用
wordpress应用使用NFS类型持久化数据卷,相应的,在ACK中我们可以适配NAS volume,在本示例中,我们创建与Wordpress应用所使用的StorageClass NFS, 但后端存储介质使用SSD云盘块存储。
本示例使用阿里云Kubernetes集群使用CSI plugin, 请参见动态云盘卷。
更新应用配置
应用配置项主要包含镜像地址、服务暴露方式及存储盘挂载等。本例中 ,仅涉及更新镜像地址。
调试并启动应用
wordpress示例应用分wordpress和mysql两个组件, 分别绑定两个不同的nfs volume用于应用数据的持久化存储,最后通过NodePort暴露服务。yaml文件示例如下:
# 1. 创建nfs storageclass
$ cat nfs-sc.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs
provisioner: helm.default/nfs
reclaimPolicy: Delete
$ kubectl apply -f nfs-sc.yaml
# 2. 创建mysql password的secret, echo -n "mysql" |base64
$ cat secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysql
type: Opaque
data:
password: bXlzcWw=
$ kubectl apply -f secret.yaml
# 3. 创建mysql的pvc deployment service
$ cat mysql.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
type: ClusterIP
ports:
- port: 3306
selector:
app: mysql
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-volumeclaim
annotations:
volume.beta.kubernetes.io/storage-class: "nfs"
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
labels:
app: mysql
spec:
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.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: wordpress
name: wordpress
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
nodePort: 31570
selector:
app: wordpress
type: NodePort
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wordpress-volumeclaim
annotations:
volume.beta.kubernetes.io/storage-class: "nfs"
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
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应用访问正常。
相关文档
- Kubernetes迁移方案概述
- 通过 image-syncer 工具迁移容器镜像
- 上云须知
- 使用自定义镜像创建ACK集群
- 从自建 harbor 同步镜像到 ACR 默认实例版
- 自建Kubernetes迁移至ACK弹性裸金属集群
相关产品
-
容器服务Kubernetes版
容器服务Kubernetes版(Container Service for Kubernetes)提供高性能可伸缩的容器应用管理服务,支持企业级Kubernetes容器化应用的生命周期管理。
-
容器服务(已停止服务)
容器服务(Container Service)提供了高性能可伸缩的容器应用管理服务,支持在一组云服务器上通过 Docker 容器来进行应用生命周期管理。容器服务极大地简化了用户对容器管理集群的搭建工作,无缝整合了阿里云虚拟化、存储、网络和安全能力,打造 Docker 云端最优化的运行环境。容器服务提供了多种应用发布方式和流水线般的持续交付能力,原生支持微服务架构,助力用户无缝上云和跨云管理。
-
容器镜像服务
容器镜像服务(Container Registry)提供安全的应用镜像托管能力,精确的镜像安全扫描功能,稳定的国内外镜像构建服务,便捷的镜像授权功能,方便用户进行镜像全生命周期管理。容器镜像服务简化了Registry的搭建运维工作,支持多地域的镜像托管,并联合容器服务等云产品,打造云上使用Docker的一体化体验。
以上内容是否对您有帮助?
在文档使用中是否遇到以下问题
-
内容错误
-
更新不及时
-
链接错误
-
缺少代码/图片示例
-
太简单/步骤待完善
-
其他
-
内容错误
-
更新不及时
-
链接错误
-
缺少代码/图片示例
-
太简单/步骤待完善
-
其他
更多建议
匿名提交感谢您的打分,是否有意见建议想告诉我们?
感谢您的反馈,反馈我们已经收到
文档反馈
鼠标选中内容,快速选择问题
选中存在疑惑的文档内容,即可生成 截图进行反馈,我们会跟进处理。
文档反馈