如何在Kubernetes上运行CockroachDB

495 阅读7分钟

自从这篇文章在2017年首次发表以来,StatefulSets已经变得很普遍,并允许大量的有状态工作负载在Kubernetes上运行。在这篇文章中,我们将快速浏览一下StatefulSets的历史,以及它们如何与CockroachDB和Kubernetes相匹配,然后再跳到在Kubernetes上运行CockroachDB的教程。

在一个容器化的世界中管理弹性、规模和操作的便利性,这在很大程度上是Kubernetes的宗旨,也是平台采用率自2017年以来翻倍的原因之一。 而随着容器编排继续成为主流的DevOps范式,该生态系统不断成熟,为我们的工作负载提供了更好的复制、管理和监控工具。

随着Kubernetes的发展,CockroachDB也在不断发展,最近我们用Kubernetes运营商简化了与我们的分布式数据库相关的一些日常操作。 但最终,我们在云原生社区的总体目标是单一的:在Kubernetes上简化有状态工作负载的部署。

将状态引入Kubernetes

CockroachDB通过在独立的数据库节点上复制数据,帮助解决有状态的、依赖数据库的应用,这种方式可以在任何故障中存活下来(如果我们的名字没有完全意义的话)。 CockroachDB与Kubernetes内置的扩展性、生存性和复制策略相结合,可以让你在不牺牲关键的有状态数据库的高可用性和正确性的前提下,获得协调的速度和简单性。

CockroachDB+Kubernetes=保留状态?

虽然Kubernetes对于无状态服务的使用是相当直接的,但管理和存留状态一直是一个挑战。

为什么呢? 你不能简单地换掉节点,因为它们依赖于pod-mounted存储中的数据。 而且回滚对数据库也不起作用。

一些最佳实践已经发展到解决在K8s上部署数据驱动的应用程序的挑战。

  • 在Kubernetes之外运行数据库。这产生了很多额外的工作,增加了冗余的工具,实际上会使你希望从K8s获得的价值失效。
  • 使用DBaaS这也限制了Kubernetes的规模和弹性的价值,并将你的选择限制在云服务提供商提供的那些选项中。

为了跟上现代数据驱动的应用程序的需求,Kubernetes社区开发了一种原生的方式,通过StatefulSets来管理状态。

  • StatefulSets分配了一个唯一的ID,通过自动化保持应用程序和数据库容器的连接。
  • 注意:"唯一ID "的使用在这里有点棘手。kubernetes中的每个资源都有UID来识别,但每当资源被更新时,UID就会改变。状态集分配的pod身份在pod世代中是持久的,但与UID是分开的。

状态集是CockroachDB的理想选择,因为UID意味着它不会被当作Kubernetes集群中的一个新节点,从而减少了保持数据可用所需的数据复制量。 这是有效支持快速分布式交易和我们的共识协议的关键。关于在Kubernetes上运行的CockroachDB保留状态的实际例子,请看Pure Storage的案例研究

Kubernetes教程的步骤

第一步:建立你的Kubernetes集群

今年是2021年。 有很多方法可以让你的Kubernetes集群启动和运行。 在本攻略中,我们将使用GKE。 如果你对其他途径感兴趣,我们有相应的资源。

安装了Google Cloud CLI后,通过运行GKE创建集群。

gcloud container clusters create cockroachdb-cluster

第二步:启动CockroachDB

就像大多数Kubernetes部署配置工作一样,CockroachDB的配置是由一个YAML文件管理的,比如下面这个文件。 我们已经添加了注释,以帮助提供一些背景信息。

  • 首先,从我们的GitHub仓库复制文件到一个名为 "cockroachdb-statefulset.yaml "的文件。这个文件定义了要创建的资源,在这里包括StatefulSet对象,它将启动CockroachDB容器,然后将它们附加到持久化卷上。
  • 然后,你将需要创建如下所示的资源。 如果你使用的是Minikube,你可能需要手动配置持久化卷

你应该很快看到3个副本和几个服务一起在你的集群中运行。起初,可能只有部分复制体显示,因为它们还没有全部启动。这是正常的,因为StatefulSets从第一个开始,一个一个地创建复制。

$ kubectl create -f cockroachdb-statefulset.yaml

service "cockroachdb-public" created

service "cockroachdb" created

poddisruptionbudget "cockroachdb-budget" created

statefulset "cockroachdb" created

$ kubectl get services

cockroachdb          None                 26257/TCP,8080/TCP   4s

cockroachdb-public   10.0.0.85            26257/TCP,8080/TCP   4s

