1.3. 用于 Red Hat Edge Manager 的操作系统镜像
基于镜像的操作系统允许将操作系统及其配置和应用程序版本化、部署和更新为单个单元。
通过执行以下操作,使用基于镜像的操作系统降低了操作风险:
- 尽可能减少经过测试和部署到大量设备之间潜在的偏移量。
- 通过事务更新和回滚,最大程度降低需要昂贵的维护或替换失败更新的风险。
Red Hat Edge Manager 侧重于运行可引导容器镜像(bootc)的基于镜像的 Linux 操作系统。如需更多信息,请参阅 bootc。
重要: bootc 工具不会更新基于软件包的操作系统。
如需更多信息,请参阅附加资源部分。
1.3.1. 镜像构建过程 复制链接链接已复制到粘贴板!
在高级别上,镜像构建过程按如下方式工作:
-
选择基础
bootc操作系统镜像,如 Fedora、CentOS 或 RHEL 镜像。 创建一个将以下项目分层到基础
bootc镜像的容器文件:- Red Hat Edge Manager 代理和配置。
- 可选:特定于您的目标部署环境的任何驱动程序。
- 可选:主机配置,如证书颁发机构捆绑包,以及所有部署通用的应用程序工作负载。
-
使用
podman和skopeo构建、发布和签署引导操作系统镜像。 -
使用
bootc-image-builder创建操作系统磁盘镜像。 -
使用
skopeo构建、发布和签署操作系统磁盘镜像。
注: 操作系统磁盘镜像包含分区、卷、文件系统和初始 bootc 镜像。在置备过程中,只需要创建一次操作系统磁盘镜像。
对于后续的设备更新,只需要 bootc 操作系统镜像,其中包含文件系统中的文件。
1.3.2. 其他资源 复制链接链接已复制到粘贴板!
1.3.3. 构建镜像的特别注意事项 复制链接链接已复制到粘贴板!
技术预览: 以下主题涵盖了为 Red Hat Edge Manager 构建镜像的特殊注意事项:
1.3.3.1. 通过动态运行时配置构建时间配置 复制链接链接已复制到粘贴板!
在构建时向操作系统镜像添加配置。在构建时添加配置可确保将配置经过测试、分发和更新在一起。如果构建时配置不可行或需要,您可以使用 Red Hat Edge Manager 在运行时动态配置设备。
在以下情况下首选动态运行时配置:
- 您有一个特定于部署或特定于站点的配置,如主机名或特定站点的网络凭证。
- 您有不保护与镜像分发的 secret。
- 您有应用程序工作负载需要在不重启的情况下添加、更新或删除,或者它们比操作系统更快。
1.3.3.2. 配置 /usr 目录 复制链接链接已复制到粘贴板!
如果配置是静态的,且应用程序或服务支持该配置,请将配置文件放在 /usr 目录中。通过将配置放在 /usr 目录中,配置保持只读状态,并由镜像完全定义。
在以下情况下,无法将配置放在 /usr 目录中:
- 配置是特定于部署或特定于站点的。
-
应用程序或服务只支持从
/etc目录中读取配置。 - 可能需要在运行时更改配置。
1.3.3.3. 置入目录 复制链接链接已复制到粘贴板!
使用置入目录来添加、替换或删除服务聚合的配置文件。不要直接编辑可能导致从目标配置分离的配置文件。
注意: 您可以在目录名称的末尾通过 .d/ 识别置入目录。例如: /etc/containers/certs.d、/etc/cron.d 和 /etc/NetworkManager/conf.d。
1.3.3.4. 使用脚本的操作系统镜像 复制链接链接已复制到粘贴板!
避免执行更改文件系统的脚本或命令。bootc 或 Red Hat Edge Manager 可以覆盖可能导致 deviation 或失败完整性检查的更改的文件。
相反,在镜像构建期间运行此类脚本或命令,因此更改是镜像的一部分。或者,使用 Red Hat Edge Manager 的配置管理机制。
1.3.3.5. 其他资源 复制链接链接已复制到粘贴板!
- 有关 构建镜像,请参阅通用指南。
- 有关在运行时配置设备的更多信息,请参阅边缘设备的操作系统配置。
1.3.4. 为 Red Hat Edge Manager 构建 引导 操作系统镜像 复制链接链接已复制到粘贴板!
技术预览: 要准备由 Red Hat Edge Manager 管理的设备,请构建包含 Red Hat Edge Manager 代理的 bootc 操作系统镜像。然后为您的设备构建操作系统磁盘镜像。
如需更多信息,请参阅以下部分:
1.3.4.1. 先决条件 复制链接链接已复制到粘贴板!
请参阅以下构建 引导操作系统镜像 的先决条件:
-
安装
podman版本 5.0 或更高版本,以及skopeo版本 1.14 或更高版本。请参阅 获取容器工具。 -
安装
bootc-image-builder。请参阅 安装 bootc-image-builder。
1.3.4.2. 安装 Red Hat Edge Manager CLI 复制链接链接已复制到粘贴板!
要安装 Red Hat Edge Manager CLI,请完成以下步骤:
运行以下命令,为适合您的系统的软件仓库启用订阅管理器:
subscription-manager repos --enable rhacm-2.13-for-rhel-<version>-<arch>-rpms有关 Red Hat Edge Manager 可用存储库的完整列表,请参阅附加资源部分。
使用您的软件包管理器安装
flightctlCLI。运行以下命令:sudo dnf install flightctl-cli
1.3.4.3. 可选:为早期绑定请求注册证书 复制链接链接已复制到粘贴板!
如果要在镜像中包含代理配置,请完成以下步骤:
使用
flightctlCLI 使用 Red Hat Edge Manager 服务进行身份验证。运行以下命令:flightctl login --username=<your_user> --password=<your_password> https://<rhem_api_server_url>注: CLI 使用主机的证书颁发机构池来验证 Red Hat Edge Manager 服务的身份。如果您不将证书颁发机构证书添加到池中,则验证可能会导致 TLS 验证错误。您可以通过在命令中添加
--insecure-skip-tls-verify标志来绕过服务器验证。运行以下命令,以代理配置文件的格式获取注册凭证:
flightctl certificate request --signer=enrollment --expiration=365d --output=embedded > config.yaml备注:
-
--expiration=365d选项指定凭据有效期为一年。 --output=embedded选项指定输出是一个带有嵌入注册凭证的代理配置文件。返回的
config.yaml包含 Red Hat Edge Manager 服务、证书颁发机构捆绑包以及代理注册客户端证书和密钥的 URL。请参见以下示例:
enrollment-service: authentication: client-certificate-data: LS0tLS1CRUdJTiBD... client-key-data: LS0tLS1CRUdJTiBF... service: certificate-authority-data: LS0tLS1CRUdJTiBD... server: https://agent-api.flightctl.127.0.0.1.nip.io:7443 enrollment-ui-endpoint: https://ui.flightctl.127.0.0.1.nip.io:8081-
1.3.4.4. 可选:使用镜像 pull secret 复制链接链接已复制到粘贴板!
如果您的设备依赖于私有存储库中的容器,您必须为 registry 配置 pull secret。完成以下步骤:
根据您使用的容器镜像类型,将 pull secret 放在该设备中的以下一个或多个系统路径中:
-
操作系统镜像使用
/etc/ostree/auth.json路径。 -
应用程序容器镜像使用
/root/.config/containers/auth.json路径。
重要: 在消耗 secret 前,该设备中必须存在 pull secret。
-
操作系统镜像使用
确保 pull secret 具有以下格式:
{ "auths": { "registry.example.com": { "auth": "base64-encoded-credentials" } } }
如需更多信息,请参阅附加资源部分。
1.3.4.5. 使用 bootc构建操作系统镜像 复制链接链接已复制到粘贴板!
使用包含 Red Hat Edge Manager 代理的 bootc 构建操作系统镜像。您可以选择在操作系统镜像中包含以下项目:
- 早期绑定的代理配置
- 任何驱动程序
- 主机配置
- 您需要的应用程序工作负载
完成以下步骤:
创建包含以下内容的
Containerfile文件来构建基于 RHEL 9 的操作系统镜像,其中包含 Red Hat Edge Manager 代理和配置:FROM registry.redhat.io/rhel9/rhel-bootc:<required_os_version>1 RUN subscription-manager repos --enable rhacm-2.13-for-rhel-9-$(uname -m)-rpms && \ dnf -y install flightctl-agent && \ dnf -y clean all && \ systemctl enable flightctl-agent.service && \ systemctl mask bootc-fetch-apply-updates.timer2 重要: 如果您的设备依赖于私有存储库中的容器,则设备 pull secret 必须放在
/etc/ostree/auth.json路径中。在 secret 可以被消耗前,该设备中必须存在 pull secret。可选: 要启用
podman-compose应用程序支持,请在Containerfile文件中添加以下部分:RUN dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm && \ dnf -y install podman-compose && \ dnf -y clean all && \ systemctl enable podman.service可选: 如果您为早期绑定创建了
config.yaml,请在Containerfile中添加以下部分:ADD config.yaml /etc/flightctl/
如需更多信息,请参阅 可选:为早期绑定请求注册证书。
运行以下命令定义开放容器项目(OCI) registry:
OCI_REGISTRY=registry.redhat.io运行以下命令,定义您具有写入权限的镜像存储库:
OCI_IMAGE_REPO=${OCI_REGISTRY}/<your_org>/<your_image>运行以下命令来定义镜像标签:
OCI_IMAGE_TAG=v1为您的目标平台构建操作系统镜像:
sudo podman build -t ${OCI_IMAGE_REPO}:${OCI_IMAGE_TAG} .
1.3.4.6. 使用 Sigstore 签名并发布 bootc 操作系统镜像 复制链接链接已复制到粘贴板!
要使用 Sigstore 为 bootc 操作系统镜像签名,请完成以下步骤:
生成名为
signingkey.pub和signingkey.private的 Sigstore 密钥对:skopeo generate-sigstore-key --output-prefix signingkey配置 Podman 和 Skopeo 等容器工具,将 Sigstore 签名与您的签名镜像一起上传到 OCI registry:
sudo tee "/etc/containers/registries.d/${OCI_REGISTRY}.yaml" > /dev/null <<EOF docker: ${OCI_REGISTRY}: use-sigstore-attachments: true EOF运行以下命令登录到您的 OCI registry:
sudo podman login ${OCI_REGISTRY}运行以下命令签名并发布操作系统镜像:
sudo podman push \ --sign-by-sigstore-private-key ./signingkey.private \ ${OCI_IMAGE_REPO}:${OCI_IMAGE_TAG}
1.3.4.7. 构建操作系统磁盘镜像 复制链接链接已复制到粘贴板!
构建包含设备文件系统的操作系统磁盘镜像。完成以下步骤:
运行以下命令,创建一个名为
output的目录:mkdir -p output使用
bootc-image-builder从您的操作系统镜像生成类型为iso的操作系统磁盘镜像。运行以下命令:sudo podman run --rm -it --privileged --pull=newer \ --security-opt label=type:unconfined_t \ -v "${PWD}/output":/output \ -v /var/lib/containers/storage:/var/lib/containers/storage \ registry.redhat.io/rhel9/bootc-image-builder:latest \ --type iso \ ${OCI_IMAGE_REPO}:${OCI_IMAGE_TAG}
当 bootc-image-builder 完成后,您可以在 ${PWD}/output/bootiso/install.iso 路径中找到 ISO 磁盘镜像。
1.3.4.8. 可选:将操作系统磁盘镜像签名并发布到开放容器项目 registry 复制链接链接已复制到粘贴板!
将您的磁盘镜像签名并发布到您的开放容器项目(OCI)注册表。另外,您还可以将磁盘镜像压缩并作为 OCI 工件发布到与 bootc 镜像相同的 OCI registry,这有助于统一托管并分发 bootc 和 disk 镜像。要将 ISO 磁盘镜像发布到在 bootc 镜像后命名的存储库,并附加 /diskimage-iso,请完成以下步骤:
1.3.4.8.1. 先决条件 复制链接链接已复制到粘贴板!
- 已使用 Sigstore 创建私钥。请参阅使用 Sigstore 签名并发布 bootc 操作系统镜像。
1.3.4.8.2. 可选:签署操作系统磁盘镜像并将其发布到 OCI registry 复制链接链接已复制到粘贴板!
签署您的磁盘镜像并将其发布到您的 OCI 注册表。完成以下步骤:
将 ISO 磁盘镜像所在的目录的所有者从
root更改为您的当前用户。运行以下命令:sudo chown -R $(whoami):$(whoami) "${PWD}/output"定义
OCI_DISK_IMAGE_REPO环境变量,使其与附加/diskimage-iso的bootc镜像相同的存储库。运行以下命令:OCI_DISK_IMAGE_REPO=${OCI_IMAGE_REPO}/diskimage-iso运行以下命令来创建清单列表:
sudo podman manifest create \ ${OCI_DISK_IMAGE_REPO}:${OCI_IMAGE_TAG}运行以下命令,将 ISO 磁盘镜像作为 OCI 工件添加到清单列表中:
sudo podman manifest add \ --artifact --artifact-type application/vnd.diskimage.iso \ --arch=amd64 --os=linux \ ${OCI_DISK_IMAGE_REPO}:${OCI_IMAGE_TAG} \ "${PWD}/output/bootiso/install.iso"使用您的私有 Sigstore 密钥为清单列表签名,并将镜像推送到 registry。运行以下命令:
sudo podman manifest push --all \ --sign-by-sigstore-private-key ./signingkey.private \ ${OCI_DISK_IMAGE_REPO}:${OCI_IMAGE_TAG} \ docker://${OCI_DISK_IMAGE_REPO}:${OCI_IMAGE_TAG}
1.3.4.9. 其他资源 复制链接链接已复制到粘贴板!
- 有关 Red Hat Edge Manager 可用存储库的完整列表,请参阅 下载 Red Hat Advanced Cluster Management for Kubernetes。
- 有关在不同的目标平台上构建操作系统镜像的更多信息,请参阅配置容器 pull secret。
1.3.4.10. 特定目标平台的要求 复制链接链接已复制到粘贴板!
有关构建镜像,请参阅以下平台注意事项:
1.3.4.10.1. 为 Red Hat OpenShift Virtualization 构建的镜像 复制链接链接已复制到粘贴板!
在为 VMware vSphere 构建操作系统镜像和磁盘镜像时,您可以使用以下更改跟踪通用镜像构建过程:
-
在置备虚拟设备时,通过
cloud-init注入注册证书或代理配置来使用后绑定。 -
将
open-vm-tools客户机工具添加到镜像中。 -
构建类型为
qcow2的磁盘镜像,而不是iso。
通过对以下步骤的更改完成通用步骤:
- 基于 RHEL 9 构建操作系统镜像,其中包含 Red Hat Edge Manager 代理和虚拟机客户机工具,但排除代理配置。
使用以下内容创建一个名为
Containerfile的文件:FROM registry.redhat.io/rhel9/bootc-image-builder:latest RUN subscription-manager repos --enable rhacm-2.13-for-rhel-9-$(uname -m)-rpms && \ dnf -y install flightctl-agent && \ dnf -y clean all && \ systemctl enable flightctl-agent.service RUN dnf -y install cloud-init open-vm-tools && \ dnf -y clean all && \ ln -s ../cloud-init.target /usr/lib/systemd/system/default.target.wants && \ systemctl enable vmtoolsd.service可选: 要启用
podman-compose应用程序支持,请在Containerfile文件中添加以下部分:RUN dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm && \ dnf -y install podman-compose && \ dnf -y clean all && \ systemctl enable podman.service
按照通用镜像构建过程,构建、签名和发布 bootc 操作系统镜像。
运行以下命令,创建一个名为
output的目录:mkdir -p output运行以下命令,从您的操作系统镜像生成类型为
vmdk的操作系统磁盘镜像:sudo podman run --rm -it --privileged --pull=newer \ --security-opt label=type:unconfined_t \ -v "${PWD}/output":/output \ -v /var/lib/containers/storage:/var/lib/containers/storage \ registry.redhat.io/rhel9/bootc-image-builder:latest \ --type qcow2 \ ${OCI_IMAGE_REPO}:${OCI_IMAGE_TAG}
当 bootc-image-builder 完成后,您可以在 ${PWD}/output/vmdk/disk.vmdk 路径中找到磁盘镜像。
Red Hat OpenShift Virtualization 可以从 OCI registry 下载磁盘镜像,但它需要一个容器磁盘镜像而不是 OCI 工件。完成以下步骤以构建、签名并上传 QCoW2 磁盘镜像:
使用以下内容创建一个名为
Containerfile.qcow2的文件:FROM registry.access.redhat.com/ubi9/ubi:latest AS builder ADD --chown=107:107 output/qcow2/disk.qcow2 /disk/1 RUN chmod 0440 /disk/*2 FROM scratch COPY --from=builder /disk/* /disk/3 构建、签名和发布您的磁盘镜像。运行以下命令:
sudo chown -R $(whoami):$(whoami) "${PWD}/output" OCI_DISK_IMAGE_REPO=${OCI_IMAGE_REPO}/diskimage-qcow2 sudo podman build -t ${OCI_DISK_IMAGE_REPO}:${OCI_IMAGE_TAG} -f Containerfile.qcow2 . sudo podman push --sign-by-sigstore-private-key ./signingkey.private ${OCI_DISK_IMAGE_REPO}:${OCI_IMAGE_TAG}
1.3.4.10.2. 为 VMware vSphere 构建的镜像 复制链接链接已复制到粘贴板!
在为 VMware vSphere 构建操作系统镜像和磁盘镜像时,您可以使用以下更改跟踪通用镜像构建过程:
-
在置备虚拟设备时,通过
cloud-init注入注册证书或代理配置来使用后绑定。 -
将
open-vm-tools客户机工具添加到镜像中。 -
构建类型为
vmdk的磁盘镜像,而不是iso。
通过对以下步骤的更改完成通用步骤:
- 基于 RHEL 9 构建操作系统镜像,其中包含 Red Hat Edge Manager 代理和虚拟机客户机工具,但排除代理配置。
使用以下内容创建一个名为
Containerfile的文件:FROM registry.redhat.io/rhel9/bootc-image-builder:latest RUN subscription-manager repos --enable rhacm-2.13-for-rhel-9-$(uname -m)-rpms && \ dnf -y install flightctl-agent && \ dnf -y clean all && \ systemctl enable flightctl-agent.service && \ RUN dnf -y install cloud-init open-vm-tools && \ dnf -y clean all && \ ln -s ../cloud-init.target /usr/lib/systemd/system/default.target.wants && \ systemctl enable vmtoolsd.service运行以下命令,创建一个名为
output的目录:mkdir -p output运行以下命令,从您的操作系统镜像生成类型为
vmdk的操作系统磁盘镜像:sudo podman run --rm -it --privileged --pull=newer \ --security-opt label=type:unconfined_t \ -v "${PWD}/output":/output \ -v /var/lib/containers/storage:/var/lib/containers/storage \ registry.redhat.io/rhel9/bootc-image-builder:latest \ --type vmdk \ ${OCI_IMAGE_REPO}:${OCI_IMAGE_TAG}
当 bootc-image-builder 完成后,您可以在 ${PWD}/output/vmdk/disk.vmdk 路径中找到磁盘镜像。