Windows 自定义计算机映像

本主题介绍如何创建 Windows 自定义计算机映像,Tanzu Kubernetes Grid (TKG) 可以使用该映像创建和管理在 Windows 工作节点上运行基于 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 开发人员网络 (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 OVA 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 Exchangeautounattend.xml 文件。
    2. 选择下载
    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
    

    如果看到错误或内部版本挂起,请参考 Workstation 上的 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