04. Web UI로 PostgreSQL 클러스터 생성

1. 생성할 구성
Web UI에서 단일 인스턴스를 생성하고 SQL 실행을 확인합니다.
| 항목 | 설정값 |
|---|---|
| Namespace | postgres |
| 클러스터 이름 | demo-db |
| PostgreSQL 버전 | UI 지원 목록에서 선택 |
| 인스턴스 수 | 1 |
| CPU·메모리 | 테스트용 프로파일 |
| StorageClass | 실제 환경값 |
| 인스턴스별 디스크 | 5Gi — 예시 |
| DB Service | ClusterIP |
| 추가 Extension·SQL Script | 제외 |
| 백업·모니터링 외부 연동 | 제외 |
클러스터 생성은 PostgreSQL 인스턴스 배포입니다. 애플리케이션용 Database·Role은 접속 문서에서 생성합니다.
2. Namespace 준비
Context와 변수를 설정합니다.
export K8S_CONTEXT="$(kubectl config current-context)"
export DB_NAMESPACE="postgres"
export DB_CLUSTER="demo-db"
Namespace를 확인하고 없으면 생성합니다.
kubectl --context "$K8S_CONTEXT" get namespace "$DB_NAMESPACE"
kubectl --context "$K8S_CONTEXT" create namespace "$DB_NAMESPACE"
이미 존재하면 생성 명령은 실행하지 않습니다.
StorageClass를 확인합니다.
kubectl --context "$K8S_CONTEXT" get storageclass
Operator의 관리 Namespace를 제한했다면 postgres를 포함해야 합니다.
3. Web UI에서 생성
3.1. 생성 화면 열기
03번 문서의 /admin/ 주소로 로그인하고 클러스터 생성 화면을 엽니다.
메뉴 이름·배치는 버전에 따라 다를 수 있습니다.
3.2. 기본 정보 입력
| 항목 | 입력값 |
|---|---|
| Namespace | postgres |
| 클러스터 이름 | demo-db |
| PostgreSQL 버전 | 지원 목록에서 선택 |
| 인스턴스 수 | 1 |
선택한 PostgreSQL 버전을 기록합니다.
3.3. CPU·메모리 설정
인스턴스 프로파일을 선택하거나 준비합니다. SGInstanceProfile은 인스턴스의 CPU·메모리 설정을 정의합니다.
프로파일 목록·설정을 확인합니다.
kubectl --context "$K8S_CONTEXT" get sginstanceprofiles \
--namespace "$DB_NAMESPACE"
kubectl --context "$K8S_CONTEXT" get sginstanceprofile <PROFILE_NAME> \
--namespace "$DB_NAMESPACE" \
-o yaml
참조할 프로파일이 같은 Namespace에 있는지 확인합니다. 생성 방식은 UI 버전에 맞춰 진행합니다.
3.4. 스토리지 설정
| 항목 | 입력값 |
|---|---|
| StorageClass | 실제 선택한 이름 |
| 인스턴스별 용량 | 5Gi — 예시 |
의도하지 않은 기본 스토리지 사용을 피하도록 StorageClass를 지정합니다.
3.5. 추가 기능 확인
추가 Extension·사용자 SQL Script·외부 모니터링 연동은 제외합니다.
PgBouncer 등 기본 구성 요소는 유지합니다. 기본 커넥션 풀러는 Sidecar로 배포됩니다.
DB Service는 ClusterIP로 시작합니다. 외부 접속은 접속 문서에서 구성합니다.
3.6. 생성 실행
다음 설정을 검토하고 생성합니다.
- Namespace·클러스터 이름
- PostgreSQL 버전
- 인스턴스 수
- 리소스 프로파일
- StorageClass·용량
생성 후 UI와 Kubernetes 리소스를 함께 확인합니다.
4. 생성 상태 확인
4.1. SGCluster와 Pod
kubectl --context "$K8S_CONTEXT" get sgcluster "$DB_CLUSTER" \
--namespace "$DB_NAMESPACE"
kubectl --context "$K8S_CONTEXT" get pods \
--namespace "$DB_NAMESPACE" \
-o wide
SGCluster는 클러스터 구성을 정의하는 Custom Resource입니다. 생성된 설정을 확인합니다.
kubectl --context "$K8S_CONTEXT" get sgcluster "$DB_CLUSTER" \
--namespace "$DB_NAMESPACE" \
-o yaml
4.2. PVC와 Service
kubectl --context "$K8S_CONTEXT" get pvc \
--namespace "$DB_NAMESPACE"
kubectl --context "$K8S_CONTEXT" get svc \
--namespace "$DB_NAMESPACE"
| 대상 | 확인 항목 |
|---|---|
| SGCluster | 입력한 설정 반영 |
| Pod | Running·전체 컨테이너 Ready |
| PVC | Bound |
| Service | DB 접속 서비스 생성 |
Running이어도 Ready가 아니면 초기화 상태·로그를 확인합니다.
4.3. Pod 준비 대기
기본 Pod 이름을 사용하는 단일 인스턴스 예제입니다.
kubectl --context "$K8S_CONTEXT" wait \
--namespace "$DB_NAMESPACE" \
--for=condition=Ready \
pod/"${DB_CLUSTER}-0" \
--timeout=600s
Pod 이름이 다르면 실제 이름으로 바꿉니다. 600s는 대기 제한입니다.
5. SQL 실행 확인
5.1. 관리 컨테이너에서 접속
postgres-util 컨테이너의 psql로 접속합니다.
kubectl --context "$K8S_CONTEXT" exec -it \
--namespace "$DB_NAMESPACE" \
"${DB_CLUSTER}-0" \
--container postgres-util \
-- psql -U postgres -d postgres
컨테이너 이름이 다르면 실제 Pod 구성을 확인합니다.
5.2. 버전과 역할 확인
psql에서 실행합니다.
SELECT version();
SELECT current_database(), current_user;
SELECT pg_is_in_recovery();
단일 Primary에서는 pg_is_in_recovery()가 false인지 확인합니다.
5.3. 쓰기·읽기 확인
세션 종료 시 삭제되는 임시 테이블로 검증합니다.
CREATE TEMP TABLE stackgres_check (
id integer PRIMARY KEY,
message text
);
INSERT INTO stackgres_check
VALUES (1, 'StackGres connection OK');
SELECT * FROM stackgres_check;
예상 결과입니다.
id | message
----+-------------------------
1 | StackGres connection OK
psql을 종료합니다.
\q
이 단계는 Pod 내부 SQL 검증입니다. Service 경유·외부 접속은 접속 문서에서 확인합니다.
6. 생성 지연과 오류 확인
kubectl --context "$K8S_CONTEXT" describe pod "${DB_CLUSTER}-0" \
--namespace "$DB_NAMESPACE"
kubectl --context "$K8S_CONTEXT" get events \
--namespace "$DB_NAMESPACE" \
--sort-by=.metadata.creationTimestamp
| 증상 | 확인 항목 |
|---|---|
| PVC Pending | StorageClass·프로비저닝·배치 조건 |
| Pod Pending | 노드 리소스·Taint·볼륨 |
| ImagePullBackOff | 이미지 주소·다운로드 오류 |
| Init Container 지연 | 초기화 컨테이너 로그 |
| Running이지만 Ready 미충족 | 컨테이너 로그·Readiness |
| UI만 느림 | REST API·브라우저 요청 |
컨테이너 목록을 확인합니다.
kubectl --context "$K8S_CONTEXT" get pod "${DB_CLUSTER}-0" \
--namespace "$DB_NAMESPACE" \
-o jsonpath='{.spec.initContainers[*].name}{"\n"}{.spec.containers[*].name}{"\n"}'
문제 컨테이너의 로그를 조회합니다.
kubectl --context "$K8S_CONTEXT" logs "${DB_CLUSTER}-0" \
--namespace "$DB_NAMESPACE" \
--container <CONTAINER_NAME> \
--tail=100