广告

用Konveyor将数据库迁移到Kubernetes

  • 浏览(146)
  • 评论(0)
  • 译者:k8s

Kubernetes Database Operator对于将可伸缩数据库服务器构建为数据库(DB)集群非常有用。但是,由于必须创建以YAML文件表示的新构件,将现有数据库迁移到Kubernetes需要大量手动工作。本文介绍了一个新的开源工具Konveyor-Tackle-DiVA-DOA(Data-intensive Validity Analyzer-Database Operator Adaptation)。它自动为数据库operator迁移生成部署就绪的构件。它通过以数据为中心的代码分析来实现这一点。

什么是Tackle-DiVA-DOA?

Tackle DiVA DOA(简称DOA)是Konveyor Tackle中的一个开源的以数据为中心的数据库配置分析工具。它导入目标数据库配置文件(如SQL和XML),并生成一组Kubernetes构件,用于将数据库迁移到Zalando Postgres Operator等operator。

图片

DOA查找并分析使用数据库管理系统(DBMS)的现有系统的设置。然后,它生成Kubernetes的清单(YAML文件)和Postgres operator,用于部署等效的DB集群。

图片

应用程序的数据库设置包括DBMS配置、SQL文件、DB初始化脚本和访问DB的程序代码。

DBMS配置包括DBMS参数、集群配置和凭据。DOA将配置存储到postgres.yaml,将秘密存储到secret-db.yaml(如果你需要自定义凭据)。

SQL文件用于定义和初始化数据库中的表、视图和其他实体。这些存储在Kubernetes ConfigMap定义cm-sqls.yaml中。

数据库初始化脚本通常创建数据库和模式,并授予用户对DB实体的访问权限,以便SQL文件正常工作。DOA尝试从脚本和文档中找到初始化需求,如果找不到,则进行猜测。结果还将存储在名为cm-init-db.yaml的ConfigMap中。

在某些情况下,访问数据库的代码(如主机和数据库名称)嵌入在程序代码中。这些将被重写以使用迁移的DB集群。

教程

DOA应该在容器中运行,并附带一个脚本来构建其镜像。确保在你的环境中安装了Docker和Bash,然后按如下方式运行构建脚本:

cd /tmp
git clone https://github.com/konveyor/tackle-diva.git
cd tackle-diva/doa
bash util/build.sh

docker image ls diva-doa
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
diva-doa     2.2.0     5f9dd8f9f0eb   14 hours ago   1.27GB
diva-doa     latest    5f9dd8f9f0eb   14 hours ago   1.27GB

这将构建DOA并打包为容器镜像。现在可以使用DOA了。

下一步执行捆绑run-doa.sh包装器脚本(运行DOA容器)。指定目标数据库应用程序的Git存储库。此示例在TradeApp应用程序中使用Postgres数据库。可以使用-o选项作为输出文件的位置,使用-i选项作为数据库初始化脚本的名称:

cd /tmp/tackle-diva/doa

bash run-doa.sh -o /tmp/out -i start_up.sh \
      https://github.com/saud-aslam/trading-app
[OK] successfully completed.

这将创建/tmp/out/目录和带有目标应用程序名称的目录/tmp/out/trading-app。在本例中,应用程序名称为trading-app,这是GitHub存储库名称。生成的构件(YAML文件)也会在应用程序名称目录下生成:

cd /tmp/tackle-diva/doa
bash run-doa.sh -o /tmp/out -i start_up.sh \
      https://github.com/saud-aslam/trading-app
[OK] successfully completed.

每个YAML文件的前缀表示该文件定义的资源类型。例如,每个cm-*.yaml文件定义一个ConfigMap,job-init.yaml定义Job资源。此时,secret-db.yaml没有创建,DOA使用Postgres operator自动生成的凭据。

现在你拥有了在Kubernetes实例上部署PostgreSQL集群所需的资源定义。你可以使用实用程序脚本createsh来部署它们。或者,你可以使用kubectl create命令:

cd /tmp/out/trading-app
bash create.sh  # or simply “kubectl apply -f .”

configmap/trading-app-cm-init-db created
configmap/trading-app-cm-sqls created
job.batch/trading-app-init created
postgresql.acid.zalan.do/diva-trading-app-db created

这创建了Kubernetes资源,包括postgresql(Postgres operator创建的数据库集群资源)、service、rs、pod、job、cm、secret、pv和pvc。例如,你可以看到四个名为trading app-*的数据库pod,因为在postgres.yaml中,数据库实例的数量定义为四个。

$ kubectl get all,postgresql,cm,secret,pv,pvc
NAME                                        READY   STATUS      RESTARTS   AGE

pod/trading-app-db-0                        1/1     Running     0          7m11s
pod/trading-app-db-1                        1/1     Running     0          5m
pod/trading-app-db-2                        1/1     Running     0          4m14s
pod/trading-app-db-3                        1/1     Running     0          4m

NAME                                      TEAM          VERSION   PODS   VOLUME   CPU-REQUEST   MEMORY-REQUEST   AGE   STATUS
postgresql.acid.zalan.do/trading-app-db   trading-app   13        4      1Gi                                     15m   Running

NAME                            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/trading-app-db          ClusterIP   10.97.59.252    <none>        5432/TCP   15m
service/trading-app-db-repl     ClusterIP   10.108.49.133   <none>        5432/TCP   15m

NAME                         COMPLETIONS   DURATION   AGE
job.batch/trading-app-init   1/1           2m39s      15m

请注意,Postgres operator附带一个用户界面(UI)。你可以在UI上找到创建的集群。需要导出端点URL才能在浏览器上打开UI。如果使用minikube,请执行以下操作:

minikube service postgres-operator-ui

然后会自动打开一个显示UI的浏览器窗口。

图片

现在,你可以使用测试pod访问数据库实例。DOA还为测试生成了pod定义。

$ kubectl apply -f /tmp/out/trading-app/test/pod-test.yaml # creates a test Pod
pod/trading-app-test created
$ kubectl exec trading-app-test -it  bash  # login to the pod

数据库主机名和访问DB的凭据被注入pod中,因此你可以使用它们访问数据库。执行psql元命令以显示所有表和视图(在数据库中):

# printenv DB_HOST; printenv PGPASSWORD
(values of the variable are shown)

# psql -h ${DB_HOST} -U postgres -d jrvstrading -c ‘\dt’
             List of relations
 Schema |      Name      | Type  |  Owner  
——–+—————-+——-+———-
 public | account        | table | postgres
 public | quote          | table | postgres
 public | security_order | table | postgres
 public | trader         | table | postgres
(4 rows)

# psql -h ${DB_HOST} -U postgres -d jrvstrading -c ‘\dv’
                List of relations
 Schema |         Name          | Type |  Owner  
——–+———————–+——+———-
 public | pg_stat_kcache        | view | postgres
 public | pg_stat_kcache_detail | view | postgres
 public | pg_stat_statements    | view | postgres
 public | position              | view | postgres
(4 rows)

测试完成后,从pod注销并移除测试pod:

# exit
$ kubectl delete -f /tmp/out/trading-app/test/pod-test.yaml

最后,使用脚本删除创建的集群:

$ bash delete.sh

原文链接:

https://opensource.com/article/22/5/migrating-databases-kubernetes-using-konveyor


  • 分享到:
  • icon
  • icon
  • icon
  • icon
箭头