如果要基于旧版 Windows 组件(如 .NET Framework)构建应用程序,并希望在 vSphere 上部署 Windows 容器,请按照以下过程构建 Windows 自定义计算机映像。它分为以下部分:
注意Tanzu Kubernetes Grid v1.6 上运行的 Windows 工作负载集群无法升级到 v2.1。有关解决办法,请参见 TKG v2.1 发行说明。
要构建自定义计算机映像,您需要:
apt
而不是 snap
从 CLI 安装 Docker。kubectl
。按照以下步骤将 Ubuntu 或 Photon OVA 映像导入 vCenter 以用作自定义映像的模板:
按照以下步骤将 Windows Server 2019 ISO 和 VMware Tools Windows ISO 映像导入数据存储:
iso
文件夹,或者单击新建文件夹 (New Folder)创建一个文件夹(如果不存在)。iso
文件夹。使用以下配置创建名为 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.24.10_vmware.1-tkg.2
imagePullPolicy: Always
ports:
- containerPort: 3000
通过运行以下命令将 Kubernetes CLI 连接到管理集群:
kubectl config use-context MY-MGMT-CLUSTER-admin@MY-MGMT-CLUSTER
其中,MY-MGMT-CLUSTER
是管理集群的名称。
应用 builder.yaml
配置文件。
kubectl apply -f ./builder.yaml
这将部署一个容器,允许您的计算机在映像生成过程中从 HTTP 位置检索所需的文件。输出类似于:
namespace/imagebuilder created
service/imagebuilder-wrs created
deployment.apps/image-builder-resource-kit created
要确保容器正常运行,请运行:
kubectl get pods -n imagebuilder
输出类似于:
NAME READY STATUS RESTARTS AGE
image-builder-resource-kit-756ccdc4ff-rcxpq 1/1 Running 0 4m16s
检索管理集群的控制平面 IP 地址:
列出集群的节点,wide
输出为:
kubectl get nodes -o wide
从输出中,记录节点的 INTERNAL-IP
值,并且 ROLE
列为 control-plane
。
使用以下配置在名为 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.24.10",
"cloudbase_init_url": "http://CONTROLPLANE-IP:30008/files/cloudbase_init/CloudbaseInitSetup_1_1_4_x64.msi",
"cluster": "VSPHERE-CLUSTER-NAME",
"containerd_sha256_windows": "d29f5276584e869a5933db668fd6f17b7417c48ac04dd1c2a2c7f412f948f89c",
"containerd_url": "http://CONTROLPLANE-IP:30008/files/containerd/cri-containerd-v1.6.6+vmware.3.windows-amd64.tar",
"containerd_version": "v1.6.6",
"convert_to_template": "true",
"create_snapshot": "false",
"datacenter": "DATACENTER-NAME",
"datastore": "DATASTORE-NAME",
"disable_hypervisor": "false",
"disk_size": "40960",
"goss_inspect_mode": "true",
"goss_url": "http://CONTROLPLANE-IP:30008/files/goss/goss-alpha-windows-amd64.exe",
"insecure_connection": "true",
"kubernetes_base_url": "http://CONTROLPLANE-IP:30008/files/kubernetes/",
"kubernetes_semver": "v1.24.10+vmware.1",
"kubernetes_series": "v1.24.10",
"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_url": "http://CONTROLPLANE-IP:30008/files/wins/wins.exe",
"wins_version": "v0.4.11"
}
其中:
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-URL
和 CONTAINERD-SHA
是上面检索到的 containerd.path
和 containerd.sha256
值。在控制平面的 nodePort
端点上查询 Windows 资源包,并验证是否存在文件路径:
curl http://CONTROLPLANE-IP:30008
按照以下步骤添加包含 Windows 设置的 XML 文件:
autounattend.xml
文件。<ProductKey>...</ProductKey>
。autounattend.xml
。windows.json
文件。从包含 windows.json
和 autounattend.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.2 build-node-ova-vsphere-windows-2019
如果看到错误或内部版本挂起,请参考 Workstation 上的 Packer 日志,以对 windows.json
配置文件中的问题进行故障排除。此外,您还可以将 -e PACKER_LOG=1
添加到上面的命令行,以便在控制台上接收更详细的日志记录。
要确保 Windows 映像已准备好使用,请选择 vCenter 中的主机或集群,选择虚拟机 (VMs)选项卡,然后选择虚拟机模板 (VM Templates)以查看列出的 Windows 映像。
通过此过程,您可以为 Windows 工作负载集群创建一个配置文件,在配置文件中引用 Windows 映像,然后使用 Tanzu CLI 创建工作负载集群。
复制管理集群配置文件,并按照具有独立管理集群配置文件的 vSphere 中的过程使用新名称保存该文件。
在新配置文件中,添加或修改以下内容:
IS_WINDOWS_WORKLOAD_CLUSTER: "true"
按照创建工作负载集群中所述部署工作负载集群。