如何使用Kubernetes构建混合云以替代DBaaS

我叫Petr Zaitsev,我是Percona的首席执行官,创始人,我想告诉你:



  • 我们是如何从开源解决方案发展到数据库即服务的;
  • 在云中部署数据库有哪些方法;
  • Kubernetes如何通过消除供应商依赖性并保持DBMS作为服务尽可能简单来替换DBaaS。


本文基于Mail.ru Cloud Solutions&Tarantool在@Databases Meetup上的报告。如果您不想阅读,可以看到:







如何从开源到云中的数据库即服务



自90年代末以来,我一直在进行开源。二十年前,使用开放源代码(如数据库)并不容易。必须下载源代码,进行修补,编译,然后才能使用。



然后,开源经历了一系列简化:



  • 需要编译的Tar.gz和INSTALL源;
  • 具有.deb和.rpm之类依赖项的软件包,您只需要安装一组软件包即可;
  • 软件包存储库(如APT和YUM),用于自动安装;
  • Docker和Snap等解决方案,使您无需外部依赖即可在安装时获取软件包。


结果,使用开源软件变得更加容易,并且减少了进入此类应用程序开发的障碍。



同时,与20年前的情况不同,当时每个人都是组装专家,现在大多数开发人员无法组装从源头使用的工具。



实际上,这还不错,因为:



  1. 我们可以使用更复杂但更方便的软件。例如,浏览器使用方便,但是它包含许多开源组件,并且从头开始构建它很不方便。
  2. 更多的人可以成为开源和其他软件的开发人员,企业使用更多的软件,并且对此的需求更高。


缺点是简化的下一步与使用云解决方案相关,这导致特定的供应商锁定,即绑定到一个供应商。我们使用简单的解决方案,提供程序使用开放源代码组件,但实际上,它们被钉在一个庞大的云中。也就是说,使用专有API在云中部署开放源代码(和兼容软件)的最简单,最快的方法。



对于云中的数据库,有两种方法:



  1. 与常规数据中心一样,构建数据库基础结构。也就是说,采用标准的构建块:计算,存储等,将Linux放入数据库,配置中。
  2. 使用数据库即服务,提供商在云中提供现成的数据库。


现在,DBaaS是一个快速增长的市场,因为这样的服务允许开发人员直接使用数据库并减少日常工作。提供程序假定提供了高可用性(高可用性),并且易于扩展,数据库修补,备份,性能调整。



基于开源的两种类型的数据库即服务和Kubernetes形式的替代



开源数据库有两种类型的“数据库即服务”:



  1. 打包到管理后端中的标准开源产品,可轻松进行部署和管理。
  2. 具有各种附加组件的高级商业解决方案,与开源兼容。


这两个选项都降低了在云之间迁移的能力,并降低了数据和应用程序的可移植性。例如,尽管事实上不同类型的云支持相同的标准MySQL,但它们之间却存在显着差异:操作,性能,备份等。从一个云迁移到另一个云可能会非常困难,特别是对于复杂的应用程序。



随之而来的问题是-是否有可能获得“数据库即服务”的便利,但是作为一种简单的开源解决方案呢?



不幸的是,不幸的是,市场上还没有这样的解决方案。好消息是,有Kubernetes可以让您实施这样的解决方案。



Kubernetes是一种云或数据中心操作系统,可让您跨集群中的多个服务器(而不是单个主机)部署和管理应用程序。


Kubernetes现在是此类软件的领导者。对于此类任务有许多不同的解决方案,但正是他成为了标准。许多以前涉足替代解决方案的公司现在都在专注于调整其产品以支持Kubernetes。



此外,Kubernetes是一个通用解决方案,许多供应商的私有,公共和混合云都支持Kubernetes,例如:AWS,Google Cloud,Microsoft Azure,Mail.ru Cloud Solutions



Kubernetes如何与数据库一起使用



