通常,當 DevOps 工程師在 vSphere IaaS control plane 環境中佈建虛擬機器時,OVF 範本會包含硬式編碼的詳細資料,例如基本網路組態。但是,在建立虛擬機器 CR 之前,您可能不知道也通常無法為虛擬機器的 OVF 內容指派某些值,例如,IPAM 提供的網路資料。憑藉範本字串支援,您無需提前瞭解網路資訊。可以使用以 Golang 為基礎的範本填入 OVF 內容值並設定虛擬機器的網路堆疊。

程序

  1. 對於要設定的所有內容,確保 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>
  2. 建立包含範本字串的虛擬機器 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 }}"
  3. 部署虛擬機器。
    kubectl apply -f file_name.yaml

下一步

如果自訂失敗且虛擬機器未取得 IP 位址,請使用 vSphere 虛擬機器 Web 主控台檢查虛擬機器。請參閱使用 vSphere 虛擬機器 Web 主控台對虛擬機器進行疑難排解