本主題說明如何建立 Windows 自訂機器映像,Tanzu Kubernetes Grid (TKG) 可以使用該映像建立和管理在 Windows worker 節點上執行基於 Windows 的工作負載之工作負載叢集。
如果您是以舊版 Windows 元件 (如 .NET Framework) 為基礎來建置應用程式,且希望在 vSphere 上部署 Windows 容器,請遵循以下程序來建置 Windows 自訂機器映像。它分為以下各節:
附註Vmware 不支援在代理或氣隙環境中具有 Windows Worker 節點的 TKG 工作負載叢集。
若要建置自訂機器映像,您需要:
Linux 工作站。
附註由於 Kubernetes Image Builder 使用的開放原始碼
packer
公用程式有問題,您無法在 MacOS 機器上建置 Windows 機器映像。
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.25.7_vmware.2-tkg.1
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.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-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.3 build-node-ova-vsphere-windows-2019
如果您看到錯誤或建置當機,請參考您的工作站上的 Packer 記錄,以對 windows.json
組態檔中的問題進行疑難排解。此外,您還可以將 -e PACKER_LOG=1
新增到上面的命令列中,以便在主控台上接收更詳細的記錄。
若要確定 Windows 映像已備妥可用,請選取 vCenter 中的主機或叢集,選取虛擬機器 (VMs) 索引標籤,然後選取虛擬機器範本 (VM Templates),以查看所列出的 Windows 映像。
使用此程序時,您將為 Windows 工作負載叢集建立一個組態檔,在組態檔中參考 Windows 映像,然後使用 Tanzu CLI 來建立工作負載叢集。
複製管理叢集組態檔,並遵循具有獨立管理叢集組態檔的 vSphere 中的程序,使用新名稱來儲存該檔案。
在新的組態檔中,新增或修改以下內容:
IS_WINDOWS_WORKLOAD_CLUSTER: "true"
依照建立工作負載叢集中所述,來部署工作負載叢集。