kubernetes           10.0.0.1             443/TCP              1h

$ kubectl get pods

NAME            READY     STATUS    RESTARTS   AGE

cockroachdb-0   1/1       Running   0          29s

cockroachdb-1   0/1       Running   0          9s

$ kubectl get pods

NAME            READY     STATUS    RESTARTS   AGE

cockroachdb-0   1/1       Running   0          1m

cockroachdb-1   1/1       Running   0          41s

cockroachdb-2   1/1       Running   0          21s

揭开面纱

如果你想知道集群内部发生了什么,可以通过运行kubectl logs cockroachdb-0 ,查看其中一个pod的日志。

第三步、使用CockroachDB集群

如果一切按计划进行,你现在有一个集群正在运行。 祝贺你

为了在Kubernetes集群中打开一个SQL shell,你可以像这样运行一个一次性的交互式pod,使用cockroachdb-public 主机名来访问CockroachDB集群。然后,Kubernetes会自动在健康的CockroachDB实例中对该主机名的连接进行负载平衡。

$ kubectl run cockroachdb -it --image=cockroachdb/cockroach --rm --restart=Never -- sql --insecure --host=cockroachdb-public

Waiting for pod default/cockroachdb to be running, status is Pending, pod ready: false

 

Hit enter for command prompt

root@cockroachdb-public:26257> CREATE DATABASE bank;

CREATE DATABASE

root@cockroachdb-public:26257> CREATE TABLE bank.accounts (id INT PRIMARY KEY, balance DECIMAL);

CREATE TABLE

root@cockroachdb-public:26257> INSERT INTO bank.accounts VALUES (1234, 10000.50);

INSERT 1

root@cockroachdb-public:26257> SELECT * FROM bank.accounts;

+------+---------+
|  id  | balance |
+------+---------+
| 1234 | 10000.5 |
+------+---------+

(1 row)

第四步、访问CockroachDB控制台

为了获得更多关于集群行为和健康状况的信息,你可以通过端口转发从你的本地机器到其中的一个pod来调取CockroachDB控制台,如下图所示。

如果你想了解集群的运行情况,你可以通过从本地机器到其中一个pod的端口转发,尝试拉出CockroachDB的管理界面。

kubectl port-forward cockroachdb-0 8080

现在你应该可以通过访问网页浏览器中的http://localhost:8080/,访问管理界面。

CockroachDB on Kubernetes - DB Console Screen

第五步、模拟节点故障

我们之前谈到了DB的生存能力。 现在你可以自己测试一下。 当一个pod变坏或被删除时会发生什么?

  • 为了测试集群的弹性,试着通过运行类似kubectl delete pod cockroachdb-3 的命令来杀死一些容器。 这必须从不同的终端进行,同时你还在从你的SQL shell访问集群。
  • 如果你在删除与你的shell通信的同一个实例时得到一个 "连接不良 "的错误,只需重试查询。

容器现在将由StatefulSet控制器为你重新创建,就像在真正的生产故障中会发生的那样。

如果你想测试集群数据的持久性,你可以尝试一次性删除所有的pod,并确保它们从持久化卷中重新正常启动。要做到这一点,你可以运行kubectl delete pod –selector app=cockroachdb ,它可以删除所有标签app=cockroachdb. 的pod,这包括我们StatefulSet的pod。

就像在设置过程中一样,它们可能需要一些时间来重新启动。但是一旦它们再次启动并运行,你就可以从你在shell中进行的SQL查询中获得相同的数据。

第六步、扩展CockroachDB集群

在从集群中移除节点之前,你必须先告诉CockroachDB让它们退役。(这可以让节点完成飞行中的请求,拒绝任何新的请求,并将所有的范围复制和范围租赁转移到节点上)。

现在节点已经退役了,你可以通过调整StatefulSet的大小来扩展你的Kubernetes集群,简单地增加或减少复制,如下图所示。

kubectl scale statefulset cockroachdb --replicas=4

第七步、关闭CockroachDB集群

一旦你完成了工作,一条命令就可以清理我们在哦,这么简短的Kubernetes教程中创建的所有资源。我们添加到资源上的标签做了所有的工作。

kubectl delete statefulsets,pods,persistentvolumes,persistentvolumeclaims,services,poddisruptionbudget -l app=cockroachdb

你也可以通过运行关闭整个Kubernetes集群。

gcloud container clusters delete cockroachdb-cluster

何去何从

现在你已经掌握了基础知识,接下来该怎么办?

参考资料

更多关于在Kubernetes上运行CockroachDB的信息和最新的配置文件可以在我们的文档中找到。