Kubernetes最初是为处理数据但不存储任何内容的无状态应用程序而设计的,例如微服务或Web应用程序。数据库处于另一端,这意味着它们是有状态的应用程序。而且Kubernetes最初不是为此类应用程序设计的。



但是,最近在Kubernetes中出现了一些功能,这些功能允许使用数据库和其他有状态应用程序:



  1. StatefulSet概念是用于处理Pod关闭事件和执行Graceful Shutdown(可预测的应用程序关闭)的一系列原语。
  2. 持久卷-与Pod,Kubernetes管理对象关联的数据存储。
  3. 操作员框架-即具有创建用于管理分布在许多节点上的数据库和其他有状态应用程序的组件的能力。


公共云中已经有大型的数据库即服务,例如Kubernetes的后端:CockroachCloud,InfluxDB,PlanetScale。也就是说,Kubernetes数据库不仅在理论上是可行的,而且在实践中也是可行的。



Percona有两种开源的Kubernetes解决方案:



  1. 适用于MongoDB的Percona服务器的Kubernetes运算符。
  2. 用于XtraDB CLUSTER的Kubernetes Operator是MySQL兼容的服务,可提供高可用性和一致性。如果不需要高可用性,例如开发数据库,​​也可以使用单节点。


Kubernetes用户可以分为两组。有些人直接使用Kubernetes Operators-这些人主要是高级用户,他们对技术的工作原理有很好的了解。其他人在后端运行它-这样的用户对诸如数据库即服务之类的东西感兴趣,他们不想深入研究Kubernetes的细微差别。对于第二组用户,我们还有另一个开源解决方案-Percona DBaaS CLI工具。对于那些希望在不深入了解该技术的情况下获得基于Kubernetes的开源DBaaS的人来说,这是一个实验性的解决方案。



如何在Google Kubernetes Engine上从Percona运行DBaaS



我认为Google Kubernetes Engine是Kubernetes技术的最实用的实现之一。它在世界许多地区都可用,并且具有简单方便的命令行工具(SDK),可让您创建脚本,而不是手动操作平台。



为了使我们的DBaaS能够正常工作,我们需要以下组件:



  1. Kubectl。
  2. Google Cloud SDK。
  3. Percona DBaaS CLI。


安装kubectl



在为您的操作系统安装软件包后,我们将以Ubuntu为例。更多细节在这里



sudo apt-get update && sudo apt-get install -y apt-transport-https gnupg2
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl


安装Google Cloud SDK



以相同的方式安装软件包。更多细节在这里



# Add the Cloud SDK distribution URI as a package source
echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] 
http://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list

# Import the Google Cloud Platform public key
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -

# Update the package list and install the Cloud SDK
sudo apt-get update && sudo apt-get install google-cloud-sdk


安装Percona DBaaS CLI



从Percona存储库安装。Percona DBaaS CLI工具仍然是实验产品,因此它位于实验存储库中,即使您已经安装了Percona存储库,也必须将其单独包含在内。



更多细节在这里



安装算法:



  1. 使用percona发布工具配置Percona存储库。首先,您需要从Percona下载并安装正式的percona发行包:



    wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
    sudo dpkg -i percona-release_latest.generic_all.deb
  2. 启用实验性工具存储库组件,如下所示:



    sudo percona-release enable tools experimental
    
  3. 安装percona-dbaas-cli软件包:



    sudo apt-get update
    sudo apt-get install percona-dbaas-cli


设置组件



此处阅读有关设置的更多信息



首先,您需要登录自己的Google帐户。此外,Google Cloud允许一个用户拥有许多独立项目,因此您需要使用该项目的代码指定一个有效的项目:



gcloud auth login
gcloud config set project hidden-brace-236921


接下来,我们创建一个集群。对于该演示,我创建了一个仅包含三个节点的Kubernetes集群-这是实现高可用性的最低要求:



gcloud container clusters create --zone us-central1-a your-cluster-name --cluster-version 1.15 --num-nodes=3


