본문으로 건너뛰기

12.3 PostGIS

PostGIS는 PostgreSQL에 지리 정보 시스템(GIS) 기능을 더하는 대표적인 확장이다. 좌표·도형 같은 공간 데이터 타입과 공간 인덱스, 공간 질의 함수를 제공한다. PostGIS는 여러 관련 라이브러리와 함께 동작하므로, 기본 PostgreSQL 이미지에는 그 바이너리가 들어 있지 않다. CloudNativePG에서 PostGIS를 쓰려면 먼저 바이너리를 클러스터에 실어야 하고, 그다음 데이터베이스에 extension을 켠다.

바이너리를 싣는 길은 두 갈래다. 새 환경에서는 image volume으로 extension을 얹는 방식을, 그 이전 환경에서는 PostGIS가 미리 담긴 operand 이미지를 쓴다.

    flowchart TD
  START["PostGIS 사용"] --> Q{"PG 18+ / K8s 1.35+?"}
  Q -->|"예"| VOL["image volume<br/>extension 얹기"]
  Q -->|"아니오"| IMG["PostGIS operand<br/>이미지 사용"]
  VOL --> DB["Database 리소스로<br/>extension 선언"]
  IMG --> DB
  DB --> VERIFY["설치 검증"]
  

바이너리 싣기

방법 1: image volume extension (권장)

PostgreSQL 18 이상, Kubernetes 1.35 이상이라면 PostGIS 바이너리를 read-only 볼륨으로 마운트하는 image volume 방식을 쓴다. extension의 생애주기를 기본 PostgreSQL 이미지에서 떼어 낼 수 있다는 것이 장점이다.

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: cluster-postgis
spec:
  imageName: ghcr.io/cloudnative-pg/postgresql:18.4-minimal-trixie
  instances: 1
  storage:
    size: 1Gi
  postgresql:
    extensions:
    - name: postgis
      image:
        reference: ghcr.io/cloudnative-pg/postgis-extension:3.6.2-18-trixie
      ld_library_path:
      - system

방법 2: PostGIS operand 이미지

더 낮은 PostgreSQL·Kubernetes 버전에서는 PostGIS가 이미 담긴 이미지를 imageName으로 지정한다.

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: cluster-postgis
spec:
  instances: 1
  imageName: ghcr.io/cloudnative-pg/postgis:18.4-3.6.2-system-trixie
  storage:
    size: 1Gi

extension 켜기

바이너리가 실렸다고 바로 쓸 수 있는 것은 아니다. 데이터베이스마다 CREATE EXTENSION으로 켜야 한다. CloudNativePG에서는 Database 리소스에 선언해 operator가 관리하게 한다.

apiVersion: postgresql.cnpg.io/v1
kind: Database
metadata:
  name: cluster-postgis-app
spec:
  name: app
  owner: app
  cluster:
    name: cluster-postgis
  extensions:
  - name: postgis
    version: '3.6.2'
  - name: postgis_raster
  - name: postgis_sfcgal
  - name: fuzzystrmatch
  - name: address_standardizer
  - name: address_standardizer_data_us
  - name: postgis_tiger_geocoder
  - name: postgis_topology
extension마다 version을 명시하는 것을 권한다. CloudNativePG는 선언된 버전과 실제 버전이 다르면 ALTER EXTENSION을 실행해 자동으로 맞춘다. 버전을 적어 두면 업그레이드 경로가 선언적으로 통제된다.

설치 검증

extension이 제대로 올라왔는지 psql로 확인한다.

-- 설치 가능한 postgis 계열 확인
SELECT * FROM pg_available_extensions WHERE name ~ '^postgis';

-- 현재 켜진 extension 목록
\dx

-- PostGIS 전체 버전 정보
SELECT postgis_full_version();

정리

  • PostGIS는 공간 데이터 타입·인덱스·함수를 더하는 확장 — 기본 이미지엔 바이너리 없음
  • 바이너리 싣기: PG 18+/K8s 1.35+는 image volume extension, 그 이전은 PostGIS operand 이미지
  • extension은 Database 리소스에 선언해 선언적으로 켠다 — version 명시 권장
  • pg_available_extensions·\dx·postgis_full_version()으로 설치 확인

다음 절에서는 operator와 클러스터 사이 연결, 그리고 NetworkPolicy로 트래픽을 격리하는 networking을 본다.