k3s-to-incus-migration: APISIX 서울 유지·Tofu+Ansible·kr1 GPU 확정
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
title: K3s → Incus 이전 플랜
|
title: K3s → Incus 이전 플랜
|
||||||
updated:
|
updated:
|
||||||
- 2026-06-01 초안 작성 (kappa 결정 — K3s 운영부담 감축 위해 Incus 전환)
|
- 2026-06-01 초안 작성 (kappa 결정 — K3s 운영부담 감축 위해 Incus 전환)
|
||||||
|
- 2026-06-01 미결정 사항 확정 — APISIX 서울 유지 / 프로비저닝 OpenTofu+Ansible / kr1 GTX 1080 Ti 유지
|
||||||
tags: [infra, compute, k3s, incus, migration, plan]
|
tags: [infra, compute, k3s, incus, migration, plan]
|
||||||
status: draft
|
status: draft
|
||||||
---
|
---
|
||||||
@@ -36,10 +37,10 @@ K3s 운영 부담이 누적되어 Incus 전환 결정. 주요 통증:
|
|||||||
|
|
||||||
| 레이어 | K3s 현행 | Incus 대체 | 근거 |
|
| 레이어 | K3s 현행 | Incus 대체 | 근거 |
|
||||||
|--------|---------|-----------|------|
|
|--------|---------|-----------|------|
|
||||||
| 진입점/라우팅 | MetalLB + Traefik + APISIX | OpenWrt HAProxy → 컨테이너 IP 직접 | 이미 80/443/5432 HAProxy 경유. APISIX 서울은 운영 면적 큼 (etcd 3-replica StatefulSet) |
|
| 진입점/라우팅 | MetalLB + Traefik + APISIX | OpenWrt HAProxy → APISIX 서울 (incus 컨테이너) → 컨테이너 IP | APISIX 서울은 유지 (정책·플러그인·SafeLine 통합 가치). MetalLB·Traefik만 폐기. APISIX는 K3s StatefulSet에서 incus 단일 컨테이너 + sqlite/etcd 백엔드로 축소 |
|
||||||
| TLS 인증서 | cert-manager + Let's Encrypt | acme.sh + Cloudflare DNS-01, HAProxy/SafeLine reload | CF global key 이미 운영. cert-manager CRD 학습 비용 회피 |
|
| TLS 인증서 | cert-manager + Let's Encrypt | acme.sh + Cloudflare DNS-01, HAProxy/APISIX/SafeLine reload | CF global key 이미 운영. cert-manager CRD 학습 비용 회피 |
|
||||||
| 스토리지 | Longhorn (분산 블록) | Synology NAS NFS/iSCSI 직접 마운트 + 호스트 btrfs 로컬 | 분산 복제는 앱 레벨 HA(Patroni)로 한정. NAS는 democratic-csi 없이 직접 |
|
| 스토리지 | Longhorn (분산 블록) | Synology NAS NFS/iSCSI 직접 마운트 + 호스트 btrfs 로컬 | 분산 복제는 앱 레벨 HA(Patroni)로 한정. NAS는 democratic-csi 없이 직접 |
|
||||||
| 프로비저닝 | ArgoCD + Helm (GitGitea) | OpenTofu + cloud-init (ops-agents-tofu 패턴 확장) | 기존 헤임달/씬에서 검증 |
|
| 프로비저닝 | ArgoCD + Helm (Gitea) | **OpenTofu + Ansible** (ops-agents-tofu 패턴 확장 + playbook 표준화) | Tofu = 인프라(컨테이너 생성·디스크·네트워크 device), Ansible = 컨테이너 안 OS/앱 설정. 기존 헤임달/씬 Tofu 패턴 위에 Ansible 추가. ArgoCD GitOps는 Gitea 저장소 + Tofu Cloud 또는 atlantis로 PR 기반 plan/apply |
|
||||||
| 시크릿 | K8s Secret + Vault Agent | Vault API 직접 (envconsul/sidecar/init) | Vault는 이전 없음 |
|
| 시크릿 | K8s Secret + Vault Agent | Vault API 직접 (envconsul/sidecar/init) | Vault는 이전 없음 |
|
||||||
| 로깅 | VictoriaLogs + vector daemonset | VictoriaLogs 컨테이너 + vector systemd unit on host | 컨테이너 수집은 console.log tail |
|
| 로깅 | VictoriaLogs + vector daemonset | VictoriaLogs 컨테이너 + vector systemd unit on host | 컨테이너 수집은 console.log tail |
|
||||||
| 메트릭 | VictoriaMetrics + node-exporter daemonset | VictoriaMetrics 컨테이너 + node-exporter systemd on host | 동일 패턴 |
|
| 메트릭 | VictoriaMetrics + node-exporter daemonset | VictoriaMetrics 컨테이너 + node-exporter systemd on host | 동일 패턴 |
|
||||||
@@ -47,16 +48,16 @@ K3s 운영 부담이 누적되어 Incus 전환 결정. 주요 통증:
|
|||||||
| WAF | SafeLine in K3s (6 컴포넌트) | SafeLine docker-compose → incus 단일 컨테이너 묶음 | 공식 docker-compose 그대로, K3s 분산 가치 적음 |
|
| WAF | SafeLine in K3s (6 컴포넌트) | SafeLine docker-compose → incus 단일 컨테이너 묶음 | 공식 docker-compose 그대로, K3s 분산 가치 적음 |
|
||||||
| HA 정책 | Pod 자동 재스케줄 | 디폴트 active-passive (호스트 다운 시 분 단위 다운타임 수용) | Patroni·Vault만 자체 HA. 나머지는 분 단위 다운 허용 |
|
| HA 정책 | Pod 자동 재스케줄 | 디폴트 active-passive (호스트 다운 시 분 단위 다운타임 수용) | Patroni·Vault만 자체 HA. 나머지는 분 단위 다운 허용 |
|
||||||
|
|
||||||
미결정 (Phase 진행 중 결정):
|
확정 사항 (2026-06-01):
|
||||||
- **APISIX 서울 — 유지 vs HAProxy 통합 흡수**: 현재 ApisixRoute는 `juiceshop.keepanker.cv` 1건 + SafeLine 통합. HAProxy + SafeLine 직결로 통합 흡수 권장 (Phase 4에서 확정)
|
- **APISIX 서울 유지**: K3s StatefulSet → incus 단일 컨테이너로 축소 이전. etcd 3-replica 폐기, sqlite 또는 단일 etcd. ApisixRoute CRD는 Admin API + Tofu provider 또는 dashboard로 대체
|
||||||
- **GitOps 대체 — OpenTofu만 vs Tofu+Ansible**: Phase 1 시범 후 결정
|
- **OpenTofu + Ansible 조합**: Tofu가 incus 컨테이너·디스크·네트워크 device 생성, Ansible이 컨테이너 안 OS 설정·앱 배포. 시범 단계부터 두 도구 동시 적용
|
||||||
- **kr1 GTX 1080 Ti 활용**: Incus GPU 컨테이너로 유지, K3s 종료 후 워크로드 미정
|
- **kr1 GTX 1080 Ti 유지**: Incus GPU 컨테이너로 GPU 워크로드 계속. K3s 종료 후에도 docker-gpu/podman-gpu 이미지 활용
|
||||||
|
|
||||||
## 배치 정책
|
## 배치 정책
|
||||||
|
|
||||||
| 호스트 | 권장 워크로드 | 사유 |
|
| 호스트 | 권장 워크로드 | 사유 |
|
||||||
|--------|-------------|------|
|
|--------|-------------|------|
|
||||||
| kr1 (62GiB + GPU) | GPU 컨테이너, brokkr(현행), DB replica | GPU 자원, control-plane 부담 제거 |
|
| kr1 (62GiB + GTX 1080 Ti) | GPU 워크로드 (docker-gpu/podman-gpu 이미지 기반), brokkr(현행), postgres-2 replica | GPU 자원 유지. control-plane 부담 제거 후 GPU 활용도 확대 가능 |
|
||||||
| kr2 (30GiB) | inbest 7컨테이너 유지, mariadb-3/postgres-3 유지, **신규 무거운 워크로드 금지** | RAM 작음. K3s 폐기 후에도 OOM 위험 |
|
| kr2 (30GiB) | inbest 7컨테이너 유지, mariadb-3/postgres-3 유지, **신규 무거운 워크로드 금지** | RAM 작음. K3s 폐기 후에도 OOM 위험 |
|
||||||
| hp1 (188GiB) | 메인 호스트 — Gitea, Outline, OpenMemory, SafeLine, VictoriaLogs/Metrics | RAM 여유, 베어메탈 |
|
| hp1 (188GiB) | 메인 호스트 — Gitea, Outline, OpenMemory, SafeLine, VictoriaLogs/Metrics | RAM 여유, 베어메탈 |
|
||||||
| hp2 (188GiB) | hp1 짝꿍 — jarvis, trader 유지 + 분산 부담 분배, mariadb-1/postgres-1 유지 | RAM 여유, Tailscale 가입 |
|
| hp2 (188GiB) | hp1 짝꿍 — jarvis, trader 유지 + 분산 부담 분배, mariadb-1/postgres-1 유지 | RAM 여유, Tailscale 가입 |
|
||||||
@@ -66,9 +67,12 @@ K3s 운영 부담이 누적되어 Incus 전환 결정. 주요 통증:
|
|||||||
K3s 워크로드 이전 전 인프라 토대 구축. 약 1~2주.
|
K3s 워크로드 이전 전 인프라 토대 구축. 약 1~2주.
|
||||||
|
|
||||||
- [ ] **OpenTofu 컨테이너 모듈** 작성 (`kaffa/ops-agents-tofu`에 `modules/incus-service/` 추가): Incus 컨테이너 + 디스크 device + proxy device + cloud-init 표준화
|
- [ ] **OpenTofu 컨테이너 모듈** 작성 (`kaffa/ops-agents-tofu`에 `modules/incus-service/` 추가): Incus 컨테이너 + 디스크 device + proxy device + cloud-init 표준화
|
||||||
- [ ] **공통 베이스 이미지** (Debian 13 + vector + node-exporter + tailscale 선택적): incus image build, 캐시 push
|
- [ ] **Ansible 표준 playbook 셋업**: `kaffa/ansible-services` 신규 저장소 — inventory를 Tofu output으로 자동 생성, 공통 role(`base`, `vector-agent`, `node-exporter`, `tailscale`, `app-runtime` 등) 작성. Vault lookup plugin으로 시크릿 주입
|
||||||
- [ ] **acme.sh 인증서 발급기**: hp1에 incus 컨테이너 `acme` 신설, Cloudflare DNS-01 + Vault에서 CF global key 조회. hook으로 HAProxy reload
|
- [ ] **Tofu ↔ Ansible 연결 패턴 확정**: Tofu apply → Ansible playbook 자동 실행 (`null_resource` + `local-exec` 또는 별도 CI 단계). 적용 순서·재실행 멱등성 검증
|
||||||
- [ ] **HAProxy 확장**: OpenWrt의 `/etc/haproxy/haproxy.cfg`에 신규 backend 추가 검증 (현재 Traefik VIP 192.168.9.53 백엔드 → 컨테이너 직접 IP로 점진 전환)
|
- [ ] **공통 베이스 이미지** (Debian 13 + vector + node-exporter + tailscale 선택적): incus image build, 캐시 push. Ansible playbook으로 이미지 빌드 자체도 코드화
|
||||||
|
- [ ] **acme.sh 인증서 발급기**: hp1에 incus 컨테이너 `acme` 신설, Cloudflare DNS-01 + Vault에서 CF global key 조회. hook으로 HAProxy / APISIX / SafeLine reload
|
||||||
|
- [ ] **HAProxy 확장**: OpenWrt의 `/etc/haproxy/haproxy.cfg`에 신규 backend 추가 검증 (현재 Traefik VIP 192.168.9.53 백엔드 → APISIX 서울 incus 컨테이너 IP 또는 직접 컨테이너 IP로 점진 전환)
|
||||||
|
- [ ] **APISIX 서울 incus 컨테이너 준비**: hp1 또는 hp2에 신규 APISIX 컨테이너 생성, sqlite/etcd 백엔드 결정, 현행 K3s APISIX config·플러그인·SafeLine 통합 설정 export → 신규 컨테이너로 import. dual-run으로 검증 (Phase 4까지 K3s APISIX 병행)
|
||||||
- [ ] **NAS 마운트 표준**: Synology NFS export 디렉터리 구조 결정 (`/volume1/incus-data/<service>/`), btrfs subvol 옵션, idmap 정책
|
- [ ] **NAS 마운트 표준**: Synology NFS export 디렉터리 구조 결정 (`/volume1/incus-data/<service>/`), btrfs subvol 옵션, idmap 정책
|
||||||
- [ ] **VictoriaLogs/Metrics incus 이전 사전 작업**: jp1 monitoring 프로젝트 또는 hp1에 신규 컨테이너 — K3s VictoriaMetrics 데이터 마이그레이션 dry-run
|
- [ ] **VictoriaLogs/Metrics incus 이전 사전 작업**: jp1 monitoring 프로젝트 또는 hp1에 신규 컨테이너 — K3s VictoriaMetrics 데이터 마이그레이션 dry-run
|
||||||
- [ ] **롤백 스냅샷 정책**: `incus snapshot` 자동화 — 이전 후 일정 기간 보관
|
- [ ] **롤백 스냅샷 정책**: `incus snapshot` 자동화 — 이전 후 일정 기간 보관
|
||||||
@@ -87,8 +91,10 @@ K3s 워크로드 이전 전 인프라 토대 구축. 약 1~2주.
|
|||||||
|
|
||||||
검증 항목:
|
검증 항목:
|
||||||
- OpenTofu 모듈로 컨테이너 생성·재생성 멱등성
|
- OpenTofu 모듈로 컨테이너 생성·재생성 멱등성
|
||||||
|
- **Ansible playbook으로 컨테이너 안 설정·앱 배포 멱등성** (재실행 시 변경 없음)
|
||||||
|
- **Tofu output → Ansible inventory 자동 연결 동작**
|
||||||
- OCI 이미지 자동 업데이트 패턴 (blue-green vs in-place restart)
|
- OCI 이미지 자동 업데이트 패턴 (blue-green vs in-place restart)
|
||||||
- HAProxy → 컨테이너 IP 직접 라우팅 + SafeLine 통과 (필요 시)
|
- HAProxy → APISIX 서울 (또는 컨테이너 IP 직접) 라우팅 + SafeLine 통과 (필요 시)
|
||||||
- acme.sh 인증서 발급·갱신
|
- acme.sh 인증서 발급·갱신
|
||||||
- vector → VictoriaLogs 수집 (K3s 잔존 + 신규 incus 동시 수집)
|
- vector → VictoriaLogs 수집 (K3s 잔존 + 신규 incus 동시 수집)
|
||||||
|
|
||||||
@@ -133,14 +139,12 @@ K3s 워크로드 이전 전 인프라 토대 구축. 약 1~2주.
|
|||||||
- Redis/valkey/qdrant: 데이터 export → import 또는 NAS 볼륨 통째로 이동
|
- Redis/valkey/qdrant: 데이터 export → import 또는 NAS 볼륨 통째로 이동
|
||||||
- Gitea: LFS 데이터 NAS 이전 + clone/push 무중단 테스트
|
- Gitea: LFS 데이터 NAS 이전 + clone/push 무중단 테스트
|
||||||
|
|
||||||
## Phase 4 — 게이트웨이 정리 (1주)
|
## Phase 4 — 게이트웨이 정리 (1~2주)
|
||||||
|
|
||||||
- [ ] **APISIX 서울 폐기 결정 확정**: HAProxy + SafeLine 직결 vs APISIX 유지
|
- [ ] **APISIX 서울 incus 컨테이너 전면 전환**: Phase 0에서 준비한 incus APISIX 컨테이너로 트래픽 전환. HAProxy backend를 K3s APISIX VIP(192.168.9.50) → incus APISIX 컨테이너 IP로 변경. DNS TTL + 1주 모니터 후 K3s apisix ns 삭제
|
||||||
- HAProxy 통합 시: `juiceshop.keepanker.cv` 라우트 1건을 HAProxy backend로 이전, SafeLine chaitin-waf 플러그인 → SafeLine 컨테이너 직접 통과
|
- [ ] **Traefik 폐기**: 모든 HTTPRoute/IngressRoute → HAProxy backend(또는 APISIX 라우트)로 이전 완료 확인. K3s Traefik helm uninstall
|
||||||
- 유지 시: APISIX를 incus 단일 컨테이너로 이전 (etcd 단일 또는 sqlite backend)
|
|
||||||
- [ ] **Traefik 폐기**: 모든 HTTPRoute/IngressRoute → HAProxy backend로 이전 완료 확인. K3s Traefik helm uninstall
|
|
||||||
- [ ] **MetalLB 폐기**: LoadBalancer Service 없음 확인 후 helm uninstall
|
- [ ] **MetalLB 폐기**: LoadBalancer Service 없음 확인 후 helm uninstall
|
||||||
- [ ] **cert-manager 폐기**: 모든 Certificate CR 무사용 확인 후 helm uninstall
|
- [ ] **cert-manager 폐기**: 모든 Certificate CR 무사용 확인 (APISIX·HAProxy·SafeLine 인증서 모두 acme.sh로 대체됨) 후 helm uninstall
|
||||||
|
|
||||||
## Phase 5 — K3s 인프라 폐기 (1~2주)
|
## Phase 5 — K3s 인프라 폐기 (1~2주)
|
||||||
|
|
||||||
@@ -183,7 +187,7 @@ K3s 워크로드 이전 전 인프라 토대 구축. 약 1~2주.
|
|||||||
| RabbitMQ | mq ns | hp1 컨테이너 `rabbitmq` | 3 |
|
| RabbitMQ | mq ns | hp1 컨테이너 `rabbitmq` | 3 |
|
||||||
| PgCat/ProxySQL | db ns | hp1 또는 jp1 db 프로젝트 | 3 |
|
| PgCat/ProxySQL | db ns | hp1 또는 jp1 db 프로젝트 | 3 |
|
||||||
| VictoriaLogs/Metrics | logging/monitoring ns | hp1 컨테이너 또는 jp1 monitoring | 5 |
|
| VictoriaLogs/Metrics | logging/monitoring ns | hp1 컨테이너 또는 jp1 monitoring | 5 |
|
||||||
| APISIX 서울 | apisix ns | **폐기** (HAProxy 통합) 또는 hp1 단일 컨테이너 | 4 |
|
| APISIX 서울 | apisix ns (Deployment x2 + ingress-controller + etcd 3/3) | hp1 또는 hp2 단일 컨테이너 `apisix-seoul` (sqlite/단일 etcd 백엔드) | 0 준비 / 4 전환 |
|
||||||
| Traefik | kube-system | **폐기** | 4 |
|
| Traefik | kube-system | **폐기** | 4 |
|
||||||
| MetalLB | metallb-system | **폐기** | 4 |
|
| MetalLB | metallb-system | **폐기** | 4 |
|
||||||
| cert-manager | cert-manager | **폐기** (acme.sh로 대체) | 4 |
|
| cert-manager | cert-manager | **폐기** (acme.sh로 대체) | 4 |
|
||||||
@@ -211,7 +215,9 @@ Phase별 롤백 가능. 단 Phase 5 (Longhorn 폐기) 이후 K3s 복귀는 비
|
|||||||
|------|------|
|
|------|------|
|
||||||
| HA 손실 (호스트 다운 = 서비스 다운) | 디폴트 수용. Patroni·Vault·DNS만 자체 HA. 핵심 외 분 단위 다운타임 허용 |
|
| HA 손실 (호스트 다운 = 서비스 다운) | 디폴트 수용. Patroni·Vault·DNS만 자체 HA. 핵심 외 분 단위 다운타임 허용 |
|
||||||
| 이전 중 K3s + Incus 이중 운영 부담 | Phase 시간 단축, 시범에서 패턴 확립 후 가속 |
|
| 이전 중 K3s + Incus 이중 운영 부담 | Phase 시간 단축, 시범에서 패턴 확립 후 가속 |
|
||||||
| ArgoCD GitOps 시각화 손실 | OpenTofu state + Tofu Cloud 또는 atlantis로 보완 |
|
| ArgoCD GitOps 시각화 손실 | OpenTofu state + Tofu Cloud 또는 atlantis로 PR 기반 plan/apply. Ansible은 별도 CI 실행 로그 |
|
||||||
|
| APISIX 서울 단일 컨테이너 — etcd 3-replica 폐기 후 가용성 저하 | sqlite 백엔드 시 단일 컨테이너 다운 = 라우팅 중단. NAS 백업 + 빠른 재기동 패턴. 필요 시 hp1·hp2 active-passive 페어 |
|
||||||
|
| Tofu + Ansible 이중 도구 학습·운영 부담 | Phase 0에서 패턴 표준화·문서화. Phase 1 시범으로 마찰 조기 발견 |
|
||||||
| OCI 이미지 자동 업데이트 부재 | blue-green 패턴 표준화, renovate-bot으로 tag PR 자동 생성 |
|
| OCI 이미지 자동 업데이트 부재 | blue-green 패턴 표준화, renovate-bot으로 tag PR 자동 생성 |
|
||||||
| Longhorn 폐기 후 백업 전략 | NAS snapshot + R2 sync 기존 파이프라인 ([[backup]]) 활용 |
|
| Longhorn 폐기 후 백업 전략 | NAS snapshot + R2 sync 기존 파이프라인 ([[backup]]) 활용 |
|
||||||
| kr2 OOM 재발 (Incus 단독에서도) | inbest 7컨테이너 + DB 2 + 신규 워크로드 금지. 가벼운 것만 |
|
| kr2 OOM 재발 (Incus 단독에서도) | inbest 7컨테이너 + DB 2 + 신규 워크로드 금지. 가벼운 것만 |
|
||||||
|
|||||||
Reference in New Issue
Block a user