299 lines
15 KiB
Markdown
299 lines
15 KiB
Markdown
# PVECluster 叢集架構文件
|
||
|
||
> 最後更新:2026-04-18(CT124 新增 NetBird client 100.71.40.35)
|
||
|
||
## 一、叢集概覽
|
||
|
||
| 項目 | 值 |
|
||
|---|---|
|
||
| **叢集名稱** | PVECluster |
|
||
| **PVE 版本** | 8.4.14(Kernel 6.8.12-16-pve) |
|
||
| **節點數** | 3 |
|
||
| **Quorum** | 正常(corosync_votequorum) |
|
||
| **VM/容器總數** | 22(含 1 個 template) |
|
||
| **HA** | 未啟用 |
|
||
|
||
## 二、節點硬體規格
|
||
|
||
三台節點規格完全相同:
|
||
|
||
| 項目 | 規格 |
|
||
|---|---|
|
||
| **CPU** | Intel Core i3-6100 @ 3.70GHz(2C/4T) |
|
||
| **記憶體** | 16 GB DDR4 |
|
||
| **系統碟** | ~68 GB(LVM,含 local + local-lvm) |
|
||
| **網卡** | Realtek RTL8111 GbE |
|
||
| **顯示** | Intel HD Graphics 530(內顯) |
|
||
| **SATA** | Intel Q170 Chipset AHCI |
|
||
|
||
### 節點清單
|
||
|
||
| 節點 | IP | 用途 | 上線時間 |
|
||
|---|---|---|---|
|
||
| **pve** | 192.168.42.38 | 主節點 | ~9.2 天 |
|
||
| **pve-02** | 192.168.42.39 | 工作節點 | ~9.2 天 |
|
||
| **pve-03** | 192.168.42.40 | 工作節點 | ~9.2 天 |
|
||
|
||
### 節點資源使用(即時快照)
|
||
|
||
| 節點 | CPU 使用率 | 記憶體使用 | 系統碟使用 |
|
||
|---|---|---|---|
|
||
| pve | ~7% | 6.7 GB / 16 GB (43%) | 12.2 GB / 68 GB |
|
||
| pve-02 | ~12% | 10.9 GB / 16 GB (70%) | 12.1 GB / 68 GB |
|
||
| pve-03 | ~15% | 10.1 GB / 16 GB (64%) | 11.0 GB / 68 GB |
|
||
|
||
## 三、網路架構
|
||
|
||
```
|
||
網際網路
|
||
│
|
||
▼
|
||
[192.168.42.10] Gateway(OpenWRT VM 110 的 GW)
|
||
│
|
||
├── vmbr0 (Linux Bridge)
|
||
│ ├── pve (enp1s0) — 192.168.42.38/24
|
||
│ ├── pve-02 (enp1s0) — 192.168.42.39/24
|
||
│ └── pve-03 (enp1s0) — 192.168.42.40/24
|
||
│
|
||
├── VM 110 OpenWRT — 進階路由/防火牆
|
||
│
|
||
└── 所有 VM/CT 皆掛在 vmbr0
|
||
IP 範圍:192.168.42.100 ~ 192.168.42.126
|
||
```
|
||
|
||
- **Bridge**: `vmbr0`(每節點各一,bridge port 為 `enp1s0`)
|
||
- **Gateway**: `192.168.42.10`
|
||
- **SDN Zone**: `localnetwork`(三節點皆啟用,狀態正常)
|
||
- **所有 VM/CT 靜態 IP**,格式為 `192.168.42.<VMID>`
|
||
|
||
## 四、儲存架構
|
||
|
||
### 儲存池一覽
|
||
|
||
| 儲存名稱 | 類型 | 共享 | 容量 | 已用 | 用途 |
|
||
|---|---|---|---|---|---|
|
||
| **local** | dir | 否 | 68 GB/節點 | ~12 GB | ISO、備份、模板 |
|
||
| **local-lvm** | lvmthin | 否 | ~160 GB/節點 | 變動 | VM 磁碟、CT rootfs |
|
||
| **syno-lvm** | LVM (iSCSI) | 是 | 1 TB | ~642 GB | VM 磁碟、CT rootfs(主要儲存) |
|
||
| **syno-iscsi** | iSCSI | 是 | — | — | syno-lvm 的底層 target |
|
||
| **synology-backup** | CIFS | 是 | 2.75 TB | ~2.37 TB | 備份、ISO、模板、snippets |
|
||
| **pbs** | PBS | 是 | 78 GB | ~16 GB | Proxmox Backup Server 備份 |
|
||
|
||
### 儲存拓撲
|
||
|
||
```
|
||
Synology NAS (192.168.42.20)
|
||
├── iSCSI Target ──► syno-iscsi ──► syno-lvm (LVM, 1TB, 共享)
|
||
│ └── 大部分 VM/CT 磁碟存放於此
|
||
└── CIFS Share (Backup) ──► synology-backup (2.75TB, 共享)
|
||
└── 備份、ISO、模板
|
||
|
||
Proxmox Backup Server (192.168.42.30, VM 111)
|
||
└── PBS datastore "data-store" ──► pbs (294GB, 共享)
|
||
└── VM/CT 快照備份
|
||
|
||
各節點本地
|
||
├── /var/lib/vz ──► local (68GB)
|
||
│ └── ISO、vztmpl、備份
|
||
└── LVM thin pool ──► local-lvm (~160GB)
|
||
└── 部分 VM/CT 磁碟(CT112, CT113, CT123)
|
||
```
|
||
|
||
## 五、VM / 容器清單
|
||
|
||
### QEMU 虛擬機
|
||
|
||
| VMID | 名稱 | 節點 | 狀態 | CPU | 記憶體 | 磁碟 | Tags | 用途 |
|
||
|---|---|---|---|---|---|---|---|---|
|
||
| **110** | OpenWRT | pve | running | 2C | 512 MB | 8 GB (syno-lvm) | openwrt | OpenWRT 24.10.4 路由器/防火牆/PPPoE/WireGuard |
|
||
| **111** | PBS | pve-02 | running | 2C | 2 GB | 32G + 80G (syno-lvm) | backup;pbs | PBS (192.168.42.30:8007) 78GB, 41 筆備份 |
|
||
| **120** | K3s Server | pve-02 | running | 2C | 8 GB | 83 GB (syno-lvm) | k3s | K3s control-plane(Server) |
|
||
| **121** | K3s Agent | pve | running | 2C | 8 GB | 82 GB (syno-lvm) | k3s | K3s worker node |
|
||
| **122** | K3s Agent | pve-03 | running | 2C | 8 GB | 82 GB (syno-lvm) | k3s | K3s worker node |
|
||
| **9000** | ubuntu-2404-cloud-template | pve | template | 2C | 2 GB | 3.5 GB (syno-lvm) | cloud-init;template | UEFI/q35 Cloud-init VM 模板 (user=ubuntu, DHCP) |
|
||
|
||
### LXC 容器
|
||
|
||
| VMID | 名稱 | 節點 | 狀態 | CPU | 記憶體 | 磁碟 | IP | Tags / 用途 |
|
||
|---|---|---|---|---|---|---|---|---|
|
||
| **100** | CT100 | pve-02 | running | 1C | 256 MB | 8G (syno-lvm) | .42.100 | SSH Jump Box + Bore Server (:7835) + Tailscale + NetBird (100.71.236.202, ct100.netbird.selfhosted) + Watchtower |
|
||
| **101** | CT101 | pve-02 | running | 1C | 128 MB | 8G (syno-lvm) | .42.101 | RustDesk Server (21115-21119) + Headscale (備用) + NetBird (100.71.200.94, ct101.netbird.selfhosted) + Watchtower |
|
||
| **102** | CT102 | pve | running | 1C | 512 MB | 8G (syno-lvm) | .42.102 | Tailscale + Proxy Pool + Cloudflare Tunnel + Watchtower |
|
||
| **104** | CT104 | pve | running | 1C | 96 MB | 8G (syno-lvm) | .42.104 | Caddy 靜態檔案/反向代理 (:80) + Tailscale |
|
||
| **105** | CT105 | pve | running | 1C | 128 MB | 8G (syno-lvm) | .42.105 | EchoIP (mpolden/echoip:8080) + Watchtower |
|
||
| **107** | CT107 | pve-02 | running | 1C | 64 MB | 8G (syno-lvm) | .42.107 | MailPit (axllent/mailpit, Web:8025 SMTP:1025) |
|
||
| **108** | CT108 | pve-03 | running | 4C | 2 GB | 16G (syno-lvm) | .42.108 | Python 微服務環境 (12 服務, supervisord+uv) |
|
||
| **109** | CT109 | pve | running | 1C | 512 MB | 16G (local-lvm) | .42.109 | Hermes Agent v0.9.0 (NousResearch, Python 3.11 + Node.js) |
|
||
| **112** | CT112 | pve-03 | running | 1C | 2 GB | 32G (local-lvm) | .42.112 | OpenClaw Gateway v2026.3.13 (Node.js) |
|
||
| **114** | CT114 | pve-03 | running | 1C | 128 MB | 8G (syno-lvm) | .42.114 | Podman 測試 + Nginx Quadlet (:8080) |
|
||
| **115** | CT115 | pve-02 | running | 2C | 2 GB | 40G (syno-lvm) | .42.115 | Lydia Prod — Python + Caddy + MSSQL Express |
|
||
| **116** | CT116 | pve | running | 1C | 128 MB | 8G (syno-lvm) | .42.116 | Bark 推播通知 (finab/bark-server:8080) + Watchtower |
|
||
| **117** | CT117 | pve-02 | running | 2C | 2 GB | 60G (syno-lvm) | .42.117 | Lydia Test — Python (:5000) + MSSQL Express |
|
||
| **118** | CT118 | pve-03 | running | 1C | 1 GB | 8G (syno-lvm) | DHCP | PostgreSQL 16 + Redis + Proxy Pool (10x Tor) + Podman |
|
||
| **124** | CT124 | pve-03 | running | 2C | 8 GB | 80G (syno-lvm) | .42.124 | Docker 服務集中台 (20+ 服務: NPM, Gitea, Karakeep, Vaultwarden, Jellyfin 等) + Tailscale (kernel-mode) + NetBird (100.71.40.35, ct124.netbird.selfhosted) |
|
||
| **126** | CT126 | pve | running | 1C | 256 MB | 8G (syno-lvm) | .42.126 | Headscale v0.28.0 控制伺服器 (17 節點) + Tailscale + Watchtower |
|
||
|
||
### 狀態統計
|
||
|
||
| 狀態 | 數量 |
|
||
|---|---|
|
||
| Running | 19 |
|
||
| Stopped | 0 |
|
||
| Template | 1(VM 9000) |
|
||
|
||
### 各節點負載分佈
|
||
|
||
| 節點 | VM | LXC (running) | LXC (stopped) | 分配 CPU | 分配記憶體 |
|
||
|---|---|---|---|---|---|
|
||
| **pve** | 2 (110, 121) | 6 (102,104,105,109,116,126) | 0 | 10C | ~11.5 GB |
|
||
| **pve-02** | 2 (111, 120) | 5 (100,101,107,115,117) | 0 | 11C | ~15 GB |
|
||
| **pve-03** | 1 (122) | 5 (108,112,114,118,124) | 0 | 8C | ~22 GB |
|
||
|
||
## 六、備份策略
|
||
|
||
### Proxmox Backup Server
|
||
|
||
- **位置**: VM 111(pve-02),IP `192.168.42.30:8007`
|
||
- **Datastore**: `data-store`(78 GB,已用 ~16 GB)
|
||
- **保留策略**: `keep-all=1`
|
||
|
||
### 備份排程(目前皆已停用 enabled=0)
|
||
|
||
| 排程 | 目標 | 儲存 | 保留 | 壓縮 |
|
||
|---|---|---|---|---|
|
||
| 每日 03:00 | CT115, CT117(Lydia prod/test) | pbs | keep-daily=7 | — |
|
||
| 02:30, 22:30 | CT103, CT106, CT108, CT124 | pbs | keep-daily=7 | zstd |
|
||
| 每日 02:00 | VM 110(OpenWRT) | pbs | keep-daily=3 | — |
|
||
|
||
### Synology NAS 備份
|
||
|
||
- **位置**: `192.168.42.20`,CIFS share `Backup`
|
||
- **容量**: 2.75 TB(已用 ~2.37 TB)
|
||
- CT124 有掛載 `/mnt/ds1515-backup` 指向此 share
|
||
|
||
## 七、關鍵服務架構圖
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ PVECluster │
|
||
│ 192.168.42.38/39/40 │
|
||
├──────────────┬──────────────────┬────────────────────────────────┤
|
||
│ pve (.38) │ pve-02 (.39) │ pve-03 (.40) │
|
||
├──────────────┴──────────────────┴────────────────────────────────┤
|
||
│ │
|
||
│ 【網路層】 │
|
||
│ VM110 OpenWRT 24.10.4 ── GW: 192.168.42.10 │
|
||
│ PPPoE HiNet / WireGuard VPN (10.0.0.1) │
|
||
│ DNAT: SSH Jump, Bore, NPM, RustDesk, Headscale, SQL │
|
||
│ CT104 Caddy ───── 反向代理(80/443) │
|
||
│ CT124 ─────────── NPM + Gitea + 20 服務集中台 + Tailscale + NetBird │
|
||
│ │
|
||
│ 【認證/安全】 │
|
||
│ CT124 Vaultwarden ── 密碼管理 │
|
||
│ CT100 ─────────── SSH Jump Box + Bore Server + Tailscale + NetBird │
|
||
│ CT101 ─────────── RustDesk Server + Headscale 備用 + NetBird(遠端存取) │
|
||
│ CT102 ─────────── Tailscale + Cloudflare Tunnel + Proxy Pool │
|
||
│ CT126 ─────────── Headscale 控制伺服器 (17 節點, 8080/9090/50443) │
|
||
│ │
|
||
│ 【AI / Agent】 │
|
||
│ CT109 ─────────── Hermes Agent v0.9.0 (NousResearch) │
|
||
│ │
|
||
│ 【應用服務】 │
|
||
│ CT115 Lydia ───── Prod (Python + Caddy + MSSQL, SSH:30022) │
|
||
│ CT117 Lydia ───── Test (Python:5000 + MSSQL, SSH:50022) │
|
||
│ CT108 ─────────── Python 微服務 x12 (supervisord+uv, 4C/4GB) │
|
||
│ CT112 ─────────── OpenClaw Gateway v2026.3.13 (Node.js) │
|
||
│ CT124 Karakeep ── 書籤/知識管理 + Jellyfin 媒體 │
|
||
│ │
|
||
│ 【Kubernetes (K3s v1.33.6 + Longhorn)】 │
|
||
│ VM120 K3s ─────── Server/control-plane (pve-02, 8GB) │
|
||
│ VM121 K3s ─────── Agent/worker (pve, 8GB) │
|
||
│ VM122 K3s ─────── Agent/worker (pve-03, 8GB) │
|
||
│ 服務: Traefik, CodiMD, Adminer, HTTPbin, │
|
||
│ OpenGist, PostgreSQL, Vaultwarden │
|
||
│ │
|
||
│ 【工具/通知】 │
|
||
│ CT107 ─────────── MailPit(郵件測試) │
|
||
│ CT116 ─────────── Bark(推播通知) │
|
||
│ CT105 ─────────── EchoIP(IP 查詢,port 8080) │
|
||
│ │
|
||
│ 【資料庫】 │
|
||
│ CT118 ─────────── PostgreSQL 16 + Redis + Proxy Pool (10x Tor) │
|
||
│ │
|
||
│ 【備份】 │
|
||
│ VM111 PBS ─────── Proxmox Backup Server (192.168.42.30) │
|
||
│ Synology NAS ──── iSCSI (syno-lvm) + CIFS (backup) │
|
||
│ 192.168.42.20 │
|
||
│ │
|
||
│ 【模板】 │
|
||
│ VM9000 ────────── Ubuntu 24.04 Cloud-init Template │
|
||
└──────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
## 八、已知問題與注意事項
|
||
|
||
### Tailscale kernel-mode + NetBird 共存:iptables-legacy 封包丟棄
|
||
|
||
適用場景:同一台容器/主機上 **Tailscale 以 kernel mode 運行**(非 userspace),又要加掛 NetBird client。目前 **CT124** 是此情境(CT100/CT101 的 Tailscale 是 userspace,不受影響)。
|
||
|
||
**症狀**:NetBird tunnel `wt0` 建立成功、peer 狀態 Connected,但從其他 NetBird peer ping CT124 的 `100.71.40.35` 完全不通,CT124 本地也收不到任何 NetBird 流量。
|
||
|
||
**成因**:Tailscale kernel mode 會在 `iptables-legacy` 裝 `ts-input` 和 `ts-forward` chain,預設把 `100.64.0.0/10`(CGNAT)範圍內、且 **不是** 從 `tailscale0` 進來的封包全部 DROP。NetBird 的 `100.71.0.0/16` 剛好落在這個 CGNAT 區段內,於是 `wt0` 收到的 NetBird 封包會被 Tailscale 的 rule 靜默丟掉。
|
||
|
||
**修復**:在 `iptables-legacy` 裡針對 `wt0` 介面放行,並放在 chain 最前面(`-I ... 1`)以搶在 Tailscale rule 之前:
|
||
|
||
```bash
|
||
iptables-legacy -I INPUT 1 -i wt0 -j ACCEPT
|
||
iptables-legacy -I FORWARD 1 -i wt0 -j ACCEPT
|
||
iptables-legacy -I FORWARD 1 -o wt0 -j ACCEPT
|
||
```
|
||
|
||
**開機持久化**(CT124 上已部署):
|
||
|
||
- `/usr/local/sbin/netbird-iptables-legacy-fix.sh` — 執行上述三條規則的腳本
|
||
- `/etc/systemd/system/netbird-iptables-fix.service` — 開機時呼叫該腳本的 oneshot unit
|
||
|
||
未來若有其他 CT 同時跑 Tailscale kernel mode + NetBird,需套用相同 workaround。
|
||
|
||
### Ubuntu 25.04 LXC 容器 Console 無法登入
|
||
|
||
Ubuntu 25.04 的 systemd 新增了 `ImportCredential` 指令,在 LXC 容器中不支援,導致 `console-getty.service` 啟動失敗(exit 243/CREDENTIALS),Web Console 看不到登入提示。
|
||
|
||
**修復方式**(建立容器後立即執行):
|
||
|
||
```bash
|
||
pct exec <vmid> -- bash -c 'mkdir -p /etc/systemd/system/console-getty.service.d && cat > /etc/systemd/system/console-getty.service.d/override.conf << EOF
|
||
[Service]
|
||
ExecStart=
|
||
ExecStart=-/sbin/agetty -o "-- \\\\u" --noreset --noclear --keep-baud 115200,57600,38400,9600 - \$TERM
|
||
ImportCredential=
|
||
EOF
|
||
systemctl daemon-reload && systemctl reset-failed console-getty && systemctl restart console-getty'
|
||
```
|
||
|
||
建議同時加上 `features: nesting=1` 和 `tty: 2`:
|
||
|
||
```bash
|
||
pct set <vmid> -features nesting=1 -tty 2
|
||
```
|
||
|
||
## 九、Corosync 叢集通訊
|
||
|
||
```
|
||
totem:
|
||
cluster_name: PVECluster
|
||
version: 2
|
||
secauth: on
|
||
link_mode: passive
|
||
ip_version: ipv4-6
|
||
|
||
nodelist:
|
||
pve (nodeid=1, ring0=192.168.42.38, votes=1)
|
||
pve-02 (nodeid=2, ring0=192.168.42.39, votes=1)
|
||
pve-03 (nodeid=3, ring0=192.168.42.40, votes=1)
|
||
|
||
quorum:
|
||
provider: corosync_votequorum
|
||
需要 2/3 節點在線才能維持 quorum
|
||
```
|