☸️ Proxmox VE 實戰:從零開始構建高可用性 Kubernetes (K8s) 叢集完整指南
目標:用 Proxmox VE 打底,建立可演練、可維運、可擴充的地端 K8s HA 叢集(含控制平面 VIP、LoadBalancer、備份與故障演練)。
你會得到什麼
- 一套「底層 VM 層 HA + 上層 K8s 控制平面 HA」的可落地架構
- 可直接套用的 IP 規劃、Bridge/VLAN 分層、Gateway/DNS 佈局方式
- kubeadm 建叢集 + kube-vip 控制平面 VIP + MetalLB 對外服務 IP
- 備份/還原策略與故障演練清單(用來驗證不是「看起來很 HA」)
適用情境
- Homelab / PoC / 內網地端平台
- 想用穩定底座(Proxmox)承載 K8s,而非全裸機手刻
- 希望維運可控:模板、遷移、快照、備份、監控、升級都有路徑
提醒:HA 的核心不是「裝了什麼」,而是「壞掉時會怎樣、多久恢復、資料一致性如何保證」。
📌 目錄(點我展開)
1) 架構設計:雙層 HA 與故障域
先定義一句話:Proxmox VE HA 解決「VM/節點故障」;K8s HA 解決「控制平面/工作負載故障」。兩者疊加,才是地端最常見、也最可維運的 HA 路線。
參考拓撲(建議起手式)
Proxmox VE Cluster(3 Nodes)
├─ 網路:Mgmt / K8s-Node / Storage(選用)(可用 VLAN 分段)
├─ 儲存:ZFS / Ceph(依你的維運能力選一套先穩住)
└─ HA Manager:管理 K8s VM(控制平面/工作節點)
Kubernetes Cluster(至少 3 Control Plane + N Worker)
├─ API VIP:kube-vip(對外入口固定,支援故障切換)
├─ CNI:Calico / Cilium(二選一)
├─ Service LB:MetalLB(提供 LoadBalancer IP)
└─ Ingress:ingress-nginx(或你偏好的 Ingress Controller)
如果你只有 2 台實體主機:仍可做,但要補上 QDevice / Witness;故障域與維運難度會提升。本文以 3 節點為主,落地最穩。
2) 前置規劃:硬體、IP、Gateway、DNS
硬體建議(保守但好活)
- Proxmox 節點:至少 3 台;每台 8C/64GB 起跳較舒適(更少也能做,但升級/重建會更辛苦)
- 儲存:若做 Ceph,保留專用磁碟與網路;若做 ZFS,建議鏡像/RAIDZ 並規劃備份
- 網路:至少 2 張 NIC(Mgmt 與 K8s/Storage 分流更穩),或以 VLAN/Trunk 落實分段
IP 規劃(範例,可直接套用)
| 用途 | 網段 | 說明 |
|---|---|---|
| Mgmt(PVE 管理) | 10.10.10.0/24 | Proxmox Web/SSH、叢集管理流量 |
| K8s Node(VM 節點) | 10.10.20.0/24 | kubelet/Pod 通訊、API VIP 所在 L2(建議) |
| Storage(選用) | 10.10.30.0/24 | Ceph Replication / iSCSI / NFS 等,建議獨立 |
| Service LB Pool | 10.10.20.200-10.10.20.230 | MetalLB 發放給 LoadBalancer Service 的 IP |
| API VIP | 10.10.20.10 | kube-vip 對外固定入口(6443) |
Gateway 原則:Mgmt 與 K8s Node 網段建議各自有清楚的 Gateway(或由防火牆/核心交換器統一路由),避免「管理平面」與「服務平面」互相干擾。
3) Proxmox VE 叢集:Cluster + HA Manager
3.1 建立 Cluster(示意流程)
- 三台節點完成 Proxmox VE 安裝與基本網路(主機名、DNS、NTP)
- 選一台建立叢集,再將其他節點加入
- 確認 quorum 正常、時間同步正常(叢集最怕「時間飄」)
# 在 pve1 建立 cluster(示意)
pvecm create pve-cluster
# 在 pve2/pve3 加入(示意)
pvecm add 10.10.10.11
# 檢查叢集狀態
pvecm status
pvecm nodes
3.2 啟用 HA Manager(先抓一個明確原則)
- 先把「K8s 控制平面 VM」加入 HA(優先保命)
- 再把「K8s 工作節點 VM」加入 HA(依資源與故障策略決定)
- 若底層儲存是共享/分散式(如 Ceph),HA 遷移更順;若是本機 ZFS,請先規劃複寫與復原方式
# 建立 HA 群組(示意)
ha-manager groupadd k8s-cp --nodes pve1,pve2,pve3 --nofailback 1
# 把控制平面 VM 加入 HA(示意:vmid 201/202/203)
ha-manager add vm:201 --group k8s-cp
ha-manager add vm:202 --group k8s-cp
ha-manager add vm:203 --group k8s-cp
# 檢查 HA 狀態
ha-manager status
重點:HA 設定完不代表完成;你要做「斷電/斷網/關機」演練,確認 VM 真的會在可接受時間內恢復。
4) K8s 節點 VM:模板化、Cloud-Init、自動化
4.1 建議配置(起手式)
| 角色 | 數量 | CPU/Memory | 說明 |
|---|---|---|---|
| Control Plane | 3 | 4 vCPU / 8–16GB | 維持 etcd 與 API 穩定,避免與工作負載混住 |
| Worker | 3+ | 4–8 vCPU / 16–32GB | 承載 Pod,依服務量水平擴充 |
4.2 OS 與模板策略
- 建議使用 Ubuntu LTS / Rocky Linux 等主流發行版,並以 Cloud-Init 建模板,後續擴節點只要複製模板即可。
- VM 內建議安裝
qemu-guest-agent(讓 Proxmox 能看到真實 IP/狀態)。
5) Kubernetes:kubeadm + kube-vip + CNI
5.1 所有節點共通前置(示意)
# 關閉 swap(K8s 常見必要條件)
swapoff -a
sed -i.bak '/ swap / s/^/#/' /etc/fstab
# 常見核心參數(示意)
cat <<EOF | tee /etc/sysctl.d/99-kubernetes.conf
net.ipv4.ip_forward = 1
EOF
sysctl --system
# 安裝 container runtime(示意:containerd)
# 各發行版安裝方式不同,請依你使用的版本與官方文件進行。
5.2 控制平面 VIP:kube-vip(建議放在 K8s Node 網段 L2)
目標是讓 K8s API 對外只暴露一個入口:10.10.20.10:6443。當任一控制平面節點故障,VIP 會漂移到存活節點。
# 先決條件:三台 control plane 在同一 L2(同網段/同 VLAN)
API_VIP="10.10.20.10"
API_PORT="6443"
5.3 kubeadm init(第一台控制平面)
# 在 cp1(例如 10.10.20.21)上初始化(示意)
kubeadm init \
--control-plane-endpoint "10.10.20.10:6443" \
--upload-certs
# 設定 kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
5.4 加入其他控制平面與工作節點
# 依 kubeadm init 輸出內容,在 cp2/cp3 執行(示意)
kubeadm join 10.10.20.10:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--control-plane --certificate-key <cert-key>
# Worker 節點加入(示意)
kubeadm join 10.10.20.10:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
5.5 安裝 CNI(Calico / Cilium 二選一)
CNI 是 K8s 網路的核心元件;請依你的環境(是否需要 eBPF、是否要 NetworkPolicy)選擇。安裝後請先驗證 kubectl get nodes 全部 Ready。
6) 對外服務:MetalLB + Ingress
6.1 安裝 MetalLB(示意)
在地端沒有雲端 Load Balancer 時,MetalLB 是最常用的補位方案:讓 Service type=LoadBalancer 也能分配外部 IP。
# 安裝(示意;你可用 manifests 或 Helm)
# kubectl apply -f ...
# 配置 IP Pool(示意:10.10.20.200-10.10.20.230)
cat <<EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: lb-pool
namespace: metallb-system
spec:
addresses:
- 10.10.20.200-10.10.20.230
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: l2adv
namespace: metallb-system
spec: {}
EOF
6.2 Ingress Controller(示意)
- Ingress-NGINX:最常見起手式
- 對外入口建議配合 DNS(內網可用 split-horizon),並落實 TLS
7) 儲存與備份:PBS / etcd / 工作負載備份
7.1 VM 層(Proxmox / PBS)
- VM 層備份能快速做整機復原(含 OS / 設定 / 版本狀態),是地端維運的「救命繩」。
- 建議搭配 Proxmox Backup Server(PBS)做增量/去重,並規劃異地同步。
7.2 K8s 層(etcd 與工作負載)
- etcd snapshot:控制平面資料保命(建議排程 + 異地保存)
- 工作負載備份:可評估 Velero(搭配 S3/NFS 目的地)
- 資料庫類:優先用原生備份機制(PostgreSQL/MySQL),再談 Volume snapshot
8) 故障演練:你必須做的 6 個測試
沒有演練的 HA,等同沒有 HA。以下 6 個測試,建議你在 PoC 就做完並留下紀錄:
- 關掉一台 Proxmox 節點:控制平面 VM 是否自動在其他節點拉起?
- 關掉一台 Control Plane VM:API VIP 是否漂移?
kubectl是否可連? - 關掉一台 Worker VM:Deployment 是否自動重排?服務是否維持可用?
- MetalLB 測試:LoadBalancer IP 是否可用?ARP 是否正常?
- 備份還原:VM 層還原一台 worker,能否重新加入叢集並恢復服務?
- 升級演練:先在測試叢集演練小版本升級與回滾路徑,再推正式
9) 維運清單:升級、監控、資安與日常 SOP
9.1 日常巡檢(建議每週)
✅ Proxmox:叢集 quorum、HA 狀態、儲存健康度(Ceph/ZFS)、備份任務成功率
✅ Kubernetes:節點 Ready、核心系統 Pod、憑證到期日、etcd snapshot、告警檢視
✅ 網路:VIP 漂移測試(小流量時段)、MetalLB IP 池餘額、Gateway 路由變更紀錄
9.2 資安要點(最低限度)
- 限制管理面(Proxmox Web/SSH、K8s 管理口)來源 IP;不要把管理口暴露到不受控網段
- K8s 落實 RBAC、最小權限;必要時導入 NetworkPolicy
- 備份目的地務必隔離權限;至少一份異地且不可任意刪除(勒索情境)
結語
用 Proxmox VE 建 K8s HA 的優勢在於「可視化、可模板化、可快速重建」,但真正的價值在於:你能把故障域分層、把備援演練制度化、把維運 SOP 固化。做到這三件事,你的叢集才會從「能跑」走向「能長期跑」。
💬 留言互動:把你的環境與踩雷點留下來
你目前的 Proxmox 節點數、網段(含 Gateway)、儲存(Ceph/ZFS)、以及你選的 CNI/Ingress,會直接影響 HA 的落地方式。 若你願意,把下列資訊貼在留言,我可以用「可維運」角度幫你檢視:
- 節點數與硬體規格(CPU/RAM/磁碟)
- 網路分段(Mgmt/K8s/Storage)與 Gateway 走向
- 控制平面 VIP 方案(kube-vip / keepalived+haproxy)
- MetalLB IP Pool 範圍與對外 DNS 規劃
- 備份策略(PBS / etcd / 工作負載)與還原演練結果
延伸閱讀
- 🐧 Proxmox VE 建置教學(已發布):從零開始建立 Proxmox VE 底座
- Kubernetes 官方文件:使用 kubeadm 建立叢集
- kube-vip 官方網站:K8s 控制平面 VIP 與 HA
- MetalLB 官方文件:Installation(地端 LoadBalancer)
- Ingress NGINX 官方文件:安裝與設定
- Velero 官方文件:K8s 備份與還原
— WWFandy Blog
沒有留言:
張貼留言