PostGIS

PostGIS は PostgreSQL の非常に人気のあるオープン

ソース拡張機能であり、データベースに GIS (地理情報システム) オブジェクトを格納し、 SQL経由でクエリを実行するためのサポートを導入します。

重要

このセクションでは、PostGIS に精通していることを前提として、CloudNativePG を介して Kubernetes で PostGIS データベースを使用して新しい PostgreSQL クラスターを作成する方法に関する基本的な情報を提供します。

CloudNativePG コミュニティは、公式の PostGIS images hosted on DockerHub の上に構築されたコンテナー イメージを維持しています。詳細については、以下をご覧ください。

PostGIS クラスターに関する基本概念

概念的には、PostGIS ベースの PostgreSQL クラスター (または単に PostGIS クラスター) は、他の PostgreSQL クラスターと似ています。唯一の違いは次のとおりです。

  • PostGIS および関連ライブラリのシステム内での存在

  • データベース内の PostGIS エクステンションの存在

CloudNativePG は Immutable Application Containers に基づいているため、PostGIS をプロビジョニングする唯一の方法は、オペランドに使用するコンテナー イメージに追加することです。 コンテナ イメージの要件 は、これがどのように達成されるかについての詳細な手順を提供します。もっと簡単に言うと、以下の例のように、コミュニティから PostGIS コンテナー イメージを使用するだけです。

2 番目のステップは、拡張機能を PostgreSQL データベースにインストールすることです。これは、次の 2 つの方法で行うことができます。

  • アプリケーションデータベースにインストールします。これは、マイクロサービスアーキテクチャに従ってクラスターでホストするメインでおそらく唯一のデータベースです。または

  • template1 データベースにインストールして、インスタンスが複数のデータベースで共有されるモノリス アーキテクチャを採用する場合に、クラスター内に作成することになるすべてのデータベースで使用できるようにします。

または Database import 。

PostGIS で新しい PostgreSQL クラスターを作成する

PostGIS 3.2 で新しい PostgreSQL 14 クラスターを作成するとします。

最初のステップは、オペランドに正しい PostGIS コンテナー イメージを使用し、Cluster リソースで .spec.imageName オプションを適切に設定することです。

以下の postgis-example.yaml は、PostGIS クラスターの作成方法に関するガイダンスを提供します。

警告

CloudNativePG では設定よりも規則が適用されますが、本番用にシステムの設定と調整に時間を費やす必要があることを考慮してください。また、以下の例の imageName は、意図的に PostgreSQL 14 の最新の利用可能なイメージを指しています。真の不変性のために、特定のイメージ名を使用するか、できれば SHA256 ダイジェストを使用する必要があります。

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: postgis-example
spec:
  instances: 3
  imageName: ghcr.io/cloudnative-pg/postgis:14
  bootstrap:
    initdb:
      postInitTemplateSQL:
        - CREATE EXTENSION postgis;
        - CREATE EXTENSION postgis_topology;
        - CREATE EXTENSION fuzzystrmatch;
        - CREATE EXTENSION postgis_tiger_geocoder;

  storage:
    size: 1Gi

この例は、アプリケーション データベース (app と呼ばれる) を実際に作成する前に、template1 データベースに対してクエリのリストを実行する postInitTemplateSQL オプションに依存しています。つまり、マニフェストを適用してクラスターが起動すると、上記の拡張機能がテンプレート データベースとアプリケーション データベースの両方にインストールされ、使用できるようになります。

app データベースに接続することで、コンテナー内にある利用可能な PostGIS のバージョンを簡単に確認できます (このドキュメントの値とは異なる値を取得する場合があります)。

$ kubectl exec -ti postgis-example-1 -- psql app
Defaulted container "postgres" out of: postgres, bootstrap-controller (init)
psql (15.2 (Debian 15.2-1.pgdg110+1))
Type "help" for help.

app=# SELECT * FROM pg_available_extensions WHERE name ~ ^postgis ORDER BY 1;
           name           | default_version | installed_version |                          comment
- -------------------------+-----------------+-------------------+------------------------------------------------------------
 postgis                  | 3.2.2           | 3.2.2             | PostGIS geometry and geography spatial types and functions
 postgis-3                | 3.2.2           |                   | PostGIS geometry and geography spatial types and functions
 postgis_raster           | 3.2.2           |                   | PostGIS raster types and functions
 postgis_raster-3         | 3.2.2           |                   | PostGIS raster types and functions
 postgis_sfcgal           | 3.2.2           |                   | PostGIS SFCGAL functions
 postgis_sfcgal-3         | 3.2.2           |                   | PostGIS SFCGAL functions
 postgis_tiger_geocoder   | 3.2.2           | 3.2.2             | PostGIS tiger geocoder and reverse geocoder
 postgis_tiger_geocoder-3 | 3.2.2           |                   | PostGIS tiger geocoder and reverse geocoder
 postgis_topology         | 3.2.2           | 3.2.2             | PostGIS topology spatial types and functions
 postgis_topology-3       | 3.2.2           |                   | PostGIS topology spatial types and functions
(10 rows)

次のステップは、postInitTemplateSQL セクションにリストされている拡張機能が app データベースに正しくインストールされていることを確認することです。

app=# \dx
                                        List of installed extensions
          Name          | Version |   Schema   |                        Description
- -----------------------+---------+------------+------------------------------------------------------------
 fuzzystrmatch          | 1.1     | public     | determine similarities and distance between strings
 plpgsql                | 1.0     | pg_catalog | PL/pgSQL procedural language
 postgis                | 3.2.2   | public     | PostGIS geometry and geography spatial types and functions
 postgis_tiger_geocoder | 3.2.2   | tiger      | PostGIS tiger geocoder and reverse geocoder
 postgis_topology       | 3.2.2   | topology   | PostGIS topology spatial types and functions
(5 rows)

ついに:

app=# SELECT postgis_full_version();
                                                                            postgis_full_version
- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 POSTGIS="3.2.2 628da50" [EXTENSION] PGSQL="140" GEOS="3.9.0-CAPI-1.16.2" PROJ="7.2.1" LIBXML="2.9.10" LIBJSON="0.15" LIBPROTOBUF="1.3.3" WAGYU="0.5.0 (Internal)" TOPOLOGY
(1 row)