PostgreSQL几十年来如此流行的一个主要原因是它的可扩展性:能够用新的数据类型和函数扩展数据库引擎。
在我看来,发布在GNUGPLv2下的PostGIS是开源扩展,对PostgreSQL的采用贡献最大。PostGIS通过添加点和多边形等几何数据类型、空间索引以及许多使用SQL查询数据库的函数(例如,计算两个连接点之间的距离或最短路径)来增强PostgreSQL。
然而,本文的目的并不是列出PostGIS的好处。我不是PostGIS专家,有很多资源可以更好地描述它。
本文是关于“PostGIS和Kubernetes”的,其双重目标是:
-
演示如何使用CloudNativePG操作符在Kubernetes的PostgreSQL集群中创建PostGIS空间数据库,我是该操作符的维护者之一
-
触发与PostGIS专家和用户的对话,通过CloudNativePG改善Kubernetes的整体空间体验
为了充分理解应用程序并将其连接到PostGIS数据库,请参阅我的同事Leonardo Cecchi撰写的令人惊叹的文章“EDB Postgres for Kubernetes for Application Developers”。尽管它主要是为Kubernetes的EDB Postgres编写的,但大多数概念也适用于CloudNativePG。特别是,请密切关注有关服务、凭据以及如何连接以进行本地开发/测试的部分。
PostGIS操作数图像
CloudNativePG是围绕Immutable Application Containers(IAC)的概念设计的,我在一篇博客文章中对此进行了解释。这提供了一系列好处——对安全性和其他方面——但一个突出的优点是,这种设计可以确保此类容器映像在运行时不会被修改。它们的内容必须在构建时预定义,并适当地进行版本化,以便在“基础架构即代码”(IaC)上下文中使用。
因此,如果要运行PostGIS,则需要将其库安装在容器映像中,CloudNativePG操作员将其用作PostgreSQL操作数
幸运的是,CloudNativePG社区维护PostGIS的容器图像,这些图像基于官方DockerHub图像。
只要满足“容器图像要求”,就可以推广相同的机制。
创建PostGIS集群
PostGIS集群本质上是一个PostgreSQL集群,具有一个主实例和任意数量的备用实例,其中运行的操作数映像包含所有必需的PostGIS相关扩展。它们安装在应用程序数据库中。
默认情况下,CloudNativePG旨在创建一个由同名用户(“app”)拥有的单个应用程序数据库(称为“app“)。虽然可以通过超级用户访问创建多个数据库和用户,但我们建议为单个数据库保留一个集群,因此采用微服务方法。
您只需使用上面目录中首选的PostgreSQL/PostGIS组合映像创建一个新的“集群”资源,然后在应用程序数据库的初始化后阶段添加所需的create EXTENSION语句。如果您已经在Kubernetes集群中安装了CloudNativePG开放源码运营商,那么上述内容可以转换为以下YAML行:
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: postgis-example
spec:
instances: 3
imageName: ghcr.io/cloudnative-pg/postgis:14-3.2
bootstrap:
initdb:
postInitApplicationSQL:
- CREATE EXTENSION postgis;
- CREATE EXTENSION postgis_topology;
- CREATE EXTENSION fuzzystrmatch;
- CREATE EXTENSION postgis_tiger_geocoder;
storage:
size: 10Gi
walStorage:
size: 2Gi
上述列表创建了一个3节点PostgreSQL 14集群,其中有一个主副本和两个副本,每个副本都有10Gi用于PGDATA,2Gi保留用于WAL,PostGIS 3.2安装在主应用程序数据库中,还有几个扩展。
连接到PostGIS集群
CloudNativePG自动提供一种“ClusterIP”类型的服务来连接到主服务器(并在故障切换和切换后更新),因此驻留在同一Kubernetes集群内的应用程序只需指向它即可。这样的服务使用集群的相同名称,后缀为“-rw”。在上面的示例中,应用程序可以使用“PostGIS example rw”主机名、“app”用户和“app“数据库连接到PostGIS集群。“app”用户的密码在“postgis示例应用程序”密码中,如文档中所述。
拥有服务后,您还可以配置从Kubernetes集群外部的访问,使用不同类型的服务,这也取决于提供商。
如果你不熟悉Kubernetes的一些实际方面,我上面分享的莱昂纳多·切基的文章将非常有用。
结论
正如我在本文开头提到的,我来到这里是为了在PostGIS和Kubernetes空间中触发新的对话。我们欢迎PostGIS用户的反馈和贡献,并鼓励加入我们的开放和供应商中立的CloudNativePG社区。我很想听到在Kubernetes运行PostGIS应用程序的用户使用我们的运营商帮助我们了解更多关于您试图实现和改进我们软件的目标的故事。
EDB为基于RedHat UBI 8的PostgreSQL和PostGIS提供社区图像,并为与EDB Postgres for Kubernetes运营商一起运行的Postgres-Advanced服务器提供PostGIS图像。
请按照网站上的说明立即尝试CloudNativePG。EDB作为CloudNativePG的最初创建者和社区成员,通过社区360计划为所有受支持的Kubernetes版本提供专业支持。
EDB将作为银牌赞助商参加在底特律举行的下一届KubeCon NA会议。10月27日,我将与Ondat的Chris Milsted谈论“Kubernetes上的数据,在Kubernete集群中部署和运行PostgreSQL和数据库模式”。不要错过这个机会!
关于作者

Gabriele Bartolini是PostgreSQL和Kubernetes的爱好者,是EDB的云原生副总裁。他是PostgreSQL Europe的联合创始人,Barman的创始成员,曾任全球支持总监和第二象限联合创始人,在那里他一直为组织的发展做出贡献…
原文标题:Create a PostGIS Database in Kubernetes with CloudNativePG and Improve the Spatial Experience
原文作者:Gabriele Bartolini
原文链接:https://www.enterprisedb.com/blog/create-postgis-database-kubernetes-cloudnativepg-and-improve-spatial-experience




