跳至主要内容

託管 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 啟用附加元件。

使用附加元件​

  1. 在 Harvester UI 的 Dashboard 畫面上,建立一個 VM 網路。

  2. 使用命令列工具 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
  3. 建立一個 VM,並將其連接到您先前建立的 VM 網路。

  4. 等待相應的 VirtualMachineNetworkConfig 物件建立完成,且 VM 網路介面的 MAC 位址套用到該物件。

  5. 檢查 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
  6. 檢查 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)

IPPool CRD​

IPPool CRD 允許您定義 IP 集區資訊。您必須將每個 IPPool 物件對映到一個特定的 NetworkAttachmentDefinition (NAD) 物件,該 NAD 物件必須事先建立。

備註

Harvester 生態系統中使用了多個名為 "IPPool" 的 CRD,包括 loadbalancer.harvesterhci.io API 群組中一個同名的 CRD。為避免問題,請確保您正在處理的是 network.harvesterhci.io API 群組中的 IPPool CRD。有關與負載平衡器相關的 IPPool CRD 操作的更多資訊,請參閱 IP Pool。

範例:

apiVersion: network.harvesterhci.io/v1alpha1
kind: IPPool
metadata:
name: example
namespace: default
spec:
ipv4Config:
serverIP: 192.168.100.2 # DHCP 伺服器的 IP 位址
cidr: 192.168.100.0/24 # 子網段資訊,必須是 CIDR 格式
pool:
start: 192.168.100.101
end: 192.168.100.200
exclude:
- 192.168.100.151
- 192.168.100.187
router: 192.168.100.1 # 預設閘道器(如果有)
dns:
- 1.1.1.1
domainName: example.com
domainSearch:
- example.com
ntp:
- pool.ntp.org
leaseTime: 300
networkName: default/example # NAD 物件的命名空間名稱 (namespaced name)

建立 IPPool 物件後,控制器的協調程序會初始化 IP 分配模組並為該網路產生 agent pod。

$ kubectl get ippools.network example
NAME NETWORK AVAILABLE USED REGISTERED CACHEREADY AGENTREADY
example default/example 98 0 True True True

VirtualMachineNetworkConfig CRD​

VirtualMachineNetworkConfig CRD 類似於 IP 位址發放請求,並與 NetworkAttachmentDefinition (NAD) 物件相關聯。

一個 VirtualMachineNetworkConfig 物件範例如下:

apiVersion: network.harvesterhci.io/v1alpha1
kind: VirtualMachineNetworkConfig
metadata:
name: test-vm
namespace: default
spec:
networkConfig:
- macAddress: 22:37:37:82:93:7d
networkName: default/example
vmName: test-vm

建立 VirtualMachineNetworkConfig 物件後,控制器會嘗試從 IP 分配模組為每個記錄的 MAC 位址檢索未使用的 IP 位址清單。然後,IP-MAC 對映會更新到 VirtualMachineNetworkConfig 物件和相應的 IPPool 物件中。

備註

在大多數情況下,無需手動為 VM 建立 VirtualMachineNetworkConfig 物件,因為 harvester-vm-dhcp-controller 會在 VirtualMachine 協調過程中處理該任務。自動建立的 VirtualMachineNetworkConfig 物件會在 VirtualMachine 物件移除時被刪除。