Linux 自定义计算机映像(旧版)

此过程将指导您构建 Linux 自定义计算机映像,以便在 AWS、Azure 或 vSphere 上创建基于计划的集群时使用。它分为以下部分。有关 Tanzu Kubernetes Grid 中的集群类型的详细信息,请参见工作负载集群类型

Linux 映像必备条件

要构建 Linux 自定义计算机映像,您需要:

  • 目标基础架构、AWS、Azure 或 vSphere 上的帐户。
  • 安装了以下内容的 macOS 或 Linux 工作站:
    • Docker 桌面
    • 对于 AWS:aws 命令行界面 (CLI)
    • 对于 Azure:az CLI
    • 对于 vSphere:要构建 RHEL 8 映像,您需要 Linux 工作站,而不是 macOS。

构建 Linux 映像

  1. 在 AWS 和 Azure 上,登录到基础架构 CLI。根据提示进行身份验证并指定您的区域:

    • AWS:运行 aws configure
    • Azure:运行 az login
  2. 在 Azure 上,创建一个配置 JSON 文件 azure-sig.json 并填写 Azure 特定信息。可以在此处找到此类文件的示例。

  3. 在 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": ""
    }
    
  4. 确定要从中构建的 Image Builder 配置版本。

    • 在 VMware {code} Sample Exchange 中搜索 TKG Image Builder 以列出可用版本。
    • 每个 Image Builder 版本都与其兼容的 Kubernetes 和 Tanzu Kubernetes Grid 版本相对应。例如,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 时必须执行此操作),请选择 Tanzu Kubernetes Grid 版本的默认 Kubernetes 版本。例如,在 Tanzu Kubernetes Grid v2.2 中,默认 Kubernetes 版本为 v1.25.7。对于工作负载集群,除了 v1.25.7 之外,还可以构建 Kubernetes v1.24.11 或 v1.23.17 映像。

    以下步骤介绍了如何为 Tanzu Kubernetes Grid v2.2 构建 Kubernetes v1.25.7 映像。

  5. 下载配置代码 zip 文件,然后解压缩其内容。

  6. cdTKG-Image-Builder- 目录中,以便 tkg.json 文件位于当前目录中。

  7. 确保您的工作站可以访问 VMware 映像注册表 projects.registry.vmware.com

  8. 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
    
  9. 编辑 tkg.json 以填充 <IP><PORT>,其中:

    • IP 对应于运行 Docker 容器的计算机的 IP。
    • PORT 将 Docker 主机上的未使用端口与容器上的端口 3000 关联,例如 3001:3000。容器通过端口 3000 公开工件。
  10. 如果构建 Photon-3 OVA,请在tkg.json 中编辑 "extra_rpms",以反映支持的其他自定义软件包:

    "extra_rpms": "sysstat nfs-utils ethtool apparmor-parser"
    
  11. 要构建支持 FIPS 的映像,请删除 tkg.json 中的以下行:

    "ansible_user_vars": "install_fips=no"
    
  12. 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"
    }
    
  13. 启用了 GPU 的集群:要为 vSphere 的启用了 GPU 的集群构建映像,请创建一个名为 customizations.json 的文件并添加以下内容:

    {
    "vmx_version": "17"
    }
    
  14. customizations.json 与在上一步中编辑的 tkg.json 保存在同一目录中。

  15. 收集以下参数字符串以在下一步中插入命令。其中许多参数指定 docker run -v 参数,用于将当前工作目录复制到用于构建映像的容器的 /home/imagebuilder 目录中。

    • AUTHENTICATION:复制本地 CLI 目录:
      • AWS:使用 ~/.aws:/home/imagebuilder/.aws
      • Azure:使用 ~/.azure:/home/imagebuilder/.azure
      • vSphere:/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
      • 要添加自定义 Ansible 角色,请编辑 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) AZURE-CREDS:Azure 凭据文件的路径,如 Image Builder 文档中所述。
    • COMMAND:根据自定义映像操作系统,使用如下命令之一。对于 vSphere 和 Azure 映像,命令以 build-node-ova-build-azure-sig- 开头:
      • build-ami-ubuntu-2004:Ubuntu v20.04
      • build-ami-ubuntu-1804:Ubuntu v18.04
      • build-ami-amazon-2:Amazon Linux 2
      • build-node-ova-vsphere-ubuntu-2004:启用了 GPU 的集群
  16. 使用上述字符串,在从 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_USERRHSM_PASS 是 Red Hat Subscription Manager 帐户的用户名和密码。
    • 您可以在上面的示例中映射本地 RHEL ISO 路径 $(pwd)/isos/rhel-8.4-x86-64-dvd.iso 作为附加卷。

为 Linux 映像创建 TKr

