暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

适用于Kubernetes和应用程序开发人员的EDB Postgres

原创 eternity 2022-09-16
423

EDB Postgres for Kubernetes是一个Kubernete运营商,由EDB设计,用于在生产环境中部署和管理PostgreSQL集群。这并不意味着它仅作为生产工具有用;它在开发应用程序时也很方便

尽管EDB Postgres for Kubernetes主要用于在同一Kubernete集群中运行的容器化应用程序,并且依赖PostgreSQL数据库作为后端,但您也可以将其用于不在容器中的应用程序。

在这篇博客文章中,我们将展示任何应用程序开发人员的用例,他们希望在进入登台环境之前,在本地机器上根据PostgreSQL数据库轻松开发、调试和测试他们的软件。

例如,考虑测试一些数据库工作负载在OLTP和OLAP之间分配的应用程序:您希望在集群主服务器上执行OLTP流量,并在副本上卸载OLAP流量。在这种情况下,使用EDB Postgres for Kubernetes部署PostgreSQL集群要比设置PostgreSQL群集容易得多。

在这篇文章中,您将学习如何:

  • 使用Kind在本地开发环境中设置Kubernetes沙盒集群

  • 在您的沙盒Kubernetes集群中安装EDB Postgres for Kubernete操作符

  • 在沙盒集群中部署PostgreSQL集群

  • 使用服务和机密将应用程序连接到PostgreSQL集群

  • 在kubectl中使用“port forward”命令在沙盒集群外部公开服务,以用于开发目的

如何使用kind创建Kubernetes沙盒集群

注意:本节是关于在本地机器上安装沙盒Kubernetes集群。如果您已经完成了,请跳过它。

首先,如果您尚未在开发环境中配置它,则需要安装Docker。Docker Engine官方网站上的安装Docker引擎页面包含许多平台的安装说明。

要测试Docker安装是否正常,可以使用hello world映像,如下例所示:

$ docker run --rm hello-world
复制

此消息显示您的安装似乎工作正常。

这意味着您的Docker引擎工作正常!现在是时候安装Kind了。

Kind代表“Docker中的Kubernetes”,是在本地环境中创建Kubernete集群的一个很好的工具。它的好处是,尽管它是轻量级的,但Kind使用的可执行文件与真正的生产文件相同。这个安装仍然是符合CNCF的Kubernetes,它是在开发过程中实现基础设施抽象的一种方法,这是DevOps的一个重要功能

您可以使用首选的软件包管理器安装“kind”,或者从项目的Github存储库的发布页面下载。重要的是要记住将该类可执行文件放在PATH环境变量中包含的目录中,因为这将使调用更容易。实物文档中的“快速入门”页面对此有详细说明。

要测试Kind是否安装并正常工作,可以运行以下命令:

$ kind --version

kind version 0.14.0

复制

现在我们准备创建第一个Kubernetes集群!我们使用以下命令执行此操作:

$ kind create cluster

Creating cluster "kind" ...

[...]

复制

只需一分钟,我们就可以让Kubernetes集群做好测试准备:

$ kubectl get nodes

NAME                 STATUS   ROLES                  AGE   VERSION

kind-control-plane   Ready    control-plane,master   62s   v1.24.0
复制

为Kubernetes操作员安装EDB Postgres

您可以像Kubernetes中的任何其他应用程序一样,为Kubernete安装EDB Postgres:使用清单文件。您可以通过运行以下程序安装最新版本的EDB Postgres for Kubernetes(撰写本文时为1.17.0):

$ kubectl apply -f \

    https://get.enterprisedb.io/cnp/postgresql-operator-1.17.0.yaml

namespace/postgresql-operator-system

[...] 

复制

您可以通过查看cnpg系统名称空间中POD的状态来检查是否一切正常:

$ kubectl get pods -n postgresql-operator-system

NAME                                                      READY   STATUS    RESTARTS   AGE

postgresql-operator-controller-manager-XXXXXXXXX-XXXXX   1/1     Running   0          24s

复制

吊舱正在运行,一切准备就绪。您可以在文档网站的安装页面上找到有关为Kubernetes安装EDB Postgres的更多信息。

部署最小的PostgreSQL集群

虽然EDB Postgres for Kubernetes是封闭源代码软件,但您仍然可以获得持续30天的隐式评估许可。这并不意味着30天后您的数据将丢失!这只意味着30天后,运营商将停止协调集群规范和状态:每个自愈功能和每个配置更改都将不起作用。

这足以快速测试PostgreSQL集群,但对于您的生产环境来说,这还不够。有关生产计划和订阅的更多信息,请参阅文档中的“许可证密钥”页。

我们可以开始部署集群:

$ cat <<EOF | kubectl apply -f -

apiVersion: postgresql.k8s.enterprisedb.io/v1

kind: Cluster

metadata:

  name: cluster-example

spec:

  instances: 3

  storage:

    size: 1Gi

EOF

复制

这将返回如下消息:

cluster.postgresql.k8s.enterprisedb.io/集群示例已创建

上一个命令中的集群定义非常简单:我们需要的是一个具有3个副本的集群,每个副本具有1GB的空间。显然,集群CRD比这更复杂,默认的webhook将为我们完成规范。

当一切准备就绪时,您将发现每个实例有一个Pod(操作将花费大约一分钟)。就像这样:

