본문으로 건너뛰기

12.3 PostGIS

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

바이너리를 싣는 길은 두 갈래입니다. 새 환경에서는 image volume으로 extension을 추가하는 방식을, 그 이전 환경에서는 PostGIS가 미리 담긴 operand 이미지를 씁니다. image volume의 요구 조건과 생명주기, extension 설치 권한 통제는 9.5에서 일반론으로 정리했고, 이 절은 그 적용 사례입니다.

바이너리 싣기​

방법 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는 공간 데이터 타입과 인덱스, 질의 함수를 더하는 확장이지만 기본 이미지에는 바이너리가 들어 있지 않습니다. PostgreSQL 18·Kubernetes 1.35 이상에서는 image volume extension으로, 그 이전 환경에서는 PostGIS가 담긴 operand 이미지로 바이너리를 싣습니다. 이후 Database 리소스에 extension을 선언해 켜고 version을 함께 적어 두며, pg_available_extensions·\dx·postgis_full_version()으로 설치를 확인합니다.