此过程将指导您构建 Linux 自定义计算机映像,以便在 AWS、Azure 或 vSphere 上创建集群时使用。它分为以下部分。有关 Tanzu Kubernetes Grid 中的集群类型的详细信息,请参见工作负载集群类型。
如过程中所述,根据您是为基于类的集群还是基于计划的(旧版)集群构建映像,某些步骤会有所不同。
要构建 Linux 自定义计算机映像,您需要:
aws 命令行界面 (CLI)az CLI构建映象用于 vSphere 上基于类的集群之前,您必须检索与要用于自定义映像的 Kubernetes 版本的默认 Ubuntu OVA 关联的操作系统映像版本。您需要将此操作系统映像版本分配给以下构建 Linux 映像步骤中的自定义映像。
要检索操作系统映像版本,请根据您的用例执行以下操作之一:
如果您有使用当前 Tanzu Kubernetes Grid 版本的默认 Kubernetes 版本创建的正在运行的管理集群,则可以从该集群中检索操作系统映像版本:
将 kubectl 上下文设置为管理集群:
从可用 TKr 列表中,选择要用于自定义映像的 Kubernetes 版本的 Tanzu Kubernetes 版本 (TKr)。例如,v1.26.5---vmware.2-tkg.1。要列出可用的 TKr,请运行:
kubectl get tkr
打开 TKr 并找到 osImages 属性。此属性指定与 TKr 关联的 OSImage 对象的名称。
找到并打开默认 Ubuntu OVA 的 OSImage 对象。OSImage 对象的名称与 TKr 中的 osImages 名称之一相匹配。
kubectl get osimages
在默认 Ubuntu OVA 的 OSImage 对象中,找到 version 下 spec.image.ref 属性的值并记录下来。例如,v1.26.5+vmware.1-tkg.1-765d418b72c247c2310384e640ee075e。
如果您没有使用当前 Tanzu Kubernetes Grid 版本的默认 Kubernetes 版本创建的正在运行的管理集群,则可以直接从默认 Ubuntu OVA 检索操作系统映像版本(本地或从 vSphere):
要在本地检索操作系统映像版本,请执行以下操作:
.ofv 文件。在 .ofv 文件中,搜索 OVA VERSION 属性并记录其值。例如,v1.26.5+vmware.1-tkg.1-765d418b72c247c2310384e640ee075e。属性看上去与下面类似:
<Property ovf:key="VERSION" ovf:type="string" ovf:userConfigurable="false" ovf:value="v1.26.5+vmware.1-tkg.1-765d418b72c247c2310384e640ee075e"/>
如果已为目标 Kubernetes 版本上载到 vSphere 的默认 Ubuntu OVA,也可以通过在 vSphere UI 中检查 OVA 虚拟机属性或使用 govc CLI 来检索操作系统映像版本。要使用此方法,请在将 OVA 虚拟机转换为模板之前检索操作系统映像版本。
要从 vSphere UI 检索操作系统映像版本,请执行以下操作:
v1.26.5+vmware.1-tkg.1-765d418b72c247c2310384e640ee075e。要使用 govc CLI 检索操作系统映像版本,请运行 govc vm.info 命令。例如:
govc vm.info -json /dc0/vm/ubuntu-2004-kube-v1.26.5+vmware.1-tkg.1 | jq
在输出中,搜索 "Id": "VERSION" 并记录 "DefaultValue" 属性的值。例如:
{
"Key": 10,
"ClassId": "",
"InstanceId": "",
"Id": "VERSION",
"Category": "Cluster API Provider (CAPI)",
"Label": "VERSION",
"Type": "string",
"TypeReference": "",
"UserConfigurable": false,
"DefaultValue": "v1.26.5+vmware.1-tkg.1-765d418b72c247c2310384e640ee075e",
"Value": "",
"Description": ""
}
为您的基础架构设置身份验证:
vSphere:创建一个凭据 JSON 文件并填写其值:
{
"cluster": "",
"convert_to_template": "false",
"create_snapshot": "true",
"datacenter": "",
"datastore": "",
"folder": "",
"insecure_connection": "false",
"linked_clone": "true",
"network": "",
"password": "",
"resource_pool": "",
"template": "",
"username": "",
"vcenter_server": ""
}
AWS:登录到 aws CLI。然后,根据提示进行身份验证并指定您的区域:
aws configure
Azure:登录到 az CLI。创建一个配置 JSON 文件 azure-sig.json 并填写 Azure 特定信息。可以在此处找到此类文件的示例。
从 projects.registry.vmware.com 下载 Linux 资源包容器:
确保您的工作站可以访问 VMware 映像注册表 projects.registry.vmware.com。
使用 Image Builder 构建 Linux OVA 所需的 Kubernetes Linux 二进制文件下载并运行容器:
docker pull projects.registry.vmware.com/tkg/linux-resource-bundle:v1.26.5_vmware.1-tkg.1
docker run -d -p 3000:3000 projects.registry.vmware.com/tkg/linux-resource-bundle:v1.26.5_vmware.1-tkg.1
下载 Image Builder 配置目录:
确定要从中构建的 Image Builder 配置版本。
TKG Image Builder 以列出可用版本。TKG-Image-Builder-for-Kubernetes-v1.26.5-on-TKG-v2.3.0-master.zip 为 Tanzu Kubernetes Grid v2.3.0. 构建 Kubernetes v1.26.5 映象。以下步骤介绍了如何为 Tanzu Kubernetes Grid v2.3.0 构建 Kubernetes v1.26.5 映像。
下载配置代码 zip 文件,然后解压缩其内容。
cd 到 TKG-Image-Builder- 目录中,以便 tkg.json 文件位于当前目录中。
vSphere 对于 vSphere,请在 Image Builder 目录中创建一个 metadata.json 文件,该文件会将版本字符串设置为与后面的步骤中自定义 TKr 中列出的内容相匹配:
基于类:使用您在上述步骤检索操作系统映像版本检索的值,例如:
{
"VERSION": "v1.26.5+vmware.1-tkg.1-765d418b72c247c2310384e640ee075e"
}
基于计划:Image-builder 会为 OVA 提供它创建的与 VMware 发布的 OVA 相同的版本字符串,如 v1.26.5+vmware.1-tkg.1。对于自定义映像,VMware 建议将 -tkg.1 替换为对您的组织有意义的字符串,例如:
{
"VERSION": "v1.26.5+vmware.1-myorg.0"
}
编辑 tkg.json 文件以填写 containerd_url和kubernetes_http_source 的 <IP> 和 <PORT> 设置和定义,其中:
IP 对应于运行 Docker 容器的计算机的 IP。PORT 将 Docker 主机上的未使用端口与容器上的端口 3000 关联,例如 3001:3000。容器通过端口 3000 公开工件。要包含以下选项,请继续编辑 tkg.json 文件:
Photon:如果构建 Photon-3 OVA,请在tkg.json 中编辑 "extra_rpms",以反映支持的其他自定义软件包:
"extra_rpms": "sysstat nfs-utils ethtool apparmor-parser"
STIG 和 CIS 强化:要在默认级别上强化自定义 Ubuntu 映像,请执行以下操作:
添加一行,将以下部分或全部变量 ansible_user_vars 设置为 true。以下变量默认为 false:
STIG:
install_aide - 激活 AIDE(高级入侵检测环境)install_sshd_login_banner - 安装 DoD 登录横幅remove_existing_ca_certs - 保留 DoD PKI 基础架构install_audispd_plugins - 安装事件多路复用器 (audispd) 插件CIS:
install_aide - 激活 AIDE(高级入侵检测环境)install_clamav - 激活 ClamAV AntiVirusinstall_systemd_timesyncd - 使用 timesyncd 而不是 chronyinstall_protect_kernel_defaults - 设置上游内核保护默认值通过为 STIG 添加 /home/imagebuilder/stig_ubuntu_2004 或为 CIS 添加 /home/imagebuilder/cis_ubuntu_2004 来修改 custom_role_names 设置。
例如,对于其他 CIS 强化:
"ansible_user_vars": "install_aide=true install_clamav=true install_systemd_timesyncd=true install_protect_kernel_defaults=true",
"custom_role_names": "/home/imagebuilder/tkg /home/imagebuilder/cis_ubuntu_2004",
注意不支持通过
ansible_user_vars进行其他强化的自定义 Photon 映像。
FIPS:要构建支持 FIPS 的映像,请删除以下设置,如存在:
"ansible_user_vars": "install_fips=no"
Internet 受限:要为通过 HTTP 代理服务器访问 Internet 的 Internet 受限环境构建映像,请添加以下内容:
"http_proxy": "http://proxy.acme.com:80",
"https_proxy": "http://proxy.acme.com:80",
"no_proxy": "localhost, 127.0.0.1, acme.com, 10.0.0.0/8"
启用了 GPU 的集群:要为启用了 GPU 的集群构建映像,请添加以下内容:
"vmx_version": "17"
您可以向 tkg.json 添加其他自定义或将它们放在单独的,customizations.json 文件中。
收集以下参数字符串以在下一步中插入 docker 命令。其中许多参数指定 docker run -v 参数,用于将当前工作目录复制到用于构建映像的容器的 /home/imagebuilder 目录中。
AUTHENTICATION:复制本地 CLI 目录。适用情况:
/PATH/TO/CREDENTIALS.json:/home/imagebuilder/vsphere.json~/.aws:/home/imagebuilder/.aws~/.azure:/home/imagebuilder/.azureSOURCES:复制存储库的 tkg.json 文件,其中列出了已版本化操作系统、Kubernetes、容器网络接口 (CNI) 映像的下载源:
/PATH/TO/tkg.json:/home/imagebuilder/tkg.jsonROLES:存储库的 tkg 目录,其中包含 Image Builder 所需的 Ansible 角色。
TESTS:复制专为映像的目标基础架构、操作系统和 Kubernetes 版本设计的 goss 测试目录:
goss 目录中文件的文件名。amazon-ubuntu-1.26.5+vmware.1-goss-spec.yamlCUSTOMIZATIONS:复制 JSON 格式的自定义文件。
PACKER_VAR_FILES:上面的 JSON 文件的空格分隔列表,其中包含适用于 Packer 的变量。AZURE-CREDS:Azure 凭据文件的路径,如 Image Builder 文档中所述。COMMAND:根据自定义映像操作系统,使用如下命令之一。对于 vSphere 和 Azure 映像,命令以 build-node-ova- 和 build-azure-sig- 开头:
build-ami-ubuntu-2004:Ubuntu v20.04build-ami-ubuntu-1804:Ubuntu v18.04build-ami-amazon-2:Amazon Linux 2build-node-ova-vsphere-ubuntu-2004:启用了 GPU 的集群使用上述字符串,在从 VMware 注册表 projects.registry.vmware.com 中提取的 Docker 容器中运行 Image Builder
如果您不是为 vSphere 和env-file 构建映象,如果您不是为 Azure 构建映像,请忽略 metadata.json:
export ROLES="... the value for roles you created above"
export SOURCES="... ..."
docker run -it --rm \
-v $AUTHENTICATION \
-v $SOURCES \
-v $ROLES \
-v /PATH/TO/goss/TESTS.yaml:/home/imagebuilder/goss/goss.yaml \
-v /PATH/TO/metadata.json:/home/imagebuilder/metadata.json \
-v /PATH/TO/CUSTOMIZATIONS.json:/home/imagebuilder/CUSTOMIZATIONS.json \
--env PACKER_VAR_FILES="tkg.json CUSTOMIZATIONS.json" \
--env-file AZURE-CREDS \
--env IB_OVFTOOL=1 \
projects.registry.vmware.com/tkg/image-builder:v0.1.13_vmware.2 \
COMMAND
注意此命令可能需要几分钟才能完成。
示例
vSphere:.ova 文件将保存到工作站的本地文件系统中。无论您希望将这些 OVA 保存在哪个文件夹中,都应挂载到容器内的 /home/imagebuilder/output 中。然后,使用容器映像创建 OVA:
docker run -it --rm \
-v /PATH/TO/CREDENTIALS.json:/home/imagebuilder/vsphere.json \
-v $(pwd)/tkg.json:/home/imagebuilder/tkg.json \
-v $(pwd)/tkg:/home/imagebuilder/tkg \
-v $(pwd)/goss/vsphere-ubuntu-1.26.5+vmware.1-goss-spec.yaml:/home/imagebuilder/goss/goss.yaml \
-v $(pwd)/metadata.json:/home/imagebuilder/metadata.json \
-v /PATH/TO/OVA/DIR:/home/imagebuilder/output \
--env PACKER_VAR_FILES="tkg.json vsphere.json" \
--env OVF_CUSTOM_PROPERTIES=/home/imagebuilder/metadata.json \
--env IB_OVFTOOL=1 \
projects.registry.vmware.com/tkg/image-builder:v0.1.13_vmware.2 \
build-node-ova-vsphere-ubuntu-2004
启用了 GPU 的集群:在运行命令创建 OVA 时,包括在上述步骤中创建的 customizations.json 文件。
docker run -it --rm \
-v /PATH/TO/CREDENTIALS.json:/home/imagebuilder/vsphere.json \
-v $(pwd)/tkg.json:/home/imagebuilder/tkg.json \
-v $(pwd)/tkg:/home/imagebuilder/tkg \
-v $(pwd)/goss/vsphere-ubuntu-1.26.5+vmware.1-goss-spec.yaml:/home/imagebuilder/goss/goss.yaml \
-v $(pwd)/metadata.json:/home/imagebuilder/metadata.json \
-v $(pwd)/customizations.json:/home/imagebuilder/customizations.json \
-v /PATH/TO/OVA/DIR:/home/imagebuilder/output \
--env PACKER_VAR_FILES="tkg.json vsphere.json customizations.json" \
--env OVF_CUSTOM_PROPERTIES=/home/imagebuilder/metadata.json \
--env IB_OVFTOOL=1 \
projects.registry.vmware.com/tkg/image-builder:v0.1.13_vmware.2 \
build-node-ova-vsphere-ubuntu-2004
RHEL:要构建 RHEL OVA,您需要使用 Linux 计算机,而不是 macOS,因为 macOS 上的 Docker 不支持 --network host 选项。
您还必须将操作系统注册为获得 Red Hat 许可,并通过将以下内容添加到上面的 docker run 命令来注册更新:
-v $(pwd)/isos/rhel-8.4-x86_64-dvd.iso:/rhel-8.4-x86_64-dvd.iso \
--network host \
--env RHSM_USER=USER --env RHSM_PASS=PASS
其中:
RHSM_USER 和 RHSM_PASS 是 Red Hat Subscription Manager 帐户的用户名和密码。$(pwd)/isos/rhel-8.4-x86-64-dvd.iso 作为附加卷。AWS:使用 Ubuntu v20.04 和 Kubernetes v1.26.5 创建自定义映像以在 AWS 上运行,请从包含 tkg.json 的目录运行:
docker run -it --rm \
-v ~/.aws:/home/imagebuilder/.aws \
-v $(pwd)/tkg.json:/home/imagebuilder/tkg.json \
-v $(pwd)/tkg:/home/imagebuilder/tkg \
-v $(pwd)/goss/amazon-ubuntu-1.26.5+vmware.1-goss-spec.yaml:/home/imagebuilder/goss/goss.yaml \
-v /PATH/TO/CUSTOMIZATIONS.json /home/imagebuilder/aws.json \
--env PACKER_VAR_FILES="tkg.json aws.json" \
--env IB_OVFTOOL=1 \
projects.registry.vmware.com/tkg/image-builder:v0.1.13_vmware.2 \
build-ami-ubuntu-2004
将映像上载到云提供程序。
要将 Linux 映像设置为未来 Kubernetes 版本的默认映像,请基于该映像创建 TKr。否则,请跳到下面的将 Linux 映像用于工作负载集群。
下图简要概述了如何在 vSphere 上为自定义 Linux 映像创建 TKr。