要将 Linux 映像设置为未来 Kubernetes 版本的默认映像,请基于该映像创建 TKr。否则,请跳到下面的将 Linux 映像用于工作负载集群

下图简要概述了如何在 vSphere 上为自定义 Linux 映像创建 TKr。

创建 TKr

要创建 TKr,请执行以下操作:

  1. ~/.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 版本的集群中所述。

    1. 在 Bom 文件中,找到基础架构的映像定义块:ova 对应于 vSphere、ami 对应于 AWS,azure 对应于 Azure。每个映像定义块都包含 osinfo.nameosinfo.versionosinfo.arch,其中:

      • osinfo.name 是操作系统名称。例如,ubuntu。要查看支持的操作系统列表,请参见目标操作系统
      • osinfo.version 是操作系统版本。例如,20.04。要查看支持的版本的列表,请参见目标操作系统
      • osinfo.arch 是操作系统架构。支持的值为 amd64
    2. 要添加新操作系统映像的引用,请在 ovaamiazure 下添加映像定义块,具体取决于您的目标基础架构。如上所述,映像定义块必须包含 osinfo.nameosinfo.versionosinfo.arch。此外,在以下项上添加映像定义块时:

      • vSphere:

        • name:包含操作系统版本的唯一 OVA 名称,例如 my-ova-ubuntu-2004
        • version: 在创建 OVA 时使用 metadata.json 中分配的唯一 VERSION,例如 v1.25.7+vmware.1-myorg.0
        注意

        version 必须与 metadata.json 中的相同 VERSION 完全匹配。

      • AWS:对于计划在其中使用自定义映像的每个区域,请遵循现有的 id 值格式,但在末尾使用唯一的十六进制字符串,例如 ami-693a5e2348b25e428

      如果 BoM 文件在区域下定义映像,则必须先在其区域中列出自定义映像定义块。在每个区域内,集群创建过程将选择列出的第一个合适的映像。

    3. release.version 值中,通过添加后缀设置自定义版本。请勿通过添加前缀来自定义版本。例如,将 v1.25.7+vmware.1-tkg.1 更改为 v1.25.7+vmware.1-tkg.1-mycustomtkr

    4. 使用您在上一步中为 release.version 指定的相同自定义后缀保存 Bom 文件。

      如果文件名包含加号 (+) 字符,请将 + 替换为三重短划线 (---)。

      例如,将 BOM 文件另存为 tkr-bom-v1.25.7---vmware.1-tkg.1-mycustomtkr.yaml

  2. base64-将文件内容编码为二进制字符串,例如:

    cat tkr-bom-v1.25.7---vmware.1-tkg.1-mycustomtkr.yaml | base64 -w 0
    
  3. 创建 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-BOMConfigMap 的名称,它必须包含在 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...."
    
  4. 保存 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:

    1. 列出 tkr-system 命名空间中的 Pod:

      kubectl get pod -n tkr-system
      
    2. 检索 TKr 控制器 pod 的名称,该名称类似于 tkr-controller-manager-f7bbb4bd4-d5lfd

    3. 删除 Pod:

      kubectl delete pod -n tkr-system TKG-CONTROLLER
      

      其中,TKG-CONTROLLER 是 TKr 控制器 Pod 的名称。

  5. 要检查是否添加了自定义 TKr,请运行tanzu kubernetes-release getkubectl get tkr,然后查找在输出中设置的 CUSTOM-TKR 值。

自定义 TKr 由 kubectltanzu CLI 列出后,您可以用其创建管理集群或工作负载集群,如下所述。

将 Linux 映像用于管理集群

要创建将自定义映像用作其节点的基础操作系统的管理集群,请执行以下操作:

  1. 将映像上载到云提供程序。

  2. 运行安装程序界面时,请在操作系统映像窗格中选择自定义映像,如选择基础操作系统映像中所述。

有关详细信息,请参见如何生成基础操作系统映像选择

将 Linux 映像用于工作负载集群

从 Linux 映像创建工作负载集群的过程有所不同,具体取决于您是否在上面的为 Linux 映像创建 TKr 中创建了 TKr。

  • 如果创建了 TKr,请将 tanzu kubernetes-release get 列出的 TKr 名称传递到 tanzu cluster create--tkr 选项。

  • 如果未创建 TKr,请执行以下操作:

    1. 复制管理集群配置文件,并按照配置文件和对象规范中的过程使用新名称保存该文件。

    2. 在新配置文件中,添加或修改以下内容:

      VSPHERE_TEMPLATE: LINUX-IMAGE
      

      其中,LINUX-IMAGE 是您在构建 Linux 映像中创建的 Linux 映像的名称。

      移除 CLUSTER_NAME 及其设置(如果存在)。

    3. 按照创建工作负载集群中所述部署工作负载集群。

check-circle-line exclamation-circle-line close-line
Scroll to top icon