Kubernetes应用迁移教程
本文记录使用Velero Restic快速完成云原生应用及PV数据从自建Kubernetes迁移到ACK的实践过程。 此过程也同样适用于其他云厂商Kubernetes集群内的应用及PV数据迁移至ACK。
背景信息
在本示例中, 我们将对自建Kubernetes集群中的一个wordpress应用整体迁移上云到ACK,wordpress示例应用分wordpress和mysql两个组件,
分别绑定两个不同的nfs volume用于应用数据的持久化存储,最后通过NodePort暴露服务。
操作步骤
- 步骤一:容器镜像迁移上云
- 步骤二:ACK中部署Minio对象存储服务
- 步骤三:自建Kubernetes集群中部署示例应用和Velero
- 步骤四:在ACK上部署Velero并恢复应用wordpress
- 步骤五:验证wordpress应用服务
步骤一:容器镜像迁移上云
自建Kubernetes集群通常位于用户自己的IDC中,容器镜像的存储也会使用自建镜像仓库, 在Kubernetes应用迁移上云之前,您需要先将容器镜像迁移上云到ACR。具体步骤请参见容器镜像迁移。
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
步骤二:ACK中部署Minio对象存储服务
Minio对象存储服务用于wordpress应用持久化数据卷中数据的迁移中转服务。
- 创建命令空间。
kubectl create ns minio
- 设置您的Minio对象存储服务的用户名密码并替换
MINIO_ACCESS_KEY_VALUE MINIO_SECRET_KEY_VALUE
的值,部署Minio服务。export MINIO_ACCESS_KEY=admin export MINIO_SECRET_KEY=admin12345 export BUCKET_NAME=velero sed -i "s/MINIO_ACCESS_KEY_VALUE/$MINIO_ACCESS_KEY/g" minio.yaml sed -i "s/MINIO_SECRET_KEY_VALUE/$MINIO_SECRET_KEY/g" minio.yaml sed -i "s/BUCKET/$BUCKET_NAME/g" minio.yaml kubectl apply -f minio.yaml
在ACK集群中部署Minio服务并挂载20G的SSD云盘,用于存储中转数据,Minio服务使用LoadBalancer的方式暴露;Minio中新建一个行为Velero的Bucket。
minio.yaml 内容如下:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: storage-pvc namespace: minio-test spec: accessModes: - ReadWriteOnce storageClassName: alicloud-disk-ssd resources: requests: storage: 20Gi --- apiVersion: apps/v1beta1 kind: Deployment metadata: namespace: minio-test name: minio labels: component: minio spec: strategy: type: Recreate template: metadata: labels: component: minio spec: volumes: - name: storage persistentVolumeClaim: claimName: storage-pvc - name: config emptyDir: {} containers: - name: minio image: minio/minio:latest imagePullPolicy: IfNotPresent args: - server - /storage - --config-dir=/config env: - name: MINIO_ACCESS_KEY value: MINIO_ACCESS_KEY_VALUE - name: MINIO_SECRET_KEY value: MINIO_SECRET_KEY_VALUE ports: - containerPort: 9000 volumeMounts: - name: storage mountPath: "/storage" - name: config mountPath: "/config" --- apiVersion: v1 kind: Service metadata: namespace: minio-test name: minio labels: component: minio spec: # ClusterIP is recommended for production environments. # Change to NodePort if needed per documentation, # but only if you run Minio in a test/trial environment, for example with Minikube. type: LoadBalancer ports: - port: 9000 targetPort: 9000 protocol: TCP selector: component: minio --- apiVersion: batch/v1 kind: Job metadata: namespace: minio-test name: minio-setup labels: component: minio spec: template: metadata: name: minio-setup spec: restartPolicy: OnFailure volumes: - name: config emptyDir: {} containers: - name: mc image: minio/mc:latest imagePullPolicy: IfNotPresent command: - /bin/sh - -c - "mc --config-dir=/config config host add BUCKET http://minio:9000 MINIO_ACCESS_KEY_VALUE MINIO_SECRET_KEY_VALUE && mc --config-dir=/config mb -p BUCKET/BUCKET" volumeMounts: - name: config mountPath: "/config"
- 在阿里云容器服务控制台中,单击左侧导航栏中路由与负载均衡 > 服务,选择集群和命名空间。
在服务列表页面,可以看到刚刚部署Minio对象存储服务。
- 单击外部端点,你可以通过
IP:Port
的方式访问Minio服务。
步骤三:自建Kubernetes集群中部署示例应用和Velero
- 自建Kubernetes集群部署wordpress应用。
说明 本示例中,先创建一个wordpress应用,然后将此应用迁移到ACK,如果您已有需要迁移的应用,跳过此步骤。
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集群部署Velero。
- 下载Velero客户端工具,并执行如下命令安装和验证Velero客户端。本例中下载安装包为 velero-v1.2.0-linux-amd64.tar.gz。
$ tar xvf velero-v1.2.0-linux-amd64.tar.gz $ mv velero-v1.2.0-linux-amd64/velero /usr/bin/velero $ velero version Client: Version: v1.2.0 Git commit: 5d008491bbf681658d3e372da1a9d3a21ca4c03c Server: Version:
- 编辑credentials-velero文件, 设置Minio服务的访问权限信息。
[default] aws_access_key_id=<YourAccessKeyId> aws_secret_access_key=<YourAccessKeySecret>
说明 此处的YourAccessKeyId
和YourAccessKeySecret
为访问Minio服务的登录用户名和密码。 - 替换
MINIO_SERVER_ADDRESS
的值,并使用以下命令部署Velero服务。velero install --provider aws --image registry.cn-hangzhou.aliyuncs.com/acs/velero:v1.2.0 --bucket velero --secret-file ./credentials-velero --use-volume-snapshots=false --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://MINIO_SERVER_ADDRESS:9000 --use-restic --plugins registry.cn-hangzhou.aliyuncs.com/acs/velero-plugin-for-aws:v1.0.0 --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
- 下载Velero客户端工具,并执行如下命令安装和验证Velero客户端。
- 备份wordpress应用。
- 如果只需要备份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>
查看Minio服务器可以看到备份的文件。 - 如果只需要备份wordpress应用而不备份PV数据,执行以下操作。
步骤四:在ACK上部署Velero并恢复应用wordpress
- 在ACK部署Velero。
操作步骤同自建Kubernetes集群部署Velero。部署完成后,查看backup列表的运行状态。
$ 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>
- 在ACK中恢复wordpress应用。
wordpress应用使用NFS类型持久化数据卷,相应的,在ACK中我们可以适配NAS volume,在本示例中,我们创建与Wordpress应用所使用的StorageClass
NFS, 但后端存储介质使用SSD云盘块存储。本示例使用ACK集群使用CSI plugin, 请参见动态云盘卷。
- 创建StorageClass。
如果在ACK上备份wordpress应用不带pv数据,则跳过此步骤。
$ cat nfs.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs provisioner: diskplugin.csi.alibabacloud.com parameters: type: cloud_ssd reclaimPolicy: Retain $ kubectl apply -f nfs.yaml storageclass.storage.k8s.io/nfs created
- 恢复wordpress应用。
$ velero restore create --from-backup wordpress-backup-with-pv $ velero restore get NAME 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
- 编辑Deployment把image字段替换成步骤一:容器镜像迁移上云中迁移后的镜像地址。
# edit 编辑deployment并修改image url $ kubectl -n wordpress edit deployment mysql $ kubectl -n wordpress edit deployment wordpress
- 创建StorageClass。
步骤五:验证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

