通常,當 DevOps 工程師在 vSphere IaaS control plane 環境中佈建虛擬機器時,OVF 範本會包含硬式編碼的詳細資料,例如基本網路組態。但是,在建立虛擬機器 CR 之前,您可能不知道也通常無法為虛擬機器的 OVF 內容指派某些值,例如,IPAM 提供的網路資料。憑藉範本字串支援,您無需提前瞭解網路資訊。可以使用以 Golang 為基礎的範本填入 OVF 內容值並設定虛擬機器的網路堆疊。
程序
- 對於要設定的所有內容,確保 OVF 檔案包含 ovf:userConfigurable="true" 項目。
透過此項目,系統可在收集資料後,將網路值預留位置 (如名稱伺服器和管理 IP) 替代為實際資料。請使用下列範例。
<Property ovf:key="hostname" ovf:type="string" ovf:userConfigurable="true" ovf:value="ubuntuguest"> <Description>Specifies the hostname for the appliance</Description> </Property> <Property ovf:key="nameservers" ovf:type="string" ovf:userConfigurable="true" ovf:value="1.1.1.1, 1.0.0.1"> <Label>2.2. DNS</Label> <Description>A comma-separated list of IP addresses for up to three DNS servers</Description> </Property> <Property ovf:key="management_ip" ovf:type="string" ovf:userConfigurable="true"> <Label>2.3. Management IP</Label> <Description>The static IP address for the appliance on the Management Port Group in CIDR format (Eg. ip/subnet mask bits). This cannot be DHCP.</Description> </Property>
- 建立包含範本字串的虛擬機器 YAML 檔案。
啟動載入資源的範本字串將收集填入 OVF 內容值所需的資料。可以使用下列方法之一來建構範本字串。
- 使用 vm-operator-api。
如需詳細資訊,請參閱 GitHub 上的以下頁面:https://github.com/vmware-tanzu/vm-operator/blob/main/api/v1alpha2/virtualmachinetempl_types.go。
以下是範例 YAML 檔案:apiVersion: vmoperator.vmware.com/v1alpha2 kind: VirtualMachine metadata: name: template-vm namespace: test-ns annotations: vmoperator.vmware.com/image-supported-check: disable spec: className: best-effort-xsmall imageName: vmi-xxxx0000 powerState: poweredOn storageClass: wcpglobal-storage-profile vmMetadata: configMapName: template-vm-1 transport: vAppConfig --- apiVersion: v1 kind: ConfigMap metadata: name: template-vm-1 namespace: test-ns data: nameservers: "{{ (index .v1alpha2.Net.Nameservers 0) }}" hostname: "{{ .v1alpha2.VM.Name }} " management_ip: "{{ (index (index .v1alpha2.Net.Devices 0).IPAddresses 0) }}" management_gateway: "{{ (index .v1alpha2.Net.Devices 0).Gateway4 }}"
- 使用下列函數。
函數名稱 特徵碼 說明 V1alpha2_FirstIP func () string 從第一個 NIC 取得第一個非回送 IP。 V1alpha2_FirstIPFromNIC func (index int) string 從第 i 個 NIC 取得非回送 IP 位址。如果索引超過範圍,將不會剖析範本字串。 V1alpha2_FormatIP func (IP string, netmask string) string 使用網路長度設定 IP 位址的格式。網路遮罩可以是長度 (例如 /24),也可以是十進位標記法 (例如 255.255.255.0)。 如果輸入網路遮罩無效或與預設遮罩不同,則不會對其進行剖析。
V1alpha2_FormatNameservers func (count int, delimiter string) string 使用特定分隔符號設定首次出現的名稱伺服器計數的格式。計數為負數是表示所有名稱伺服器。 V1alpha2_IP func(IP string) string 使用預設網路遮罩 CIDR 設定靜態 IP 位址的格式。 如果 IP 無效,將不會剖析範本字串。
V1alpha2_IPsFromNIC func (index int) []string 列出第 i 個 NIC 的所有 IP。 如果索引超過範圍,將不會剖析範本字串。
如果使用這些函數,則 YAML 檔案如下所示:apiVersion: vmoperator.vmware.com/v1alpha2 kind: VirtualMachine metadata: name: template-vm namespace: test-ns spec: className: best-effort-xsmall imageName: vmi-xxxx0000 powerState: poweredOn storageClass: wcpglobal-storage-profile vmMetadata: configMapName: template-vm-2 transport: vAppConfig --- apiVersion: v1 kind: ConfigMap metadata: name: template-vm-2 namespace: test-ns data: nameservers: "{{ V1alpha2_FormatNameservers 2 \",\" }}" hostname: "{{ .v1alpha2.VM.Name }} " management_ip: "{{ V1alpha2_FormatIP \"192.168.1.10\" \"255.255.255.0\" }}" management_gateway: "{{ (index .v1alpha2.Net.Devices 0).Gateway4 }}"
- 使用 vm-operator-api。
- 部署虛擬機器。
kubectl apply -f file_name.yaml
下一步
如果自訂失敗且虛擬機器未取得 IP 位址,請使用 vSphere 虛擬機器 Web 主控台檢查虛擬機器。請參閱使用 vSphere 虛擬機器 Web 主控台對虛擬機器進行疑難排解。