建立虛擬機
如何建立虛擬機
- UI
- API
- Terraform
您可以從虛擬機頁面建立一個或多個虛擬機。
有關建立 Windows 虛擬機的資訊,請參閱此頁面。
- 選擇建立一個或多個虛擬機實例的選項。
- 選擇虛擬機的命名空間,只有
harvester-public命名空間對所有使用者可見。 - 虛擬機名稱是必填欄位。
- (選填)虛擬機範本是選填的,您可以選擇
iso-image、raw-image或windows-iso-image範本以加快虛擬機實例建立速度。 - 在 Basics 標籤上,設定以下設定:
- CPU 和 Memory: 您最多可以分配 254 個 vCPU。如果虛擬機大部分時間不會完全消耗分配的資源,您可以使用
overcommit-config設定來優化實體資源分配。作為最佳實踐,每個虛擬機分配的虛擬 CPU (vCPU) 數量不應超過主機上可用的實體處理器執行緒。 - SSHKey: 選擇 SSH 金鑰或上傳新金鑰。
- CPU 和 Memory: 您最多可以分配 254 個 vCPU。如果虛擬機大部分時間不會完全消耗分配的資源,您可以使用
- 在 Volumes 標籤上選擇自訂虛擬機映像。預設磁碟將是根磁碟。您可以向虛擬機新增更多磁碟。
- 若要設定網路,請前往 Networks 標籤。
- 預設會新增 Management Network,如果已設定 VLAN 網路,您可以將其移除。
- 您也可以使用 VLAN 網路向虛擬機新增其他網路。您可以先在 Advanced > Networks 設定 VLAN 網路。
- (選填)在 Node Scheduling 標籤上設定節點親和性規則。
- (選填)在 VM Scheduling 標籤上設定工作負載親和性規則。
- 進階選項(例如執行策略、作業系統類型和 cloud-init 資料)是選填的。您可以在適用時在 Advanced Options 區段中設定這些選項。

若要使用 Kubernetes API 建立虛擬機,請建立一個 VirtualMachine 物件。
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
name: new-vm
namespace: default
spec:
runStrategy: RerunOnFailure
template:
spec:
domain:
cpu:
cores: 2
sockets: 1
threads: 1
memory: "3996Mi"
devices:
disks: []
interfaces:
- name: default
model: virtio
masquerade: {}
machine:
type: q35
resources:
requests:
cpu: "125m"
memory: "2730Mi"
limits:
cpu: 2
memory: "4Gi"
networks:
- name: default
pod: {}
如需更多資訊,請參閱 API 參考。
若要使用 Harvester Terraform Provider 建立虛擬機,請定義一個 harvester_virtualmachine 資源區塊:
resource "harvester_virtualmachine" "opensuse154" {
name = "opensuse154"
namespace = "default"
restart_after_update = true
cpu = 2
memory = "2Gi"
run_strategy = "RerunOnFailure"
hostname = "opensuse154"
machine_type = "q35"
ssh_keys = [
harvester_ssh_key.mysshkey.id
]
network_interface {
name = "nic-1"
network_name = harvester_network.cluster-vlan1.id
wait_for_lease = true
}
disk {
name = "rootdisk"
type = "disk"
size = "10Gi"
bus = "virtio"
boot_order = 1
image = harvester_image.opensuse154.id
auto_delete = true
}
cloudinit {
user_data_secret_name = harvester_cloudinit_secret.cloud-config-opensuse154.name
network_data_secret_name = harvester_cloudinit_secret.cloud-config-opensuse154.name
}
}
磁碟區
您可以在 Volumes 標籤上新增磁碟區。預設情況下,第一個磁碟用作 root disk。您可以透過拖放磁碟區或使用箭頭按鈕來變更開機順序。
可以透過以下類型存取磁碟:
| 類型 | 說明 |
|---|---|
| disk | 此類型會將磁碟區作為普通磁碟公開給虛擬機。 |
| cd-rom | 此類型會將磁碟區作為 cd-rom 光碟機公開給虛擬機。預設情況下為唯讀。 |
在新增新的空磁碟區時可以指定磁碟區的 StorageClass;對於其他磁碟區(例如虛擬機映像),StorageClass 在映像建立期間定義。
如果您使用外部儲存,請確保選擇正確的 StorageClass 和 Volume Mode。例如,具有 nfs-csi StorageClass 的磁碟區必須使用 Filesystem 磁碟區模式。
從虛擬機映像建立磁碟區時,請確保磁碟區大小大於或等於映像大小。如果設定的磁碟區大小小於底層映像的大小,磁碟區可能會損壞。這對於 qcow2 映像特別重要,因為虛擬大小通常大於實體大小。
預設情況下,Harvester 將磁碟區大小設定為 10 GiB 或虛擬機映像的虛擬大小中較大的一個。