要创建 TKr,请执行以下操作:
在 ~/.config/tanzu/tkg/bom/ 目录中,打开与自定义映像的 Kubernetes 版本对应的 TKr BoM。例如,对于 Kubernetes v1.26.5,使用如 tkr-bom-v1.26.5+vmware.1-tkg.1.yaml 的文件名。
如果目录缺少所需的 TKr BoM 文件,您可以通过部署具有所需 Kubernetes 版本的集群来将其引入,如部署具有非默认 Kubernetes 版本的集群中所述。
在 Bom 文件中,找到基础架构的映像定义块:ova 对应于 vSphere、ami 对应于 AWS,azure 对应于 Azure。每个映像定义块都包含 osinfo.name、osinfo.version 和 osinfo.arch,其中:
要添加新操作系统映像的引用,请在 ova、ami 或 azure 下添加映像定义块,具体取决于您的目标基础架构。如上所述,映像定义块必须包含 osinfo.name、osinfo.version 和 osinfo.arch。此外,在以下项上添加映像定义块时:
vSphere:
name:包含操作系统版本的唯一 OVA 名称,例如 my-ova-ubuntu-2004。version: 在创建 OVA 时使用 metadata.json 中分配的唯一 VERSION,例如 v1.26.5+vmware.1-myorg.0。注意
version必须与metadata.json中的相同VERSION完全匹配。
id 值格式,但在末尾使用唯一的十六进制字符串,例如 ami-693a5e2348b25e428。如果 BoM 文件在区域下定义映像,则必须先在其区域中列出自定义映像定义块。在每个区域内,集群创建过程将选择列出的第一个合适的映像。
在 release.version 值中,通过添加后缀设置自定义版本。请勿通过添加前缀来自定义版本。例如,将 v1.26.5+vmware.1-tkg.1 更改为 v1.26.5+vmware.1-tkg.1-mycustomtkr。
使用您在上一步中为 release.version 指定的相同自定义后缀保存 Bom 文件。
如果文件名包含加号 (+) 字符,请将 + 替换为三重短划线 (---)。
例如,将 BOM 文件另存为 tkr-bom-v1.26.5---vmware.2-tkg.1-mycustomtkr.yaml。
base64-将文件内容编码为二进制字符串,例如:
cat tkr-bom-v1.26.5---vmware.2-tkg.1-mycustomtkr.yaml | base64 -w 0
创建 ConfigMap YAML 文件(例如,名为 configmap-v1.26.5---vmware.2-tkg.1-mycustomtkr.yaml),其中的值如下所示:
apiVersion: v1
kind: ConfigMap
metadata:
name: CUSTOM-TKG-BOM
labels:
tanzuKubernetesRelease: CUSTOM-TKR
binaryData:
bomContent: "BOM-BINARY-CONTENT"
其中:
CUSTOM-TKG-BOM 是 ConfigMap 的名称,它必须包含在 BOM 文件中指定的 TKr release.version 值,并将任何 + 符号替换为三重短划线 (—)。例如,设置 v1.26.5---vmware.2-tkg.1-mycustomtkr。CUSTOM-TKR 是 TKr 的名称,它必须与您为 CUSTOM-TKG-BOM 指定的值相匹配。例如,v1.26.5---vmware.2-tkg.1-mycustomtkr。BOM-BINARY-CONTENT 是您在上一步中生成的自定义 BoM 文件的 base64 编码内容。例如:
apiVersion: v1
kind: ConfigMap
metadata:
name: v1.26.5---vmware.2-tkg.1-mycustomtkr
labels:
tanzuKubernetesRelease: v1.26.5---vmware.2-tkg.1-mycustomtkr
binaryData:
bomContent: "YXBpVmVyc2lvbjogcnVuLnRhbnp1...."
保存 ConfigMap 文件,将 kubectl 上下文设置为 TKr 添加目标的管理集群,并将该文件应用于集群,例如:
kubectl -n tkr-system apply -f configmap-v1.26.5---vmware.2-tkg.1-mycustomtkr.yaml
TKr 控制器通过创建 TanzuKubernetesRelease 来协调新的 ConfigMap 对象。默认协调周期为 600 秒。您可以通过删除 TKr 控制器 pod 来避免此延迟,这会立即还原和协调 pod:
列出 tkr-system 命名空间中的 Pod:
kubectl get pod -n tkr-system
检索 TKr 控制器 pod 的名称,该名称类似于 tkr-controller-manager-f7bbb4bd4-d5lfd
删除 Pod:
kubectl delete pod -n tkr-system TKG-CONTROLLER
其中,TKG-CONTROLLER 是 TKr 控制器 Pod 的名称。
要检查是否添加了自定义 TKr,请运行tanzu kubernetes-release get 或 kubectl get tkr,然后查找在输出中设置的 CUSTOM-TKR 值。
自定义 TKr 由 kubectl 和 tanzu CLI 列出后,您可以用其创建管理集群或工作负载集群,如下所述。
要创建将自定义映像用作其节点的基础操作系统的管理集群,请执行以下操作:
有关详细信息,请参见如何生成基础操作系统映像选择。
从 Linux 映像创建工作负载集群的过程有所不同,具体取决于您是否在上面的为 Linux 映像创建 Tkr 中创建了 TKr。
如果创建了 TKr,请将 tanzu kubernetes-release get 列出的 TKr 名称传递到 tanzu cluster create 的 --tkr 选项。
如果未创建 TKr,请执行以下操作:
复制管理集群配置文件,并按照配置文件和对象规范中的过程使用新名称保存该文件。
在新配置文件中,添加或修改以下内容:
VSPHERE_TEMPLATE: LINUX-IMAGE
其中,LINUX-IMAGE 是您在构建 Linux 映像中创建的 Linux 映像的名称。
移除 CLUSTER_NAME 及其设置(如果存在)。
按照创建工作负载集群中所述部署工作负载集群。