$ kubectl get pods

NAME                READY   STATUS    RESTARTS   AGE

cluster-example-1   1/1     Running   0          2m51s

cluster-example-2   1/1     Running   0          2m30s

cluster-example-3   1/1     Running   0          2m11s

复制

服务

在传统的虚拟机/物理环境中,从应用程序访问PostgreSQL数据库时,通常需要IP地址或主机名。Kubernetes对此进行了抽象,并为客户端提供了一种连接到给定服务的对象。Kubernetes中的资源被称为“服务”。EDB Postgres for Kubernetes自动为每个集群提供并保持更新和4项服务:

$ kubectl get services -o name

service/cluster-example-any

service/cluster-example-r

service/cluster-example-ro

service/cluster-example-rw

复制

如果需要使用主服务器,可以使用集群示例rw服务,它将处理读写通信。

相反,如果您只需要从数据库中读取数据,则可以将流量卸载到cluster-example-ro以使用副本,或者将流量卸载至cluster-example-r以使用副本和主服务器。

Kubernetes将注意保持服务与实际的PostgreSQL集群状态同步,在发生意外事件(如故障切换或更新)后。

下图显示了应用程序使用集群示例rw服务时发生的情况。应用程序将数据写入集群主服务器,然后将其复制到辅助服务器:

image.png

对于只读流量,可以对任何副本执行查询。下图显示了应用程序使用群集示例ro服务时发生的情况:

image.png

证书(机密)

你的证件呢?只需查看生成的秘密:

$ kubectl get secrets -o name

secret/cluster-example-app

secret/cluster-example-ca

secret/cluster-example-replication

secret/cluster-example-server

secret/cluster-example-superuser
复制

作为应用程序,您通常不需要超级用户权限来访问PostgreSQL。已经为您创建了一个名为app的新数据库,该数据库由用户名“app”拥有,您可以使用集群示例app secret中的凭据访问该数据库。

下一个命令将转储您的凭据(随机生成),以base64编码:

$ kubectl get secret cluster-example-app -oyaml -o=jsonpath={.data}

{"password":"REDACTED","pgpass":"REDACTED","username":"REDACTED"}

A quick way to grab your password is:

$ kubectl get secret cluster-example-app -oyaml -o=jsonpath={.data.password}|base64 -d

REDACTED
复制

当您在同一Kubernetes集群中部署应用程序时,您不需要这样做,因为您可以在无状态应用程序的部署中直接使用该秘密。

$ kubectl port-forward service/cluster-example-rw 5454:5432 &

Forwarding from 127.0.0.1:5454 -> 5432

Forwarding from [::1]:5454 -> 5432
复制

现在,您可以使用本地5454端口访问PostgreSQL主服务器(我们使用了集群示例rw服务)。只需使用上一节中提取的密码:

$ psql -p 5454 -h 127.0.0.1 -U app app

Password for user app: [...]

app=> \conninfo

SSL connection (protocol: TLSv1.3, [...])

app=> select pg_is_in_recovery();

 f

(1 row)
复制

应该注意,默认情况下,EDB Postgres为Kubernetes启用SSL通信。如果您想让副本作为本地端口可用,您可以运行:

$ kubectl port-forward service/cluster-example-ro 5455:5432 &
复制

然后使用端口5455:

$ psql -p 5455 -h 127.0.0.1 -U app app

Password for user app:

app=> select pg_is_in_recovery();

 t

(1 row)
复制

如您所见,PostgreSQL实例处于连续恢复模式,这意味着它是一个具有热备份的副本。

端口转发技术也适用于远程集群,而且速度惊人。

image.png

结论

正如您所看到的,使用PostgreSQL集群创建一个沙盒Kubernetes环境非常简单、轻松、快速。最重要的是,它是自包含的,这意味着在工作结束时可以通过以下方式轻松地拒绝:

$ kind delete cluster
复制

当与PostgreSQL一起使用时,隐式30天使用许可证适用于本地开发和测试,包括在Jenkins、Gitlab或Jenkins托管的CI/CD管道中的自动化测试。这是基础设施抽象的重要一步,它减少了开发、分段和生产环境之间的可变性,并提高了产品和软件的速度。

最后,EDB Postgres for Kubernetes是一个基于开源运营商CloudNativePG的运营商,由EDB创建,现在由供应商中立社区管理。您也可以在CloudNativePG部署中重用上述大部分说明,确保遵循CloudNativePG文档中的说明。

关于作者

image.png
Leonardo Cecchi是EDB的云原生PostgreSQL首席开发人员。作为一个长期的开源爱好者,他从Slackware 3.0和PostgreSQL的第一个版本开始就一直在Linux上工作。Leonardo的主要专业领域包括Go、PostgreSQL、Kubernetes、Python、C、Linux和Windows。

原文标题:EDB Postgres for Kubernetes for Application Developers
原文作者:Leonardo Cecchi
原文链接:https://www.enterprisedb.com//blog/biganimal-cloud-native-postgresql-application-developers

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

目录
  • 如何使用kind创建Kubernetes沙盒集群
  • 为Kubernetes操作员安装EDB Postgres
  • 部署最小的PostgreSQL集群
  • 服务
  • 证书(机密)
  • 结论
  • 关于作者