新增容器磁碟
容器磁碟是一個臨時儲存磁碟區,可以分配給任意數量的虛擬機,並提供在容器映像註冊表中儲存和分發虛擬機磁碟的能力。容器磁碟:
- 如果您想要複製大量不需要持久性資料的虛擬機工作負載或注入機器驅動程式,這是一個理想的工具。臨時磁碟區專為需要更多儲存但不關心資料是否在虛擬機重新啟動後持久儲存的虛擬機設計,或者只期望某些唯讀輸入資料存在於檔案中,例如設定資料或金鑰。
- 對於任何需要在虛擬機重新啟動後持久化
root disks的工作負載,這不是一個好的解決方案。
透過提供 Docker 映像在建立虛擬機時新增容器磁碟。建立虛擬機時,請遵循以下步驟:
- 前往 Volumes 標籤。
- 選擇 Add Container。

- 輸入容器磁碟的 Name。
- 選擇磁碟 Type。
- 新增 Docker Image。
- 格式 為 qcow2 或 raw 的磁碟映像必須放置在
/disk目錄中。 - 支援 raw 和 qcow2 格式,但建議使用 qcow2 以減小容器映像的大小。如果您使用不支援的映像格式,虛擬機將卡在
Running狀態。 - 容器磁碟還允許您在
/disk目錄中儲存磁碟映像。建立此類容器映像的範例可以在這裡找到。
- 格式 為 qcow2 或 raw 的磁碟映像必須放置在
- 選擇 Bus 類型。

網路
您可以透過 Networks 標籤選擇將 management network 或 VLAN network 新增到虛擬機實例,如果您已設定 VLAN 網路,則 management network 是選填的。
網路介面透過 Type 欄位設定。它們描述客體作業系統內看到的虛擬介面的屬性:
| 類型 | 說明 |
|---|---|
| bridge | 使用 Linux bridge 連接 |
| masquerade | 使用 iptables 規則透過 NAT 轉發流量 |
管理網路
管理網路代表每個虛擬機中存在的由叢集網路解決方案設定的預設虛擬機 eth0 介面。
預設情況下,虛擬機可透過叢集節點內的管理網路存取。
次要網路
也可以使用 Harvester 內建的 VLAN 網路透過其他網路連接虛擬機。
在 bridge VLAN 中,虛擬機透過 Linux bridge 連接到主機網路。網路 IPv4 位址透過 DHCPv4 委派給虛擬機。虛擬機應設定為使用 DHCP 來取得 IPv4 位址。
節點排程
Node Scheduling 允許您根據節點標籤限制虛擬機可以排程到哪些節點。

