託管 DHCP (實驗性)
harvester-vm-dhcp-controller 是一個 實驗性 的附加元件。它未包含在 Harvester ISO 中,但您可以從 experimental-addons 儲存庫 下載。有關實驗性功能的更多資訊,請參閱 功能標籤。
您可以使用嵌入式託管 DHCP (Managed DHCP) 功能來設定 IP 集區資訊,並為執行在 Harvester 叢集上的 VM 提供 IP 位址。此功能是獨立 DHCP 伺服器的替代方案,利用 harvester-vm-dhcp-controller 附加元件來簡化客體叢集的部署。
Harvester 使用規劃好的基礎設施網路,因此您必須確保網路連線可用,並預先規劃 IP 集區。
獨特功能
- DHCP 租約 (leases) 儲存在 etcd 中,作為整個叢集的單一信任來源 (single source of truth)。
- 每個租約本質上都是靜態的,且能與您目前的網路基礎設 施良好運作。
- 即使叢集的控制平面停止運作,託管 DHCP 代理程式 (Agents) 仍可為現有實體提供 DHCP 請求服務,確保您的虛擬機器工作負載網路保持可用。
限制
- 託管 DHCP 功能僅適用於在 VirtualMachine CR 中指定的網路介面。不支援在虛擬機器內部建立的網路介面。
- 虛擬機器建立後,若新增或移除網路介面,IP 位址不會被分配或釋放。實際的 MAC 位址記錄在 VirtualMachineNetworkConfig CR 中。
- 目前不支援 DHCP RELEASE 操作。
- IPPool 設定更新僅在手動重新啟動相關代理程式 pod 後才會生效。
安裝與啟用附加元件
您可以執行以下指令來安裝附加元件:
kubectl apply -f [https://raw.githubusercontent.com/harvester/experimental-addons/main/harvester-vm-dhcp-controller/harvester-vm-dhcp-controller.yaml](https://raw.githubusercontent.com/harvester/experimental-addons/main/harvester-vm-dhcp-controller/harvester-vm-dhcp-controller.yaml)
此附加元件無法動態偵測叢集特定的 Service CIDR,預設使用 10.53.0.0/16。
當您的叢集使用不同的 Service CIDR 時,您必須在 Addon CR 的 valuesContent 區段中明確設定,以避免發生問題。具體來說,當 CIDR 與預設的 10.53.0.0/16 Service CIDR 重疊時,嘗試建立 IP 集區資源 (IPPools) 可能會失敗。
範例:
apiVersion: harvesterhci.io/v1beta1
kind: Addon
metadata:
...
name: harvester-vm-dhcp-controller
namespace: harvester-system
spec:
...
valuesContent: |
serviceCIDR: <your-cluster-service-cidr> # 例如,10.96.0.0/16
您可以使用以下指令檢查叢集的 Service CIDR:
kubectl -n kube-system get pods -l component=kube-apiserver -o yaml | grep "service-cluster-ip-range"
安裝後,請在 Harvester UI 的 Dashboard 畫面上或使用命令列工具 kubectl 啟用附加元件。

使用附加元件
-
在 Harvester UI 的 Dashboard 畫面上,建立一個 VM 網路。

-
使用命令列工具 kubectl 建立一個 IPPool 物件。
cat <<EOF | kubectl apply -f -
apiVersion: network.harvesterhci.io/v1alpha1
kind: IPPool
metadata:
name: net-48
namespace: default
spec:
ipv4Config:
serverIP: 192.168.48.77
cidr: 192.168.48.0/24
pool:
start: 192.168.48.81
end: 192.168.48.90
exclude:
- 192.168.48.81
- 192.168.48.90
router: 192.168.48.1
dns:
- 1.1.1.1
leaseTime: 300
networkName: default/net-48
EOF -
建立一個 VM,並將其連接到您先前建立的 VM 網路。

-
等待相應的 VirtualMachineNetworkConfig 物件建立完成,且 VM 網路介面的 MAC 位址套用到該物件。
-
檢查 IPPool 和 VirtualMachineNetworkConfig 物件的
.status欄位,並驗證 IP 位址是否已分配並指派給該 MAC 位址。$ kubectl get ippools.network net-48 -o yaml
apiVersion: network.harvesterhci.io/v1alpha1
kind: IPPool
metadata:
creationTimestamp: "2024-02-15T13:17:21Z"
finalizers:
- wrangler.cattle.io/vm-dhcp-ippool-controller
generation: 1
name: net-48
namespace: default
resourceVersion: "826813"
uid: 5efd44b7-3796-4f02-947e-3949cb4c8e3d
spec:
ipv4Config:
cidr: 192.168.48.0/24
dns:
- 1.1.1.1
leaseTime: 300
pool:
end: 192.168.48.90
exclude:
- 192.168.48.81
- 192.168.48.90
start: 192.168.48.81
router: 192.168.48.1
serverIP: 192.168.48.77
networkName: default/net-48
status:
agentPodRef:
name: default-net-48-agent
namespace: harvester-system
conditions:
- lastUpdateTime: "2024-02-15T13:17:21Z"
status: "True"
type: Registered
- lastUpdateTime: "2024-02-15T13:17:21Z"
status: "True"
type: CacheReady
- lastUpdateTime: "2024-02-15T13:17:30Z"
status: "True"
type: AgentReady
- lastUpdateTime: "2024-02-15T13:17:21Z"
status: "False"
type: Stopped
ipv4:
allocated:
192.168.48.81: EXCLUDED
192.168.48.84: ca:70:82:e6:84:6e
192.168.48.90: EXCLUDED
available: 7
used: 1
lastUpdate: "2024-02-15T13:48:20Z"$ kubectl get virtualmachinenetworkconfigs.network test-vm -o yaml
apiVersion: network.harvesterhci.io/v1alpha1
kind: VirtualMachineNetworkConfig
metadata:
creationTimestamp: "2024-02-15T13:48:02Z"
finalizers:
- wrangler.cattle.io/vm-dhcp-vmnetcfg-controller
generation: 2
labels:
harvesterhci.io/vmName: test-vm
name: test-vm
namespace: default
ownerReferences:
- apiVersion: kubevirt.io/v1
kind: VirtualMachine
name: test-vm
uid: a9f8ce12-fd6c-4bd2-b266-245d8e77dae3
resourceVersion: "826809"
uid: 556440c7-eeeb-4daf-9c98-60ab39688ba8
spec:
networkConfig:
- macAddress: ca:70:82:e6:84:6e
networkName: default/net-48
vmName: test-vm
status:
conditions:
- lastUpdateTime: "2024-02-15T13:48:20Z"
status: "True"
type: Allocated
- lastUpdateTime: "2024-02-15T13:48:02Z"
status: "False"
type: Disabled
networkConfig:
- allocatedIPAddress: 192.168.48.84
macAddress: ca:70:82:e6:84:6e
networkName: default/net-48
state: Allocated -
檢查 VM 的序列主控台 (serial console) 並驗證 IP 位址是否已正確設定在網路介面上(透過 DHCP)。

Pod 與 CRD
當啟用 harvester-vm-dhcp-controller 時,將執行以下類型的 Pod:
- Controller (控制器):協調 (Reconciles) CRD 物件以決定 IP 與 MAC 位址之間的分配與對映。結果會持久化儲存在 IPPool 物件中。
- Webhook:在接收到請求(建立、更新和刪除)時驗證和變異 (mutates) CRD 物件。
- Agent (代理程式):處理 DHCP 請求並確保內部 DHCP 租約儲存是最新的。這是透過同步代理程式所關聯的特定 IPPool 物件來完成的。每當您建立新的 IPPool 物件時,系統會隨需產生 Agent。
此附加元件引入了以下新的 CRD:
- IPPool (ippl)
- VirtualMachineNetworkConfig (vmnetcfg)