此过程将指导您构建 Linux 自定义计算机映像,以便在 AWS、Azure 或 vSphere 上创建基于计划的集群时使用。它分为以下部分。有关 Tanzu Kubernetes Grid 中的集群类型的详细信息,请参见工作负载集群类型。
要构建 Linux 自定义计算机映像,您需要:
aws
命令行界面 (CLI)az
CLI在 AWS 和 Azure 上,登录到基础架构 CLI。根据提示进行身份验证并指定您的区域:
aws configure
。az login
。在 Azure 上,创建一个配置 JSON 文件 azure-sig.json
并填写 Azure 特定信息。可以在此处找到此类文件的示例。
在 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": ""
}
确定要从中构建的 Image Builder 配置版本。
TKG Image Builder
以列出可用版本。TKG-Image-Builder-for-Kubernetes-v1.25.7-on-TKG-v2.2.0-master.zip
会为 Tanzu Kubernetes Grid v2.2 构建 Kubernetes v1.25.7 映象。以下步骤介绍了如何为 Tanzu Kubernetes Grid v2.2 构建 Kubernetes v1.25.7 映像。
下载配置代码 zip 文件,然后解压缩其内容。
cd
到 TKG-Image-Builder-
目录中,以便 tkg.json
文件位于当前目录中。
确保您的工作站可以访问 VMware 映像注册表 projects.registry.vmware.com
。
从 projects.registry.vmware.com
下载并运行所需的工件容器。
docker pull projects.registry.vmware.com/tkg/linux-resource-bundle:v1.25.7_vmware.1-tkg.1
docker run -d -p 3000:3000 projects.registry.vmware.com/tkg/linux-resource-bundle:v1.25.7_vmware.1-tkg.1
编辑 tkg.json
以填充 <IP>
和 <PORT>
,其中:
IP
对应于运行 Docker 容器的计算机的 IP。PORT
将 Docker 主机上的未使用端口与容器上的端口 3000 关联,例如 3001:3000
。容器通过端口 3000 公开工件。如果构建 Photon-3 OVA,请在tkg.json
中编辑 "extra_rpms"
,以反映支持的其他自定义软件包:
"extra_rpms": "sysstat nfs-utils ethtool apparmor-parser"
要构建支持 FIPS 的映像,请删除 tkg.json
中的以下行:
"ansible_user_vars": "install_fips=no"
Internet 受限:要为通过 HTTP 代理服务器访问 Internet 的 Internet 受限环境构建映像,请将以下内容添加到 tkg.json
文件中:
{
"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 的集群:要为 vSphere 的启用了 GPU 的集群构建映像,请创建一个名为 customizations.json
的文件并添加以下内容:
{
"vmx_version": "17"
}
将 customizations.json
与在上一步中编辑的 tkg.json
保存在同一目录中。
收集以下参数字符串以在下一步中插入命令。其中许多参数指定 docker run -v
参数,用于将当前工作目录复制到用于构建映像的容器的 /home/imagebuilder
目录中。
AUTHENTICATION
:复制本地 CLI 目录:
~/.aws:/home/imagebuilder/.aws
~/.azure:/home/imagebuilder/.azure
/PATH/TO/CREDENTIALS.json:/home/imagebuilder/vsphere.json
SOURCES
:复制存储库的 tkg.json
文件,其中列出了已版本化操作系统、Kubernetes、容器网络接口 (CNI). 映像的下载源:
/PATH/TO/tkg.json:/home/imagebuilder/tkg.json
ROLES
:复制存储库的 tkg
目录,其中包含 Image Builder 所需的 Ansible 角色。
/PATH/TO/tkg:/home/imagebuilder/tkg
tkg.json
文件以使用转义引号 (\"
) 重新格式化 custom_role_names
设置,以便使其成为包含多个角色的列表。例如: "custom_role_names": "\"/home/imagebuilder/tkg /home/imagebuilder/mycustomrole\"",
TESTS
:复制专为映像的目标基础架构、操作系统和 Kubernetes 版本设计的 goss
测试目录:
goss
目录中文件的文件名,例如 amazon-ubuntu-1.25.7+vmware.1-goss-spec.yaml
。CUSTOMIZATIONS
:复制 JSON 格式的自定义文件。请参见 Image Builder 文档中的自定义。在进行任何修改之前,请咨询 VMware 客户可靠性工程 (CRE) 以了解最佳做法和建议。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:
docker run -it --rm \
-v AUTHENTICATION \
-v SOURCES \
-v ROLES \
-v /PATH/TO/goss/TESTS.yaml:/home/imagebuilder/goss/goss.yaml \
-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.3 \
COMMAND
注意如果没有为 Azure 构建映像,请忽略
env-file
。此命令可能需要几分钟才能完成。
例如,使用 Ubuntu v20.04 和 Kubernetes v1.25.7 创建自定义映像以在 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.25.7+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.3 \
build-ami-ubuntu-2004
对于 vSphere,必须使用上面创建的自定义容器映像。您还必须设置一个版本字符串,以便与您在后续步骤中在自定义 TKr 中传递的内容相匹配。尽管 VMware 发布的 OVA 将具有 v1.25.7+vmware.1-tkg.1
等版本字符串,但建议将 -tkg.1
替换为对您的组织有意义的字符串。要设置此版本字符串,请在 metadata.json
文件中进行定义,如下所示:
{
"VERSION": "v1.25.7+vmware.1-myorg.0"
}
构建 OVA 时,.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.25.7+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.3 \
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.25.7+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.3 \
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
作为附加卷。要将 Linux 映像设置为未来 Kubernetes 版本的默认映像,请基于该映像创建 TKr。否则,请跳到下面的将 Linux 映像用于工作负载集群。
下图简要概述了如何在 vSphere 上为自定义 Linux 映像创建 TKr。
要创建 TKr,请执行以下操作:
在 ~/.config/tanzu/tkg/bom/
目录中,打开与自定义映像的 Kubernetes 版本对应的 TKr BoM。例如,Kubernetes v1.25.7 的文件名为类似于 tkr-bom-v1.25.7+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.25.7+vmware.1-myorg.0
。注意
version
必须与metadata.json
中的相同VERSION
完全匹配。
id
值格式,但在末尾使用唯一的十六进制字符串,例如 ami-693a5e2348b25e428
。如果 BoM 文件在区域下定义映像,则必须先在其区域中列出自定义映像定义块。在每个区域内,集群创建过程将选择列出的第一个合适的映像。
在 release.version
值中,通过添加后缀设置自定义版本。请勿通过添加前缀来自定义版本。例如,将 v1.25.7+vmware.1-tkg.1
更改为 v1.25.7+vmware.1-tkg.1-mycustomtkr
。
使用您在上一步中为 release.version
指定的相同自定义后缀保存 Bom 文件。
如果文件名包含加号 (+
) 字符,请将 +
替换为三重短划线 (---
)。
例如,将 BOM 文件另存为 tkr-bom-v1.25.7---vmware.1-tkg.1-mycustomtkr.yaml
。
base64
-将文件内容编码为二进制字符串,例如:
cat tkr-bom-v1.25.7---vmware.1-tkg.1-mycustomtkr.yaml | base64 -w 0
创建 ConfigMap YAML 文件(例如,名为 configmap-v1.25.7---vmware.1-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.25.7---vmware.1-tkg.1-mycustomtkr
。CUSTOM-TKR
是 TKr 的名称,它必须与您为 CUSTOM-TKG-BOM
指定的值相匹配。例如,v1.25.7---vmware.1-tkg.1-mycustomtkr
。BOM-BINARY-CONTENT
是您在上一步中生成的自定义 BoM 文件的 base64
编码内容。例如:
apiVersion: v1
kind: ConfigMap
metadata:
name: v1.25.7---vmware.1-tkg.1-mycustomtkr
labels:
tanzuKubernetesRelease: v1.25.7---vmware.1-tkg.1-mycustomtkr
binaryData:
bomContent: "YXBpVmVyc2lvbjogcnVuLnRhbnp1...."
保存 ConfigMap
文件,将 kubectl
上下文设置为 TKr 添加目标的管理集群,并将该文件应用于集群,例如:
kubectl -n tkr-system apply -f configmap-v1.25.7---vmware.1-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
及其设置(如果存在)。
按照创建工作负载集群中所述部署工作负载集群。