您可以選擇在以下位置執行虛擬機:
-
任何可用節點
-
特定節點
在以下範例中,目標節點的主機名稱為
harv21。nodeSelector:
kubernetes.io/hostname: harv21
如果您將排程限制為特定節點,虛擬機可能是不可遷移的。
-
符合排程規則的節點
透過在一組節點上排程虛擬機,您可以獲得更大的靈活性。在以下範例中,虛擬機可以排程到具有特定標籤的節點上。金鑰是
harvesterhci.io/group,值可以是engineering或qa。spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: harvesterhci.io/group
operator: In
values:
- engineering
- qa
如需更多詳細資訊,請參閱 Kubernetes Node Affinity 文件。
虛擬機排程
VM Scheduling 允許您根據這些節點上已執行的工作負載(虛擬機和 Pod)的標籤來限制虛擬機可以排程到哪些節點,而不是根據節點標籤。
例如,您可以將 Required 與 Affinity 結合使用,指示排程器將兩個服務的虛擬機放置在同一區域中,以提高通訊效率。同樣,使用 Preferred 與 Anti-Affinity 可以幫助將特定服務的虛擬機分佈到多個區域以提高可用性。
如需更多詳細資訊,請參閱 Kubernetes Pod Affinity 和 Anti-Affinity 文件。
自動套用的親和性規則
Harvester 可能會根據虛擬機的定義自動套用某些親和性規則。這些規則決定哪些節點有資格作為排程/遷移目標。如果沒有節點符合標準,虛擬機將無法排程/遷移。
如需更多資訊,請參閱無法排程的虛擬機。
Harvester webhook 會還原對自動套用規則的手動變更。
相關網路概念
為虛擬機設定網路的一般流程。
以下範例列出了設定叢集網路並定義連接到此叢集網路的虛擬機的流程。
-
建立名為
cn2的叢集網路。 -
建立名為
cn2-vc1的網路設定。cn2-vc1涵蓋node1和node2。 -
使用 VLAN ID
vlan id 100建立名為cn2-nad-100的虛擬機網路。 -
名為
VM vm1的虛擬機附加到名為cn2-nad-100的次要網路。
Harvester 確保以下內容:
- Harvester 控制器自動標記 Kubernetes
node物件。
kubectl get node node1 -oyaml
...
metadata:
labels:
network.harvesterhci.io/cn2: "true"
network.harvesterhci.io/mgmt: "true"
network.harvesterhci.io/vlanconfig: cn2-vc1
...
- Harvester webhook 自動更新
virtualmachine物件。
spec:
template:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: network.harvesterhci.io/cn2
operator: In
values:
- 'true'
- 虛擬機僅排程在
node1或node2上。
當虛擬機連接到由多個叢集網路支援的多個虛擬機網路時,Harvester 會套用多個親和性規則。套用的規則共同決定哪些節點有資格作為排程/遷移目標。
當虛擬機連接到由 mgmt(內建叢集網路)支援的虛擬機網路時,不會套用親和性規則。mgmt 預設涵蓋所有節點,因此所有節點都有資格作為排程/遷移目標。
當叢集網路中只有一個節點時,虛擬機是不可遷移的。
相關 CPU 固定概念
當您在節點上啟用 CPU Manager 時,Harvester 會將以下標籤套用到相關的 node 物件。
...
metadata:
labels:
cpumanager: "true"
...
當您在虛擬機建立期間啟用 CPU 固定時,Harvester 會套用一個親和性規則,確保虛擬機僅排程在啟用了 CPU Manager 的節點上。
spec:
template:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: cpumanager
operator: In
values:
- 'true'
如果僅在一個節點上啟用了 CPU Manager,虛擬機是不可遷移的。
註解
Harvester 允許您使用註解將自訂中繼資料附加到虛擬機。這些鍵值對可以啟用擴充功能或行為,而無需變更核心虛擬機設定。
您可以使用 harvesterhci.io/custom-ip 註解在 Harvester UI 上設定 IP 位址用於顯示目的。當虛擬機因缺少 qemu-guest-agent 或其他原因而無法報告其 IP 位址時,這很有用。
進階選項
執行策略
自 v1.0.2 起可用
在 v1.0.2 之前,Harvester 使用 Running(布林值)欄位來確定虛擬機實例是否應該執行。然而,簡單的布林值並不總是足以完全描述使用者的期望行為。例如,在某些情況下,使用者希望能夠從虛擬機內部關閉實例。如果使用 running 欄位,虛擬機將立即重新啟動。
為了滿足更多使用者的場景需求,引入了 RunStrategy 欄位。這與 Running 互斥,因為它們的條件有一些重疊。目前定義了四種 RunStrategies:
-
Always: 虛擬機實例將始終存在。如果虛擬機實例崩潰,將產生一個新實例。這與
Running: true的行為相同。 -
RerunOnFailure (預設): 如果先前的實例處於錯誤狀態而失敗,將重新產生虛擬機實例。如果客體成功停止(例如從客體內部關閉),則不會重新建立。
-
Manual: 虛擬機實例的存在或不存在僅由
start/stop/restartVirtualMachine 操作控制。 -
Stop: 將不會有虛擬機實例。如果客體已在執行,它將被停止。這與
Running: false的行為相同。
保留記憶體
每個虛擬機都設定了記憶體值,這個記憶體用於虛擬機客體作業系統查看和使用。在 Harvester 中,虛擬機由 Kubernetes POD 承載。記憶體限制透過 Kubernetes Pod 和容器的資源請求和限制來實現。需要一定量的記憶體來模擬和管理虛擬機執行所需的 CPU/Memory/Storage/Network/...。Harvester 和 KubeVirt 將這些額外記憶體總結為虛擬機 Memory Overhead。Memory Overhead 由複雜的公式計算。然而,有時仍然會發生 OOM(記憶體不足),相關的虛擬機會被 Harvester OS 終止,直接原因是整個 POD/Container 超過了其記憶體限制。從實踐來看,Memory Overhead 在不同類型的虛擬機、不同類型的虛擬機作業系統上有所不同,也取決於虛擬機上 執行的工作負載。
Harvester 新增了 Reserved Memory 欄位和 additional-guest-memory-overhead-ratio 設定,供使用者調整客體作業系統記憶體和 Total Memory Overhead。
Total Memory Overhead = 自動計算的 Memory Overhead + Harvester Reserved Memory。
所有詳細資訊都在 additional-guest-memory-overhead-ratio 設定中描述。
請仔細閱讀文件,了解其工作原理並在此欄位上設定適當的值。
雲端設定
Harvester 支援將啟動腳本分配給虛擬機實例的能力,該腳本在虛擬機初始化時自動執行。
這些腳本通常用於自動將使用者和 SSH 金鑰注入虛擬機,以便提供對機器的遠端存取。例如,啟動腳本可用於將憑證注入虛擬機,允許在遠端主機上執行的 Ansible 作業存取和佈建虛擬機。
Cloud-init
Cloud-init 是一個廣泛採用的專案,是用於跨平台雲端實例初始化的業界標準多發行版方法。它在所有主要雲端映像提供者(如 SUSE、Redhat、Ubuntu 等)中得到支援,cloud-init 已成為向虛擬機提供啟動腳本的事實標準方法。
Harvester 支援透過使用臨時磁碟將您的自訂 cloud-init 啟動腳本注入虛擬機實例。安裝了 cloud-init 套件的虛擬機將偵測臨時磁碟並在啟動時執行自訂 user-data 和 network-data 腳本。
預設使用者的密碼設定範例:
#cloud-config
password: password
chpasswd: { expire: False }
ssh_pwauth: True
使用 DHCP 的 network-data 設定範例:
network:
version: 1
config:
- type: physical
name: eth0
subnets:
- type: dhcp
- type: physical
name: eth1
subnets:
- type: dhcp
您也可以使用 Advanced > Cloud Config Templates 功能為虛擬機建立預定義的 cloud-init 設定範本。
執行 Ubuntu 16.04 之後版本的虛擬機的網路設定預設可能由 netplan 管理。請使用以下 network 設定作為 DHCP 設定的參考,以防止從快照或備份還原虛擬機時發生 IP 位址衝突。
network:
ethernets:
enp1s0:
dhcp4: true
dhcp6: true
dhcp-identifier: mac
version: 2
如果未指定 dhcp-identifier: mac,還原的虛擬機將從 DHCP 伺服器收到相同的 IP 位址。這是因為 netplan 預設使用機器 ID 作為 DHCP 用戶端識別碼。因此,還原的虛擬機將從 DHCP 伺服器收到相同的 IP 位址並導致 IP 位址衝突。
安裝 QEMU guest agent
QEMU guest agent 是在虛擬機實例上執行的守護程式,它向主機傳遞有關虛擬機、使用者、檔案系統和次要網路的資訊。
建立新虛擬機時,預設會啟用 Install guest agent 核取方塊。

