Windows 自訂機器映像

本主題說明如何建立 Windows 自訂機器映像,Tanzu Kubernetes Grid (TKG) 可以使用該映像建立和管理在 Windows worker 節點上執行基於 Windows 的工作負載之工作負載叢集。

如果您是以舊版 Windows 元件 (如 .NET Framework) 為基礎來建置應用程式,且希望在 vSphere 上部署 Windows 容器,請遵循以下程序來建置 Windows 自訂機器映像。它分為以下各節:

附註

Vmware 不支援在代理或氣隙環境中具有 Windows Worker 節點的 TKG 工作負載叢集。

Windows 映像的必要條件

若要建置自訂機器映像,您需要:

  • vSphere 6.7 Update 3 或更新版本。
  • Linux 工作站。

    附註

    由於 Kubernetes Image Builder 使用的開放原始碼 packer 公用程式有問題,您無法在 MacOS 機器上建置 Windows 機器映像。

  • Docker 桌面。若要安裝,請參閱 Docker 產品下載頁面。使用 apt 而不是 snap 從 CLI 安裝 Docker。
  • Tanzu CLI。若要安裝,請參閱《安裝 Tanzu CLI 和其他工具以用於獨立管理叢集》中的下載及解壓縮 Tanzu CLI 和 kubectl
  • TKG v2.2 獨立管理叢集。
  • 最新的 (比 2021 年 4 月還新) Windows Server 2019 ISO 映像。透過 Microsoft Developer Network (MSDN) 或大量授權 (VL) 帳戶來下載。既不支援也不建議使用評估媒體。
  • 最新的 VMware Tools Windows ISO 映像。從 VMware Tools 下載。
  • vCenter 上的資料存放區可以容納您的自訂 Windows 虛擬機器範本,該範本的起始大小可以大於 10 GB (精簡佈建)。

