此过程将指导您构建 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.8---vmware.2-tkg.1
。要列出可用的 TKr,请运行:
kubectl get tkr
打开 TKr 并记录 osImages
属性。此属性指定与 TKr 关联的 OSImage
对象的名称。
列出 Kubernetes 中的 OSImage
对象:
kubectl get osimages
在输出中,找到与默认 Ubuntu OVA 的 TKr osImages
名称匹配的 OSImage
对象列表。
记录 OSImage
列表的 NAME
属性,并将其嵌入的 ---
替换为 +
字符。例如,v1.26.8+vmware.1-tkg.1-0edd4dafbefbdb503f64d5472e500cf8
。
如果您没有使用当前 Tanzu Kubernetes Grid 版本的默认 Kubernetes 版本创建的正在运行的管理集群,则可以直接从默认 Ubuntu OVA 检索操作系统映像版本(本地或从 vSphere):
要在本地检索操作系统映像版本,请执行以下操作:
.ofv
文件。在 .ofv
文件中,搜索 OVA VERSION
属性并记录其值。例如,v1.26.8+vmware.1-tkg.1-0edd4dafbefbdb503f64d5472e500cf8
。属性看上去与下面类似:
<Property ovf:key="VERSION" ovf:type="string" ovf:userConfigurable="false" ovf:value="v1.26.8+vmware.1-tkg.1-0edd4dafbefbdb503f64d5472e500cf8"/>
如果已为目标 Kubernetes 版本上载到 vSphere 的默认 Ubuntu OVA,也可以通过在 vSphere UI 中检查 OVA 虚拟机属性或使用 govc
CLI 来检索操作系统映像版本。要使用此方法,请在将 OVA 虚拟机转换为模板之前检索操作系统映像版本。
要从 vSphere UI 检索操作系统映像版本,请执行以下操作:
v1.26.8+vmware.1-tkg.1-0edd4dafbefbdb503f64d5472e500cf8
。要使用 govc
CLI 检索操作系统映像版本,请运行 govc vm.info
命令。例如:
govc vm.info -json /dc0/vm/ubuntu-2004-kube-v1.26.8+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.8+vmware.1-tkg.1-0edd4dafbefbdb503f64d5472e500cf8",
"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.8_vmware.1-tkg.1
docker run -d -p 3000:3000 projects.registry.vmware.com/tkg/linux-resource-bundle:v1.26.8_vmware.1-tkg.1
下载 Image Builder 配置目录:
确定要从中构建的 Image Builder 配置版本。
TKG Image Builder
以列出可用版本。TKG-Image-Builder-for-Kubernetes-v1_26_8---vmware_1-tkg_v2_3_1.zip
为 Tanzu Kubernetes Grid v2.3.1 构建了 Kubernetes v1.26.8 映像。以下步骤介绍了如何为 Tanzu Kubernetes Grid v2.3.1 构建 Kubernetes v1.26.8 映像。
下载配置代码 zip 文件,然后解压缩其内容。
cd
到 TKG-Image-Builder-
目录中,以便 tkg.json
文件位于当前目录中。
vSphere 对于 vSphere,请在 Image Builder 目录中创建一个 metadata.json
文件,该文件会将版本字符串设置为与后面的步骤中自定义 TKr 中列出的内容相匹配:
基于类:使用您在上述步骤检索操作系统映像版本检索的值,例如:
{
"VERSION": "v1.26.8+vmware.1-tkg.1-0edd4dafbefbdb503f64d5472e500cf8"
}
基于计划:Image-builder 会为 OVA 提供它创建的与 VMware 发布的 OVA 相同的版本字符串,如 v1.26.8+vmware.1-tkg.1
。对于自定义映像,VMware 建议将 -tkg.1
替换为对您的组织有意义的字符串,例如:
{
"VERSION": "v1.26.8+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/.azure
SOURCES
:复制存储库的 tkg.json
文件,其中列出了已版本化操作系统、Kubernetes、容器网络接口 (CNI) 映像的下载源:
/PATH/TO/tkg.json:/home/imagebuilder/tkg.json
ROLES
:存储库的 tkg
目录,其中包含 Image Builder 所需的 Ansible 角色。
TESTS
:复制专为映像的目标基础架构、操作系统和 Kubernetes 版本设计的 goss
测试目录:
goss
目录中文件的文件名。amazon-ubuntu-1.26.8+vmware.1-goss-spec.yaml
CUSTOMIZATIONS
:复制 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.8+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.8+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.8 创建自定义映像以在 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.8+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.8 的文件名类似 tkr-bom-v1.26.8+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.8+vmware.1-myorg.0
。注意
version
必须与metadata.json
中的相同VERSION
完全匹配。
id
值格式,但在末尾使用唯一的十六进制字符串,例如 ami-693a5e2348b25e428
。如果 BoM 文件在地理区域下定义映像,则必须先在其地理区域中列出自定义映像定义块。在每个地理区域内,集群创建过程将选择列出的第一个合适的映像。
在 release.version
值中,通过添加后缀设置自定义版本。请勿通过添加前缀来自定义版本。例如,将 v1.26.8+vmware.1-tkg.1
更改为 v1.26.8+vmware.1-tkg.1-mycustomtkr
。
使用您在上一步中为 release.version
指定的相同自定义后缀保存 Bom 文件。
如果文件名包含加号 (+
) 字符,请将 +
替换为三重短划线 (---
)。
例如,将 BOM 文件另存为 tkr-bom-v1.26.8---vmware.2-tkg.1-mycustomtkr.yaml
。
base64
-将文件内容编码为二进制字符串,例如:
cat tkr-bom-v1.26.8---vmware.2-tkg.1-mycustomtkr.yaml | base64 -w 0
创建 ConfigMap YAML 文件(例如,名为 configmap-v1.26.8---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.8---vmware.2-tkg.1-mycustomtkr
。CUSTOM-TKR
是 TKr 的名称,它必须与您为 CUSTOM-TKG-BOM
指定的值相匹配。例如,v1.26.8---vmware.2-tkg.1-mycustomtkr
。BOM-BINARY-CONTENT
是您在上一步中生成的自定义 BoM 文件的 base64
编码内容。例如:
apiVersion: v1
kind: ConfigMap
metadata:
name: v1.26.8---vmware.2-tkg.1-mycustomtkr
labels:
tanzuKubernetesRelease: v1.26.8---vmware.2-tkg.1-mycustomtkr
binaryData:
bomContent: "YXBpVmVyc2lvbjogcnVuLnRhbnp1...."
保存 ConfigMap
文件,将 kubectl
上下文设置为 TKr 添加目标的管理集群,并将该文件应用于集群,例如:
kubectl -n tkr-system apply -f configmap-v1.26.8---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
及其设置(如果存在)。
按照创建工作负载集群中所述部署工作负载集群。