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

我的名字是 Petr Zaitsev,我是首席执行官、创始人 佩尔科纳 我想告诉你:

  • 我们如何从开源解决方案转向数据库即服务;
  • 在云中部署数据库有哪些方法;
  • Kubernetes 如何取代 DBaaS,消除供应商依赖并保持 DBMS 即服务的简单性。

本文是根据 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是一种通用解决方案,在许多供应商的私有云、公共云和混合云中都得到支持,例如:AWS、Google Cloud、Microsoft Azure、 Mail.ru 云解决方案.

Kubernetes 如何与数据库配合使用

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

然而,Kubernetes 最近出现了一些允许使用数据库和其他有状态应用程序的功能:

  1. StatefulSet 概念是一系列用于处理有关停止 Pod 工作和实现 Graceful Shutdown(应用程序的可预测关闭)的事件的原语。
  2. 持久卷是与 pod、Kubernetes 管理对象关联的数据存储。
  3. Operator Framework - 即创建用于管理分布在多个节点上的数据库和其他有状态应用程序的组件的能力。

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

Percona 有两个针对 Kubernetes 的开源解决方案:

  1. Percona Server for MongoDB 的 Kubernetes Operator。
  2. Kubernetes Operator for XtraDB CLUSTER 是一个兼容 MySQL 并提供高可用性和一致性的服务。 如果不需要高可用性(例如开发数据库),您也可以使用单个节点。

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

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

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

为了让 DBaaS 正常工作,我们需要以下组件:

  1. 库贝克特尔。
  2. 谷歌云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

安装谷歌云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 Tool 仍然是一个实验性产品,因此它位于实验存储库中,即使您已经安装了 Percona 存储库,也必须单独启用该工具。

详情 这里.

安装算法:

  1. 使用 percona-release 工具设置 Percona 存储库。 首先你需要从 Percona 下载并安装官方的 percona-release 包:
    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 云解决方案和 Tarantool 提供。 看 视频 其他表演并在 Telegram 上订阅活动公告 Mail.ru Group 围绕 Kubernetes 展开.

关于该主题还可以阅读什么:

  1. 现代 IIoT 平台中的数据库。
  2. 如何为项目选择数据库,这样您就不必再次选择。

来源: habr.com

添加评论