如果您的作業系統是 openSUSE 且版本低於 15.3,請將 qemu-guest-agent.service 替換為 qemu-ga.service。
TPM 裝置
自 v1.2.0 起可用
可信平台模組 (TPM) 是一種使用加密金鑰保護硬體的加密處理器。
根據 Windows 11 需求,TPM 2.0 裝置是 Windows 11 的硬性需求。
在 Harvester UI 中,您可以透過在 Advanced Options 標籤中勾選 Enable TPM 方塊,將模擬的 TPM 2.0 裝置新增到虛擬機。
目前僅支援非持久性 vTPM,其狀態在每次虛擬機關閉後都會被清除。因此,不應啟用 Bitlocker。
ISO 安裝的一次性啟動
建立從 cd-rom 啟動的虛擬機時,您可以使用 bootOrder 選項,以便作業系統可以在映像安裝期間從 cd-rom 啟動,並在安裝完成後從磁碟啟動而無需卸載 cd-rom。
以下範例描述如何使用 openSUSE Leap 15.4 安裝 ISO 映像:
- 點擊左側欄中的 Images 並下載 openSUSE Leap 15.4 ISO 映像。
- 點擊左側欄中的 Virtual Machines,然後建立虛擬機。您需要填寫這些虛擬機基本設定。
- 點擊 Volumes 標籤,在 Image 欄位中,選擇在步驟 1 中下載的映像並確保 Type 為
cd-rom - 點擊 Add Volume 並選擇現有的 StorageClass。
- 將 Volume 拖到 Image Volume 的頂部,如下所示。這樣,Volume 的 bootOrder 將變為
1。

- 點擊 Create。
- 開啟您剛剛建立的虛擬機 web-vnc 並遵循安裝程式給出的指示。
- 安裝完成後,按照作業系統的指示重新啟動虛擬機(您可以在啟動系統後移除安裝媒體)。
- 虛擬機重新啟動後,它將自動從磁碟磁碟區啟動並啟動作業系統。