Files
obsidian/infra/k3s-migration.md

5.8 KiB

title, updated, status, tags
title updated status tags
K3s PostgreSQL 백엔드 이전 2026-03-26 완료
k3s
migration
postgresql
supabase

개요

기존 K3s 클러스터(외부 etcd)에서 Supabase PostgreSQL 백엔드로 전환하는 프로젝트. 2026-03-24~25 완료.

기존 클러스터 (폐기됨)

항목
노드 hp2(server), kr1(server), kr2(분리됨)
데이터스토어 외부 etcd (Incus 컨테이너 3개)
etcd 엔드포인트 http://192.168.9.214:2379, http://192.168.9.135:2379, http://192.168.9.134:2379

현재 클러스터

항목
컨트롤 플레인 kr1 (192.168.9.214), kr2 (192.168.9.135)
워커 (agent) hp2 (192.168.9.134)
데이터스토어 Supabase PostgreSQL (싱가포르)
Pooler Session mode, port 5432
DB 호스트 aws-1-ap-southeast-1.pooler.supabase.com
DB 유저 postgres.bahmyfgldxmtgvsufmwf
시크릿 Vault secret/cloud/supabase
커넥션 제한 pool_max_conns=5&pool_min_conns=1
max_connections 60 (무료 티어)
네트워크 LAN 192.168.9.x, flannel vxlan
Pod CIDR 10.42.0.0/16
Service CIDR 10.43.0.0/16
tls-san k3s.inouter.com, 192.168.9.135, 100.119.109.41
게이트웨이 Traefik (메인, DaemonSet LoadBalancer 192.168.9.53) + APISIX (SafeLine WAF 전용, LB 192.168.9.50)
LB MetalLB L2 (192.168.9.50-59), K3s ServiceLB 비활성화
스토리지 Longhorn v1.8.2
인증서 cert-manager + Google Trust Services (와일드카드 8개, Reflector)
disable traefik (Helm 별도 설치), servicelb (MetalLB 사용)

장애 시나리오

장애 영향 복구
server 1대 죽음 서비스 무중단, 나머지 server가 API 유지 자동
agent 죽음 Pod 재스케줄 자동
server 2대 동시 기존 Pod 유지, 변경 불가 아무 노드에서 k3s server 시작
Supabase DB 장애 기존 Pod 유지, 변경 불가 Supabase 복구 시 자동

Supabase 제약사항

  • Transaction mode pooler(6543) 사용 불가 — K3s Kine이 prepared statements 사용, transaction pooler와 충돌
  • Session mode pooler(5432) 필수 — pool_max_conns로 커넥션 수 제한
  • 무료 티어 max_connections=60, Pro($25/월)도 Micro는 동일
  • Small($65/월 총)로 올리면 90개
  • 싱가포르 리전 → 서울에서 ~70ms 레이턴시 (허용 범위)

마이그레이션 이력

Phase 0: 인프라 구성 (2026-03-24~25)

  • kr2 첫 server 구성, Supabase PostgreSQL 연결
  • cert-manager + 와일드카드 인증서 6개 + Reflector
  • Traefik DaemonSet (hostPort 80/443) + Gateway API
  • APISIX replica 1 (SafeLine WAF 전용, Ingress Controller 제거)
  • HAProxy 80/443 → Traefik hostPort 복원
  • Longhorn v1.8.2

Phase 12: kr1 합류 + 서비스 이전 (2026-03-2425)

  • kr1 server로 합류 → 2-server HA 확보
  • 전 서비스 이전 완료 (NocoDB, Gitea, n8n, ArgoCD, Grafana, SearXNG, SafeLine 등)

Phase 3: hp2 합류 (2026-03-25)

  • hp2 agent로 합류 (server 3대 → server 2 + agent 1 구성으로 변경)
  • Supabase 커넥션 절약 (agent는 DB 커넥션 불필요)

Vault jp1 이전 (2026-03-24)

  • jp1 Incus default 프로젝트, vault 컨테이너 (Debian 13)
  • Vault v1.21.4 (raft 스토리지, 스냅샷 복원)
  • vault-mcp-server v0.2.0 (Go 바이너리, systemd, port 8080)
  • K3s vault 네임스페이스 → ExternalName 서비스로 전환

Phase 4: 정리 (2026-03-25)

  • 기존 etcd Incus 컨테이너 폐기 완료
  • 기존 K3s server.bak 삭제 완료

Phase 5: MetalLB 도입 + 네임스페이스 정리 (2026-03-26)

  • MetalLB L2 도입 (192.168.9.50-59), K3s ServiceLB 비활성화
  • NodePort 전면 제거 → LoadBalancer 전환 (APISIX .50, sshpiper .51, Teleport .52, Traefik .53)
  • Traefik: hostPort 80/443 → LoadBalancer 192.168.9.53
  • HAProxy 백엔드: 3노드 roundrobin → MetalLB IP 단일 엔드포인트
  • k3s.inouter.com DNS: 3노드 A 레코드 → 192.168.9.53 단일
  • sshpiper 설치 (SSH 리버스 프록시, Pipe CRD)
  • Teleport 설치 + relay4wd APISIX stream 포워딩 (443→8443→192.168.9.52:443)
  • ironclad/anvil 네임스페이스 삭제 (오사카에서 서빙)
  • api 네임스페이스 신설 (namecheap-api, vultr-api, *.api.inouter.com)
  • mcp 네임스페이스 신설 (bunnycdn-mcp, kaniko 빌드, bunny.mcp.inouter.com)
  • 신규 인증서: *.api.inouter.com, *.mcp.inouter.com

현재 네임스페이스 구조

Namespace 서비스 비고
kube-system Traefik (LB .53) 메인 라우팅
apisix APISIX (LB .50) SafeLine WAF 전용
sshpiper sshpiper (LB .51) SSH 리버스 프록시
teleport Teleport (LB .52) 접근 관리
metallb-system MetalLB L2 LB
cert-manager cert-manager 인증서 (와일드카드 8개)
argocd ArgoCD GitOps
gitea Gitea + PostgreSQL + Valkey Git
api namecheap-api, vultr-api API 서비스
mcp bunnycdn-mcp MCP 서버
tools cfb-manager, nocodb 도구
db pgcat PostgreSQL 커넥션 풀러
mq rabbitmq-server 메시지 브로커
rabbitmq-system rabbitmq-cluster-operator RabbitMQ Operator
juiceshop juiceshop OWASP WAF 테스트용
monitoring VictoriaMetrics + Grafana 모니터링
longhorn-system Longhorn 스토리지
safeline SafeLine WAF 보안
openmemory OpenMemory MCP + Qdrant 메모리
vault Vault (ExternalName → jp1) 시크릿
searxng SearXNG 검색
n8n n8n 자동화
kroki Kroki 다이어그램

관련 문서