发布者:佚, 佚名,转转请注明出处:https://www.cms2.cn/aliyun/csk/6145.html

相关推荐
-
查看容器
您可以通过容器服务管理控制台的容器组页面查看 Serverless Kubernetes 集群的容器组页面。 操作步骤 登录容器服务管理控制台。 在Kubernetes 菜单下,单击左侧导航栏中的应用 > 容器组,进入容器组页面。 选择所需的集群和命名空间,选择所需的容器组…
2019年12月13日 -
AGS命令行帮助
AGS 是阿里云基因服务的通用命令行工具, 目前主要集成 argo 功能并且适配阿里云各个产品的 addon功能命令。 AGS 下载和安装 AGS 默认使用阿里云ak调用各个服务,目前集成了阿里云日志服务用于收集Pod日志。使用此功能请在集群创建的时候选择开启日志服务。 执行如下…
2019年11月11日 -
阿里云容器服务怎么取消运行中的工作流?
取消正在运行中的工作流。 请求信息 请求行 RequestLine PUT /gs/workflow/{workflowName} HTTP/1.1 特有请求头 RequestHead 无,请参考 公共请求头部。 请求体 RequestBody { “action”: “canc…
2020年2月4日 -
如何支持私有镜像
kubectl create secret docker-registry regsecret –docker-server=registry-internal.cn-hangzhou.aliyuncs.com –docker-username=abc@aliyun.com …
2019年12月13日 -
使用HPA弹性伸缩容器
阿里云容器服务支持在控制台界面上快速创建支持HPA的应用,实现容器资源的弹性伸缩。您也可通过定义HPA(Horizontal Pod Autoscaling)的yaml配置来进行配置。 前提条件 您已成功创建一个Kubernetes集群,参见创建Kubernetes集群。 您已成…
-
预处理Swarm编排文件
操作步骤 下载Swarm应用编排文件。 登录容器服务Swarm控制台,在左侧导航栏单击应用,在目标应用右侧单击变更配置。 拷贝编排文件并保存到本地,文件名后缀为.yaml,本文命名为swarm-piggymetrics.yaml。 预处理swarm 编排文件里面环境变量。 swa…
2019年12月13日