建置 Windows 映像

  1. 依照以下步驟,將 Ubuntu 或 Photon OVA 映像匯入至 vCenter,以作為自訂映像的範本:

    1. 移至 https://customerconnect.vmware.com,然後使用 VMware Customer Connect 認證登入。
    2. 移至 Tanzu Kubernetes Grid 下載頁面
    3. VMware Tanzu Kubernetes Grid 資料列中,按一下移至下載 (Go to Downloads)
    4. 選取版本 (Select Version) 下拉式功能表中,選取 2.2.0
    5. 產品下載 (Product Downloads) 下,捲動至標記為 Kubernetes OVAs for VMware Tanzu Kubernetes Grid 2.2.0 的區段,找出 Ubuntu 2004 Kubernetes v1.25.7 OVAPhoton v3 Kubernetes v1.25.7 OVA,然後按一下立即下載 (Download Now)
    6. 登入 vCenter。
    7. 在主機或叢集上按一下滑鼠右鍵,然後按一下部署 OVF 範本 (Deploy OVF Template)…,以匯入映像。
    8. 在匯入的映像上按一下滑鼠右鍵,將游標暫留在範本 (Template) 上,然後按一下轉換成範本 (Convert to Template)
    9. 若要確定範本是否已備妥可用,請選取主機或叢集,選取虛擬機器 (VMs) 索引標籤,然後選取虛擬機器範本 (VM Templates),以查看所列出的範本。
  2. 遵循以下步驟,將 Windows Server 2019 ISO 和 VMware Tools Windows ISO 映像匯入至資料存放區:

    1. 登入 vCenter。
    2. 導覽至您的資料存放區,然後按一下檔案 (Files) 索引標籤。
    3. 開啟 iso 資料夾,或者按一下新建資料夾 (New Folder),以建立一個 (如果不存在)。
    4. 將這兩個 ISO 檔案上傳至 iso 資料夾。
  3. 使用以下組態,來建立名為 builder.yaml 的 YAML 檔案:

    apiVersion: v1
    kind: Namespace
    metadata:
     name: imagebuilder
    ---
    apiVersion: v1
    kind: Service
    metadata:
     name: imagebuilder-wrs
     namespace: imagebuilder
    spec:
     selector:
       app: image-builder-resource-kit
     type: NodePort
     ports:
     - port: 3000
       targetPort: 3000
       nodePort: 30008
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: image-builder-resource-kit
     namespace: imagebuilder
    spec:
     selector:
       matchLabels:
         app: image-builder-resource-kit
     template:
       metadata:
         labels:
           app: image-builder-resource-kit
       spec:
         nodeSelector:
           kubernetes.io/os: linux
         containers:
         - name: windows-imagebuilder-resourcekit
           image: projects.registry.vmware.com/tkg/windows-resource-bundle:v1.25.7_vmware.2-tkg.1
           imagePullPolicy: Always
           ports:
             - containerPort: 3000
    
  4. 執行以下命令,將 Kubernetes CLI 連線至管理叢集:

    kubectl config use-context MY-MGMT-CLUSTER-admin@MY-MGMT-CLUSTER
    

    其中,MY-MGMT-CLUSTER 是管理叢集的名稱。

  5. 套用 builder.yaml 組態檔。

    kubectl apply -f ./builder.yaml
    

    這會部署一個容器,以便在映像建置程序期間,允許您的機器從 HTTP 位置擷取其需要的檔案。輸出類似於:

    namespace/imagebuilder created
    service/imagebuilder-wrs created
    deployment.apps/image-builder-resource-kit created
    
  6. 若要確定容器是否正在執行,請執行:

    kubectl get pods -n imagebuilder
    

    輸出類似於:

    NAME                                          READY   STATUS    RESTARTS   AGE
    image-builder-resource-kit-756ccdc4ff-rcxpq   1/1     Running   0          4m16s
    
  7. 擷取管理叢集的控制平面 IP 位址:

    1. 列出叢集的節點,且 wide 輸出如下:

      kubectl get nodes -o wide
      
    2. 從輸出中,記錄節點的 INTERNAL-IP 值,其中 ROLE 列出為 control-plane

  8. 在名為 windows.json 的空資料夾中建立 JSON 檔案,且其含有下列組態:

    {
      "additional_executables_destination_path": "C:\\ProgramData\\Temp",
      "additional_executables_list": "http://CONTROLPLANE-IP:30008/files/antrea-windows/antrea-windows-advanced.zip,http://CONTROLPLANE-IP:30008/files/kubernetes/kube-proxy.exe",
      "additional_executables": "true",
      "additional_prepull_images": "mcr.microsoft.com/windows/servercore:ltsc2019",
      "build_version": "windows-2019-kube-v1.25.7",
      "cloudbase_init_url": "http://CONTROLPLANE-IP:30008/files/cloudbase_init/CloudbaseInitSetup_1_1_4_x64.msi",
      "cluster": "VSPHERE-CLUSTER-NAME",
      "containerd_sha256_windows": "2e0332aa57ebcb6c839a8ec807780d662973a15754573630bea249760cdccf2a",
      "containerd_url": "http://CONTROLPLANE-IP:30008/files/containerd/cri-containerd-v1.6.18+vmware.1.windows-amd64.tar",
      "containerd_version": "v1.6.18",
      "convert_to_template": "true",
      "create_snapshot": "false",
      "datacenter": "DATACENTER-NAME",
      "datastore": "DATASTORE-NAME",
      "disable_hypervisor": "false",
      "disk_size": "40960",
      "goss_inspect_mode": "true",
      "insecure_connection": "true",
      "kubernetes_base_url": "http://CONTROLPLANE-IP:30008/files/kubernetes/",
      "kubernetes_semver": "v1.25.7+vmware.2",
      "kubernetes_series": "v1.25.7",
      "linked_clone": "false",
      "load_additional_components": "true",
      "netbios_host_name_compatibility": "false",
      "network": "NETWORK",
      "nssm_url": "http://CONTROLPLANE-IP:30008/files/nssm/nssm.exe",
      "os_iso_path": "OS-ISO-PATH",
      "password": "VCENTER-PASSWORD",
      "pause_image": "mcr.microsoft.com/oss/kubernetes/pause:3.6",
      "prepull": "false",
      "resource_pool": "",
      "runtime": "containerd",
      "template": "",
      "unattend_timezone": "WINDOWS-TIMEZONE",
      "username": "VCENTER-USERNAME",
      "vcenter_server": "VCENTER-IP",
      "vmtools_iso_path": "VMTOOLS-ISO-PATH",
      "windows_updates_categories": "CriticalUpdates SecurityUpdates UpdateRollups",
      "windows_updates_kbs": "",
      "wins_version": ""
    }
    

    其中:

    • WINDOWS-TIMEZONE 是您環境的 Windows 時區。例如,GMT Standard Time
    • VSPHERE-CLUSTER-NAME 是 vSphere 叢集的名稱。例如,VSAN-Cluster
    • VCENTER-PASSWORD 是您的 vCenter 密碼。
    • VCENTER-USERNAME 是您的 vCenter 使用者名稱。
    • DATASTORE-NAME 是資料存放區在 vCenter 中的顯示名稱。例如 vsanDatastore
    • DATACENTER-NAME 是資料中心在 vCenter 中的顯示名稱。例如 VSAN-DC
    • VMTOOLS-ISO-PATH 是 VMware Tools ISO 檔案的路徑,其結構如下:[DATASTORE-NAME] iso/VMware-tools-windows-11.2.5-17337674.iso
    • NETWORK 是網路或連接埠群組在 vCenter 功能表 (Menu) > 網路 (Networking) > 網路 (Networks) 中的顯示名稱。例如,VM Network
    • OS-ISO-PATH 是 Windows Server 2019 ISO 檔案的路徑,其結構如下:[DATASTORE-NAME] iso/en-us_windows_server_2019_updated_aug_2022_x64_dvd_a6431a28.iso
    • VCENTER-IP 是 vCenter Server 的 IP 位址或 FQDN。
    • CONTROLPLANE-IP 是您在上述中所擷取的管理叢集 IP 位址。
    • CONTAINERD-URLCONTAINERD-SHA 是您在上述中所擷取的 containerd.pathcontainerd.sha256 值。
  9. 在控制平面的 nodePort 端點上查詢 Windows 資源服務包,並驗證是否存在檔案路徑:

    curl http://CONTROLPLANE-IP:30008

  10. 遵循以下步驟,新增一個含有 Windows 設定的 XML 檔案:

    1. 移至 VMware {code} Sample Exchange 上的 autounattend.xml 檔案。
    2. 選取下載 (Download)
    3. 如果您使用的是 Windows Server 2019 評估版本,請移除 <ProductKey>...</ProductKey>
    4. 將檔案命名為 autounattend.xml
    5. 將相同資料夾中的檔案另存為 windows.json 檔案。
  11. 從含有 windows.jsonautounattend.xml 檔案的資料夾中,執行以下命令來建置自訂映像:

    docker run -it --rm --mount type=bind,source=$(pwd)/windows.json,target=/windows.json --mount type=bind,source=$(pwd)/autounattend.xml,target=/home/imagebuilder/packer/ova/windows/windows-2019/autounattend.xml -e PACKER_VAR_FILES="/windows.json" -e IB_OVFTOOL=1 -e IB_OVFTOOL_ARGS='--skipManifestCheck' -e PACKER_FLAGS='-force -on-error=ask' -t projects.registry.vmware.com/tkg/image-builder:v0.1.13_vmware.3 build-node-ova-vsphere-windows-2019
    

    如果您看到錯誤或建置當機,請參考您的工作站上的 Packer 記錄,以對 windows.json 組態檔中的問題進行疑難排解。此外,您還可以將 -e PACKER_LOG=1 新增到上面的命令列中,以便在主控台上接收更詳細的記錄。

  12. 若要確定 Windows 映像已備妥可用,請選取 vCenter 中的主機或叢集,選取虛擬機器 (VMs) 索引標籤,然後選取虛擬機器範本 (VM Templates),以查看所列出的 Windows 映像。

將 Windows 映像用於工作負載叢集

使用此程序時,您將為 Windows 工作負載叢集建立一個組態檔,在組態檔中參考 Windows 映像,然後使用 Tanzu CLI 來建立工作負載叢集。

  1. 複製管理叢集組態檔,並遵循具有獨立管理叢集組態檔的 vSphere 中的程序,使用新名稱來儲存該檔案。

  2. 在新的組態檔中,新增或修改以下內容:

    IS_WINDOWS_WORKLOAD_CLUSTER: "true"
    
  3. 依照建立工作負載叢集中所述,來部署工作負載叢集。

check-circle-line exclamation-circle-line close-line
Scroll to top icon