以下kubectl命令为当前用户提供了所需的特权:



kubectl create clusterrolebinding cluster-admin-binding-$USER 
--clusterrole=cluster-admin --user=$(gcloud config get-value core/account)


然后,我们创建一个名称空间并将其激活。粗略地说,命名空间也类似于项目或环境,但是已经在Kubernetes集群中。它独立于Google Cloud项目:



kubectl create namespace my-namespace
kubectl config set-context --current --namespace=my-namespace


我们启动集群



在完成了这些步骤之后,我们可以使用以下简单命令启动由三个节点组成的集群:



# percona-dbaas mysql create-db example
Starting ......................................... [done]
Database started successfully, connection details are below:
Provider:          k8s
Engine:            pxc
Resource Name:     example
Resource Endpoint: example-proxysql.my-namespace.pxc.svc.local
Port:              3306
User:              root
Pass:              Nt9YZquajW7nfVXTTrP
Status:            ready


如何连接到集群



默认情况下,它仅在Kubernetes内部可用。也就是说,从您运行“创建”命令的服务器上,该服务器不可用。为了使其可用(例如,用于与客户端进行的测试),您需要通过端口映射传递端口:



kubectl port-forward svc/example-proxysql 3306:3306 $


然后,我们连接您的MySQL客户端:



mysql -h 127.0.0.1 -P 3306 -uroot -pNt9YZquajW7nfVXTTrP


高级集群管理命令



公共IP数据库



如果您想要一个更永久的群集可用性解决方案,则可以获取一个外部IP地址。在这种情况下,可以从任何地方访问数据库。它不太安全,但通常更方便。对于外部IP,请使用以下命令:



# percona-dbaas mysql create-db exposed 
--options="proxysql.serviceType=LoadBalancer"
Starting ......................................... [done]
Database started successfully, connection details are below:
Provider:          k8s
Engine:            pxc
Resource Name:     exposed
Resource Endpoint: 104.154.133.197
Port:              3306
User:              root
Pass:              k0QVxTr8EVfgyCLYse
Status:            ready

To access database please run the following command:
mysql -h 104.154.133.197 -P 3306 -uroot -pk0QVxTr8EVfgyCLYse


明确设置密码



您可以显式设置密码,而不是系统随机生成密码:



# percona-dbaas mysql create-db withpw --password=mypassword
Starting ......................................... [done]
Database started successfully, connection details are below:
Provider:          k8s
Engine:            pxc
Resource Name:     withpw
Resource Endpoint: withpw-proxysql.my-namespace.pxc.svc.local
Port:              3306
User:              root
Pass:              mypassword
Status:            ready


我以人类可读的格式显示脚本输出,但也支持JSON格式。



关闭高可用性



您可以使用以下命令来关闭高可用性以扩展单个节点:



# percona-dbaas mysql create-db singlenode 
--options="proxysql.enabled=false, allowUnsafeConfigurations=true,pxc.size=1"
Starting ......................................... [done]
Database started successfully, connection details are below:
Provider:          k8s
Engine:            pxc
Resource Name:     singlenode
Resource Endpoint: singlenode-pxc.my-namespace.pxc.svc.local
Port:              3306
User:              root
Pass:              22VqFD96mvRnmPMGg
Status:            ready


这是一种针对测试问题的解决方案,以快速轻松地生成MySQL,对其进行测试,然后进行汇总或将其用于开发。



Percona DBaaS CLI工具可帮助您在Kubernetes上获得类似于DBaaS的解决方案。同时,我们继续致力于其功能和可用性。



该演讲最初是由Mail.ru Cloud Solutions&Tarantool@Databases Meetup上进行的。观看其他演讲的视频,并订阅Mail.ru Group中围绕Kubernetes的Telegram中的事件公告



关于该主题还需要阅读什么:



  1. 现代IIoT平台中的数据库。
  2. 如何为项目选择数据库以免再次选择。



All Articles