使用 Red Hat Edge Manager 管理设备团队


Red Hat Ansible Automation Platform 2.5

安装、配置和使用 Red Hat Edge Manager 来管理独立和设备的数量

Red Hat Customer Content Services

摘要

了解可用于可扩展和安全边缘管理的组件。

前言

Red Hat Edge Manager 旨在为边缘设备和应用程序提供简单、可扩展和安全的管理。您可以声明要在独立设备或整个设备上运行的操作系统版本、主机配置和一组应用程序。Red Hat Edge Manager 将目标配置发布到设备,其中设备代理会自动应用它们,并报告进度和健康状况备份。

重要

Red Hat Edge Manager 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

对红帽文档提供反馈

如果您对本文档有任何改进建议,或发现错误,请通过 https://access.redhat.com 联系技术支持来创建一个请求。

第 1 章 Red Hat Edge Manager 概述

Red Hat Edge Manager 通过声明性方法简化边缘设备和应用程序的管理。通过定义边缘设备所需的状态,包括您的操作系统版本、主机配置和应用部署,Red Hat Edge Manager 会自动在整个设备间实现和维护这些配置。

Ansible Automation Platform 上的 Red Hat Edge Manager 提供与自动化的升级集成。然后,您可以更多地专注于编排环境,而不必担心更新操作系统。

参阅以下主题来了解更多有关在 Ansible Automation Platform 上使用 Red Hat Edge Manager 的信息:

第 2 章 Red Hat Edge Manager 架构

您可以使用 Red Hat Edge Manager 管理单个设备或整个团队。Red Hat Edge Manager 使用基于代理的架构,允许可扩展且强大的设备管理,即使有有限的网络状况。

通过将 Red Hat Edge Manager 代理部署到设备中,代理会自动管理和监控该设备,同时定期与 Red Hat Edge Manager 服务通信,以检查新配置并报告设备状态。

Red Hat Edge Manager 支持基于镜像的操作系统。您可以在分发到设备的镜像中包括 Red Hat Edge Manager 代理和代理配置。

基于镜像的操作系统允许代理启动镜像的事务更新,并在更新错误时回滚到以前的版本。

Red Hat Edge Manager 架构有以下主要功能:

  • Agent
  • service
  • 基于镜像的操作系统
  • API Server
  • 数据库
  • 设备
  • 设备团队

从以下部分了解更多:

2.1. Red Hat Edge Manager 代理和服务

Red Hat Edge Manager 代理是在每个受管设备上运行的进程,它会定期与 Red Hat Edge Manager 服务通信。代理负责以下任务:

  • 将设备注册到该服务
  • 定期检查服务以获取设备规格的更改,如操作系统、配置和应用程序的变化
  • 独立于服务应用任何更新
  • 报告设备和应用程序状态

Red Hat Edge Manager 服务负责以下任务:

  • 验证和授权用户和代理
  • 注册设备
  • 管理设备清单
  • 从单个设备或团队报告状态

该服务还与存储设备清单和目标设备配置的数据库通信。当与服务通信时,代理会轮询服务以了解配置中的更改。如果代理检测到当前的配置与目标配置分离,代理会尝试将更改应用到该设备。

当代理从服务接收一个新的目标配置时,代理会执行以下任务:

  1. 为了避免根据更新期间的网络连接,代理会通过网络将所有所需的资源(如操作系统镜像和应用程序容器镜像)下载到磁盘。
  2. 代理通过委派到 bootc 来更新操作系统镜像。
  3. 代理通过覆盖服务发送到该设备的一组文件来更新设备的文件系统上的配置文件。
  4. 如有必要,代理会重启到新的操作系统。否则,代理会发出系统服务和应用程序来重新载入更新的配置。
  5. 代理会更新 Podman 上运行的应用程序。

如果更新失败或者系统重启后没有在线返回,代理会自动回滚到以前的操作系统镜像和配置。

注意

您可以在 Git 中保留其定义。Red Hat Edge Manager 定期与数据库中的数量定义同步。

2.2. Red Hat Edge Manager API 服务器

API 服务器是 Red Hat Edge Manager 服务的一个核心部分,允许用户和代理与服务通信。

API 服务器公开以下端点:

面向用户的 API 端点
用户可以通过 CLI 或 Web 控制台连接到面向用户的 API 端点。用户必须对平台网关进行身份验证,才能获取 JSON Web Token (JWT)来发出 HTTPS 请求。
基于代理的 API 端点
代理连接到面向代理的端点,该端点使用 mTLS 保护。该服务使用 X.509 客户端证书验证设备。

Red Hat Edge Manager 服务还与各种外部系统通信,以验证和授权用户、获得 mTLS 证书签名或查询受管设备的配置。

2.3. 设备注册

在开始管理前,您必须将设备注册到 Red Hat Edge Manager 服务。在设备上运行的 Red Hat Edge Manager 代理处理设备注册。

当代理在设备上启动时,代理会在 /etc/flightctl/config.yaml 文件中搜索配置。该文件定义以下配置:

  • 注册端点,即代理连接到注册的 Red Hat Edge Manager 服务。
  • 注册证书,即代理只用来安全请求 Red Hat Edge Manager 服务注册的 X.509 客户端证书和密钥。
  • 可选 :任何其他代理配置。

代理通过搜索注册端点(Red Hat Edge Manager 服务)来开始注册过程,该服务在配置文件中定义。建立一个安全的 mTLS 保护与服务的连接后,代理会向该服务提交注册请求。

该请求包括设备硬件和操作系统的描述、X.509 证书签名请求以及设备的加密身份。注册请求必须由授权用户批准。批准请求后,该设备会受 Red Hat Edge Manager 服务信任和管理。

2.3.1. 注册方法

您可以使用以下方法为该设备置备注册端点和证书:

早期绑定
您可以构建包含注册端点和证书的操作系统镜像。使用早期绑定镜像的设备可以自动连接到定义的服务来请求注册,而无需依赖于任何置备基础架构。设备共享相同的长期 X.509 客户端证书。然而,在这种情况下,设备绑定到特定的服务和所有者。
后向绑定
您可以在置备时定义注册端点和证书,而不是将其包含在操作系统镜像中。使用后绑定镜像的设备不绑定到单个所有者或服务,并可具有特定于设备的、简短的 X.509 客户端证书。但是,后向绑定需要虚拟化或裸机置备基础架构,这些基础架构可以从 Red Hat Edge Manager 服务请求特定于设备的端点和证书,并使用 cloud-initIgnitionkickstart 等机制将其注入置备的系统。
注意

注册证书仅用于保护网络连接以提交注册请求。注册证书不参与注册请求的实际验证或批准。注册证书不再用于注册的设备,因为设备依赖特定于设备的管理证书。

第 3 章 在 Ansible Automation Platform 上安装 Red Hat Edge Manager

安装 Red Hat Edge Manager 以大规模管理边缘设备和应用程序。本指南重点介绍 Red Hat Enterprise Linux 和 Ansible Automation Platform 上的 Red Hat Edge Manager 的独立部署。

3.1. 安装 Red Hat Edge Manager RPM 软件包

通过启用所需的存储库、安装 flightctl-services 软件包、配置 baseDomain,然后启动并验证正在运行的服务,为安装 Red Hat Edge Manager 准备 Red Hat Enterprise Linux 主机。

先决条件

  • 带有正在运行的实例的 Ansible Automation Platform 订阅以及所需的 API URL 和 OAuth 凭证。
  • 安装 Red Hat Edge Manager 的 Ansible Automation Platform 的独立机器。
  • 已安装用于管理容器的 podman。
  • 一个 Red Hat Enterprise Linux 主机:

    • 最小安装
    • 4 内核和 16GB RAM (推荐)
    • 管理访问权限(root 或 sudo 兼容用户)
    • SSH 访问

流程

  1. SSH 到您的 Red Hat Enterprise Linux 主机。
  2. 验证并登录到 Red Hat Container Registry:

    sudo podman login registry.redhat.io
    Copy to Clipboard
  3. 安装所需的软件仓库和软件包:

    • 根据 Red Hat Enterprise Linux 的版本和主机的构架运行以下示例命令,确保启用了 Ansible Automation Platform 存储库:

      sudo subscription-manager repos --enable ansible-automation-platform-2.5-for-rhel-9-x86_64-rpms
      Copy to Clipboard
    • 运行以下命令来安装 Red Hat Edge Manager 服务:

      sudo dnf install -y flightctl-services
      Copy to Clipboard
  4. 更新安装的 /etc/flightctl/service-config.yaml,以设置 baseDomain

    sudo vi /etc/flightctl/service-config.yaml
    Copy to Clipboard
    重要

    确保在服务配置中正确设置 baseDomain。默认情况下,安装过程会尝试根据 Red Hat Enterprise Linux 主机的 IP 地址自动设置这个值。

    但是,如果您的环境使用特定的域名来访问这个主机,如 rhem-example.com,建议您将 /etc/flightctl/service-config.yaml 中的 baseDomain 手动更新到此主机名。

    正确设置 baseDomain 可确保 Red Hat Edge Manager 中的所有生成的 URL、证书和内部配置对于网络设置是准确的。这对于与 Ansible Automation Platform 集成以及确保 UI 可通过预期的域名访问尤为重要。

    您可以使用以下方法检查当前配置的 baseDomain

    grep baseDomain: /etc/flightctl/service-config.yaml
    Copy to Clipboard
  5. 启用并启动服务:

    sudo systemctl enable flightctl.target
    sudo systemctl start flightctl.target
    Copy to Clipboard
  6. 验证服务是否正在运行:

    sudo systemctl list-units flightctl-*.service
    Copy to Clipboard

    您应该看到这些 7 个服务正在运行:

    • flightctl-db
    • flightctl-kv
    • flightctl-api
    • flightctl-periodic
    • flightctl-worker
    • flightctl-ui
    • flightctl-cli-artifacts
  7. 进入存储在服务配置文件中的 baseDomain 的 UI:

    grep baseDomain: /etc/flightctl/service-config.yaml
    Copy to Clipboard

    在 Web 浏览器中访问显示的 baseDomain 以访问 UI。

故障排除

如果您的服务没有正确运行,请使用以下 log 命令进一步排除故障并修复:

journalctl -u flightctl-<impacted service> -b --no-pager
Copy to Clipboard

3.2. 为 Ansible Automation Platform 设置 OAuth 应用程序

在 Ansible Automation Platform UI 中,有两个选项可用于手动设置 OAuth 应用程序,可以在 Ansible Automation Platform UI 中手动或自动设置。

3.2.1. 自动设置 OAuth 应用程序

通过在 Ansible Automation Platform 中生成 OAuth 令牌并将其添加到您的配置文件中,自动设置 OAuth 应用程序。服务启动后,会自动创建应用并更新客户端 ID。

流程

  1. 在 Ansible Automation Platform 中生成 OAuth 令牌:

    1. 在导航面板中,选择 Access ManagementUsers
    2. 选择对 Default 机构(建议 admin 用户)具有写入权限的用户。
    3. 单击该用户的 Tokens 选项卡。
    4. Create token 并输入相关详情。

      1. Scope :选择 Write
  2. 前往 Integrating with Ansible Automation Platform 部分,以了解编辑 service-config.yaml 文件的步骤,并自动完成 OAuth 应用程序设置。

3.2.2. 手动设置 OAuth 应用程序

在 Ansible Automation Platform 实例中手动设置 OAuth 应用程序。这对于启用基于令牌的身份验证和集成外部应用程序(如 Red Hat Edge Manager)非常重要。

流程

  1. 在 Ansible Automation Platform 实例的导航面板中,前往 Access ManagementOAuth Applications
  2. 单击 Create OAuth application
  3. 输入以下详情:

    • 名称 :输入名称,如 "Red Hat Edge Manager"。这是 Ansible Automation Platform UI 中可见的名称。
    • URL: 使用 https:// 的 Ansible Automation Platform UI 的 baseDomain
    • Organization: 选择 默认
    • 授权授权类型 :选择 授权代码
    • 客户端 :选择 Public
    • 重定向 URI

  4. 单击 Create OAuth application。现在,在导航面板中可以看到 Application Links 部分。
  5. 根据需要复制 客户端 ID,以使用此值更新 service-config.yaml 文件中的 oAuthApplicationClientId
  6. 前往 Integrating with Ansible Automation Platform 部分,以了解编辑 service-config.yaml 文件的步骤,并手动完成 OAuth 应用程序设置。

3.2.3. 与 Ansible Automation Platform 集成

通过修改 service-config.yaml 文件将 Red Hat Edge Manager 与 Ansible Automation Platform 实例集成,使其包含验证类型、API URL、OAuth 客户端 ID 和可选的 OAuth 令牌,然后重启服务。

流程

  1. 在编辑 service-config.yaml 文件前停止 flightctl 服务:

    sudo systemctl stop flightctl.target
    Copy to Clipboard
  2. 通过编辑配置文件来配置集成设置:

    sudo vi /etc/flightctl/service-config.yaml
    Copy to Clipboard
  3. 更新配置文件,以便与 Ansible Automation Platform 集成:

    global:
      baseDomain: <your-edge-manager-ip-or-domain> 
    1
    
      auth:
        type: aap 
    2
    
        insecureSkipTlsVerify: false 
    3
    
        aap:
          apiUrl: https://your-aap-instance.example.com 
    4
    
          externalApiUrl: https://your-aap-instance.example.com 
    5
    
          oAuthApplicationClientId: <client-id-from-oauth-app> 
    6
    
          oAuthToken: <your-oauth-token> 
    7
    Copy to Clipboard
    1
    主机的域名或 IP,它会在安装 RPM 时自动设置,但您可以覆盖它。它是必需的唯一字段。
    2
    把它设置为 aap 以启用 Ansible Automation Platform 身份验证。
    3
    设置为 false。仅将其设置为 true,以跳过 Ansible Automation Platform URL 的 TLS 证书验证。对于生产环境,请考虑配置 CA 证书(请参阅自签名证书部分)。
    4
    正在运行的 Ansible Automation Platform 实例的面向内部的 API URL,用于发出请求。您可以将此 URL 配置为正在运行的 Ansible Automation Platform 实例的内部可访问的 URL。例如,如果存在单独的内部或外部入口。
    5
    运行 Ansible Automation Platform 实例的外部访问 URL。
    6
    如果您使用自动方法,则不需要此字段。这是在 Red Hat Edge Manager 的 Ansible Automation Platform 中配置的 OAuth 应用程序的客户端 ID。如果您还没有此空,则可以将此留空,并提供一个 oAuthToken 以允许设置创建它。
    7
    如果您使用手动方法,则不需要此字段。这是一个 OAuth 令牌,具有 Ansible Automation Platform 实例中"Default"机构的写入权限。只有在您希望设置过程自动创建 OAuth 应用程序时才需要。创建后,不再需要此令牌。
  4. 启动服务:

    sudo systemctl start flightctl.target
    Copy to Clipboard

3.3. 自签名证书

Red Hat Edge Manager 服务会在 /etc/flightctl/pki 目录中自动生成和存储自签名证书。它们是:

  • /etc/flightctl/pki/ca.crt
  • /etc/flightctl/pki/ca.key
  • /etc/flightctl/pki/client-enrollment.crt
  • /etc/flightctl/pki/client-enrollment.key
  • /etc/flightctl/pki/server.crt
  • /etc/flightctl/pki/server.key

您可以将自己的自定义证书放在以下位置:

  • 自定义服务器证书/密钥对:

    • /etc/flightctl/pki/server.crt
    • /etc/flightctl/pki/server.key
  • Ansible Automation Platform 身份验证的自定义 CA 证书:

    • /etc/flightctl/pki/auth/ca.crt
注意

如果 Ansible Automation Platform 实例使用自定义 CA 证书,请确保调整 service-config.yaml 中的 insecureSkipTlsVerify 设置。

第 4 章 用于 Red Hat Edge Manager 的操作系统镜像

基于镜像的操作系统允许将操作系统及其配置和应用程序版本化、部署和更新为单个单元。通过执行以下操作,使用基于镜像的操作系统降低了操作风险:

  • 尽可能减少经过测试和部署到大量设备之间潜在的偏移量。
  • 通过事务更新和回滚,最大程度降低需要昂贵的维护或替换失败更新的风险。

Red Hat Edge Manager 侧重于运行可引导容器镜像(bootc)的基于镜像的 Linux 操作系统。

如需更多信息,请参阅 bootc

重要

bootc 工具不会更新基于软件包的操作系统。

4.1. 镜像构建过程

  1. 选择基础 bootc 操作系统镜像,如 Fedora、CentOS 或 RHEL 镜像。
  2. 创建一个将以下项目分层到基础 bootc 镜像的容器文件:

    • Red Hat Edge Manager 代理和配置。
    • 可选:特定于您的目标部署环境的任何驱动程序。
    • 可选:主机配置,如证书颁发机构捆绑包和应用程序工作负载,适用于所有部署。
  3. 使用 podmanskopeo 构建、发布和签署 引导 操作系统镜像。
  4. 使用 bootc-image-builder 创建操作系统磁盘镜像。
  5. 使用 skopeo 构建、发布和签署操作系统磁盘镜像。
注意

操作系统磁盘镜像有分区、卷、文件系统和初始 bootc 镜像。在置备过程中,您只需要创建操作系统磁盘镜像一次。对于稍后的设备更新,您只需要 bootc 操作系统镜像,该镜像具有文件系统中的文件。

4.2. 构建镜像的特别注意事项

4.2.1. 通过动态运行时配置构建时间配置

在构建时将配置添加到操作系统镜像。在构建时添加配置可确保将配置经过测试、分发和更新在一起。如果构建时配置不可行或需要,您可以使用 Red Hat Edge Manager 在运行时动态配置设备。

在以下情况下首选动态运行时配置:

  • 您有一个特定于部署或特定于站点的配置,如主机名或特定站点的网络凭证。
  • 您有不保护与镜像分发的 secret。
  • 您有应用程序工作负载需要在不重启的情况下添加、更新或删除,或者它们比操作系统更快。

4.2.2. 配置 /usr 目录中的配置

如果配置是静态的,且应用程序或服务支持该配置,请将配置文件放在 /usr 目录中。通过将配置放在 /usr 目录中,配置保持只读状态,并由镜像完全定义。

在以下情况下,不要将配置放在 /usr 目录中:

  • 配置是特定于部署或特定于站点的。
  • 应用程序或服务只支持从 /etc 目录中读取配置。
  • 可能需要在运行时更改配置。

4.2.3. 置入目录

使用置入目录来添加、替换或删除服务聚合的配置文件。不要直接编辑配置文件,因为它可能会导致目标配置出现偏差。

注意

您可以在目录名称的末尾通过 .d/ 识别置入目录。例如: /etc/containers/certs.d/etc/cron.d/etc/NetworkManager/conf.d

4.2.4. 使用脚本的操作系统镜像

避免执行更改文件系统的脚本或命令。bootc 或 Red Hat Edge Manager 可以覆盖更改的文件,这可能会导致 deviation 或 failed 完整性检查。

相反,在镜像构建期间运行此类脚本或命令,以便更改是镜像的一部分。您还可以使用 Red Hat Edge Manager 的配置管理机制。

4.3. 为 Red Hat Edge Manager 构建 引导 操作系统镜像

要准备由 Red Hat Edge Manager 管理的设备,请构建具有 Red Hat Edge Manager 代理的 bootc 操作系统镜像。然后为您的设备构建操作系统磁盘镜像。

如需更多信息,请参阅以下部分:

4.3.1. 先决条件

请参阅以下构建 引导操作系统镜像 的先决条件:

4.3.2. 安装 Red Hat Edge Manager CLI

要安装 Red Hat Edge Manager CLI,请完成以下步骤:

流程

  1. 运行以下命令,为适合您的系统的软件仓库启用订阅管理器:

    sudo subscription-manager repos --enable ansible-automation-platform-2.5-for-rhel-9-x86_64-rpms
    Copy to Clipboard

    有关 Red Hat Edge Manager 可用存储库的完整列表,请参阅附加资源部分

  2. 运行以下命令,使用软件包管理器安装 flightctl CLI:

    sudo dnf install flightctl
    Copy to Clipboard

如果您 手动设置 OAuth 应用程序,您还需要确保一个工具 xdg-openx-www-browserwww-browser 可用,例如通过安装 xdg-utils

4.3.3. 通过 CLI 登录到 Red Hat Edge Manager

如何登录 Red Hat Edge Manager 取决于您在初始设置应用程序时选择 自动 还是 手动 方法。

流程

  • 如果您使用自动设置,您可以创建一个个人访问令牌,甚至只使用 Read scope (在 Ansible Automation Platform UI > User details > Tokens 选项卡右上角的配置集图标下),然后使用此令牌直接通过 CLI 登录,并使用以下示例语法直接登录:

    flightctl login https://<your-edge-manager-ip-or-domain>:3443 --token=<your-aap-oauth-token> --insecure-skip-tls-verify
    Copy to Clipboard
  • 如果使用手动设置,请使用 Client ID 通过基于 Web 的过程登录,如下例所示:

    flightctl login https://<your-edge-manager-ip-or-domain>:3443 --web --client-id=<your-aap-client-id> --insecure-skip-tls-verify
    Copy to Clipboard
    • 这会在 Web 浏览器中打开,并要求您批准。

      只有在您没有生成自己的有效证书时,才会使用 --insecure-skip-tls-verify 参数。

后续步骤

使用以下命令可帮助您使用 CLI:

  • 要输出可用命令列表,请使用:

    flightctl
    Copy to Clipboard
  • 要输出 flightctl CLI 版本和后端 Red Hat Edge Manager 版本,请使用:

    flightctl version
    Copy to Clipboard
重要

为确保支持性和正确功能,flightctl CLI 的版本必须与正在使用的 Red Hat Edge Manager 版本匹配。不支持不匹配的版本。

4.3.4. 可选:为早期绑定请求注册证书

如果要在镜像中包含代理配置,请完成以下步骤:

流程

  1. 按照通过 CLI 登录到 Red Hat Edge Manager 中的步骤登录到 flightctl CLI

    注意

    CLI 使用主机的证书颁发机构池来验证 Red Hat Edge Manager 服务的身份。如果您不将证书颁发机构证书添加到池中,则验证可能会导致 TLS 验证错误。您可以通过在命令中添加 --insecure-skip-tls-verify 标志来绕过服务器验证。

  2. 运行以下命令,以代理配置文件的格式获取注册凭证:

    flightctl certificate request --signer=enrollment --expiration=365d --output=embedded > config.yaml
    Copy to Clipboard
    注意
    • --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
    Copy to Clipboard

4.3.5. 可选:使用镜像 pull secret

如果您的设备依赖于私有存储库中的容器,您必须为 registry 配置 pull secret。完成以下步骤:

流程

  1. 根据您使用的容器镜像类型,将 pull secret 放在该设备中的以下一个或多个系统路径中:

    • 操作系统镜像使用 /etc/ostree/auth.json 路径。
    • 应用程序容器镜像使用 /root/.config/containers/auth.json 路径。

      重要

      在 secret 可以被消耗前,该设备中必须存在 pull secret。

  2. 确保 pull secret 使用以下格式:

    {
      "auths": {
        "registry.example.com": {
          "auth": "base64-encoded-credentials"
        }
      }
    }
    Copy to Clipboard

如需更多信息,请参阅附加资源部分

4.3.6. 使用 bootc构建操作系统镜像

使用包含 Red Hat Edge Manager 代理的 bootc 构建操作系统镜像。您可以选择在操作系统镜像中包含以下项目:

  • 早期绑定的代理配置
  • 任何驱动程序
  • 主机配置
  • 您需要的应用程序工作负载

完成以下步骤:

流程

  1. 创建包含以下内容的 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.timer 
    2
    Copy to Clipboard
    1
    FROM 中引用的基础镜像是一个可引导容器(bootc)镜像,该镜像已有 Linux 内核,它允许您重复使用现有的标准容器构建工具和工作流。
    2
    禁用默认的自动更新。更新由 Red Hat Edge Manager 管理。
    重要

    如果您的设备依赖于私有软件仓库的容器,您必须将设备 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
      Copy to Clipboard
    • 可选: 如果您为早期绑定创建了 config.yaml,请在 Containerfile 中添加以下部分:

      ADD config.yaml /etc/flightctl/
      Copy to Clipboard

    如需更多信息,请参阅 可选:为早期绑定请求注册证书

  2. 运行以下命令定义开放容器项目(OCI) registry:

    OCI_REGISTRY=registry.redhat.io
    Copy to Clipboard
  3. 运行以下命令,定义您具有写入权限的镜像存储库:

    OCI_IMAGE_REPO=${OCI_REGISTRY}/<your_org>/<your_image>
    Copy to Clipboard
  4. 运行以下命令来定义镜像标签:

    OCI_IMAGE_TAG=v1
    Copy to Clipboard
  5. 为您的目标平台构建操作系统镜像:

    sudo podman build -t ${OCI_IMAGE_REPO}:${OCI_IMAGE_TAG}
    Copy to Clipboard

4.3.7. 使用 Sigstore 签名并发布 bootc 操作系统镜像

要使用 Sigstore 为 bootc 操作系统镜像签名,请完成以下步骤:

流程

  1. 生成名为 signingkey.pubsigningkey.private 的 Sigstore 密钥对:

    skopeo generate-sigstore-key --output-prefix signingkey
    Copy to Clipboard
  2. 配置 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
    Copy to Clipboard
  3. 运行以下命令登录到您的 OCI registry:

    sudo podman login ${OCI_REGISTRY}
    Copy to Clipboard
  4. 运行以下命令签名并发布操作系统镜像:

    sudo podman push \
        --sign-by-sigstore-private-key ./signingkey.private \
        ${OCI_IMAGE_REPO}:${OCI_IMAGE_TAG}
    Copy to Clipboard

4.3.8. 构建操作系统磁盘镜像

构建包含设备文件系统的操作系统磁盘镜像。

完成以下步骤:

流程

  1. 运行以下命令,创建一个名为 output 的目录:

    mkdir -p output
    Copy to Clipboard
  2. 运行以下命令,使用 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}
    Copy to Clipboard

bootc-image-builder 完成后,您可以在 ${PWD}/output/bootiso/install.iso 路径中找到 ISO 磁盘镜像。

4.3.9. 可选:将操作系统磁盘镜像签名并发布到开放容器项目 registry

将您的磁盘镜像签名并发布到您的开放容器项目(OCI)注册表。另外,您还可以将磁盘镜像压缩并作为 OCI 工件发布到与 bootc 镜像相同的 OCI registry,这有助于统一托管并分发 bootc 和 disk 镜像。将您的 ISO 磁盘镜像发布到以 bootc 镜像命名的存储库,并附加 /diskimage-iso

先决条件

通过完成以下步骤,签署您的磁盘镜像并将其发布到您的 OCI registry:

流程

  1. 运行以下命令,将 ISO 磁盘镜像所在的目录的所有者从 root 更改为您的当前用户:

    sudo chown -R $(whoami):$(whoami) "${PWD}/output"
    Copy to Clipboard
  2. 运行以下命令,定义 OCI_DISK_IMAGE_REPO 环境变量与 bootc 镜像相同的存储库,并附加 /diskimage-iso

    OCI_DISK_IMAGE_REPO=${OCI_IMAGE_REPO}/diskimage-iso
    Copy to Clipboard
  3. 运行以下命令来创建清单列表:

    sudo podman manifest create \
        ${OCI_DISK_IMAGE_REPO}:${OCI_IMAGE_TAG}
    Copy to Clipboard
  4. 运行以下命令,将 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"
    Copy to Clipboard
  5. 运行以下命令,使用私有 Sigstore 密钥为清单列表签名:

    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}
    Copy to Clipboard

4.3.10. 其他资源

4.3.11. 特定目标平台的要求

请参阅以下平台注意事项:

4.3.11.1. 为 Red Hat OpenShift Virtualization 构建镜像

在为 Red Hat OpenShift Virtualization 构建操作系统镜像和磁盘镜像时,您可以使用以下更改跟踪通用镜像构建过程:

  • 在置备虚拟设备时,通过 cloud-init 注入注册证书或代理配置来使用后绑定。
  • open-vm-tools 客户机工具添加到镜像中。
  • 构建类型为 qcow2 的磁盘镜像,而不是 iso

通过对以下步骤的更改完成通用步骤:

流程

  1. 基于 RHEL 9 构建操作系统镜像,其中包含 Red Hat Edge Manager 代理和虚拟机客户机工具,但排除代理配置。
  2. 使用以下内容创建一个名为 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
    Copy to Clipboard
  3. 可选: 要启用 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
    Copy to Clipboard
4.3.11.2. 构建 bootc 镜像

按照通用镜像构建过程构建、签名和发布 bootc 操作系统镜像:

流程

  1. 运行以下命令,创建一个名为 output 的目录:

    mkdir -p output
    Copy to Clipboard
  2. 运行以下命令,从您的操作系统镜像生成类型为 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}
    Copy to Clipboard

bootc-image-builder 完成后,您可以在 ${PWD}/output/vmdk/disk.vmdk 下找到磁盘镜像。

4.3.11.3. 构建 QCoW2 磁盘镜像

Red Hat OpenShift Virtualization 可以从 OCI registry 下载磁盘镜像,但它需要一个容器磁盘镜像而不是 OCI 工件。

完成以下步骤以构建、签名并上传 QCoW2 磁盘镜像:

流程

  1. 使用以下内容创建一个名为 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
    Copy to Clipboard
    1
    将 QCoW2 磁盘镜像添加到构建器容器中,以设置所需的 107 文件所有权,即 QEMU 用户。
    2
    设置所需的 0440 文件权限。
    3
    将文件复制到全新镜像。
  2. 运行以下命令,构建、签名和发布您的磁盘镜像:

    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}
    Copy to Clipboard
4.3.11.4. 为 VMware vSphere 构建镜像

在为 VMware vSphere 构建操作系统镜像和磁盘镜像时,您可以使用以下更改跟踪通用镜像构建过程:

  • 在置备虚拟设备时,通过 cloud-init 注入注册证书或代理配置来使用后绑定。
  • open-vm-tools 客户机工具添加到镜像中。
  • 构建类型为 vmdk 的磁盘镜像,而不是 iso

通过对以下步骤的更改完成通用步骤:

流程

  1. 基于 RHEL 9 构建操作系统镜像,其中包含 Red Hat Edge Manager 代理和虚拟机客户机工具,但排除代理配置。
  2. 使用以下内容创建一个名为 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
    Copy to Clipboard
  3. 运行以下命令,创建一个名为 output 的目录:

    mkdir -p output
    Copy to Clipboard
  4. 运行以下命令,从您的操作系统镜像生成类型为 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}
    Copy to Clipboard

bootc-image-builder 完成后,您可以在 ${PWD}/output/vmdk/disk.vmdk 下找到磁盘镜像。

第 5 章 置备设备

您可以在不同的环境中使用 Red Hat Edge Manager 置备设备。使用您构建的操作系统镜像或磁盘镜像以用于 Red Hat Edge Manager。根据您的目标环境,置备物理或者虚拟设备。

请参见以下部分:

5.1. 置备物理设备

当您使用 bootc-image-builder 工具从操作系统镜像构建用于标准化(ISO)磁盘镜像的国际组织时,该镜像与可用于下载的 RHEL ISO 类似。但是,您的操作系统镜像内容嵌入 ISO 磁盘镜像中。

要在不访问网络的情况下将 ISO 磁盘镜像安装到裸机系统中,请参阅 Red Hat Enterprise Linux 文档中的 部署自定义 ISO 容器镜像

要通过网络安装 ISO 磁盘镜像,请参阅 Red Hat Enterprise Linux 文档中的 通过 PXE 引导部署 ISO bootc 镜像

5.2. 使用 OpenShift Virtualization 置备设备

您可以使用托管在 OCI 容器 registry 上的 QCoW2 容器磁盘镜像在 OpenShift Virtualization 上置备虚拟机。

如果您的操作系统镜像还没有包含 Red Hat Edge Manager 代理注册配置,您可以在置备时通过 cloud-init 用户数据注入配置。

先决条件

  • 已安装 flightctl CLI 并登录到 Red Hat Edge Manager 服务实例。
  • 已安装 oc CLI,使用它来登录到 OpenShift 集群实例,并改为您要创建虚拟机的项目。

5.2.1. 创建 cloud-init 配置

要创建 cloud-init 配置,请完成以下步骤:

流程

  1. 运行以下命令,请求新的 Red Hat Edge Manager 代理注册配置并将其存储在名为 config.yaml 的文件中:

    flightctl certificate request --signer=enrollment --expiration=365d --output=embedded > config.yaml
    Copy to Clipboard
  2. 运行以下命令,创建一个名为 cloud-config.yaml 的云配置用户数据文件,该文件将代理配置放在第一次引导的正确位置:

    cat <<EOF > cloud-config.yaml
    #cloud-config
    write_files:
    - path: /etc/flightctl/config.yaml
      content: $(cat config.yaml | base64 -w0)
      encoding: b64
    EOF
    Copy to Clipboard
  3. 创建包含云配置用户数据文件的 Kubernetes Secret

    oc create secret generic enrollment-secret --from-file=userdata=cloud-config.yaml
    Copy to Clipboard

5.2.2. 创建虚拟机

创建一个虚拟机,其主磁盘填充自您的 QCoW2 容器磁盘镜像和 cloud-init 配置驱动器,该磁盘从您的注册 secret 填充。

完成以下步骤:

流程

  1. 运行以下命令,创建具有 VirtualMachine 资源清单的文件:

    cat <<EOF > my-bootc-vm.yaml
    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: my-bootc-vm
    spec:
      runStrategy: RerunOnFailure
      template:
        spec:
          domain:
            cpu:
              cores: 1
            memory:
              guest: 1024M
            devices:
              disks:
                - name: containerdisk
                  disk:
                    bus: virtio
                - name: cloudinitdisk
                  disk:
                    bus: virtio
          volumes:
            - name: containerdisk
              containerDisk:
                image: ${OCI_DISK_IMAGE_REPO}:${OCI_IMAGE_TAG}
            - name: cloudinitdisk
              cloudInitConfigDrive:
                secretRef:
                  name: enrollment-secret
    EOF
    Copy to Clipboard
  2. 运行以下命令,将资源清单应用到集群:

    oc apply -f my-bootc-vm.yaml
    Copy to Clipboard

其他资源

第 6 章 管理设备

Red Hat Edge Manager 从注册管理设备生命周期以弃用设备。设备生命周期还包括设备管理,如组织、监控和使用 Red Hat Edge Manager 更新设备。

您可以单独或管理设备。通过 Red Hat Edge Manager,您可以将整个设备作为单个对象管理,而不是单独管理多个设备。

您只需要指定所需的配置一次,然后 Red Hat Edge Manager 将配置应用到团队中的所有设备。

了解单个设备管理是管理团队中设备的基础。在以下情况下,您可能需要单独管理设备:

  • 如果几个设备有不同的配置。
  • 如果您使用外部自动化来更新设备。

以下小节侧重于管理独立设备:

6.1. 注册设备

要使用 Red Hat Edge Manager 管理设备,您必须将设备注册到 Red Hat Edge Manager 服务。

当 Red Hat Edge Manager 代理在设备上运行时,代理将通过生成加密密钥对来为注册过程准备注册过程。加密密钥对充当设备的唯一加密身份。密钥对由公钥和私钥组成。私钥不会离开设备,因此设备无法重复或模拟。

当设备尚未注册时,代理会执行服务发现来查找其 Red Hat Edge Manager 服务实例。然后,设备建立与服务的安全 mTLS 保护的网络连接。该设备使用其 X.509 注册设备在镜像构建或设备置备过程中获取的证书。该设备向服务提交注册请求,其中包括:

  • 设备硬件和操作系统的描述
  • X.509 证书签名请求,其中包含设备的加密身份,以获取初始管理证书

在授权用户批准或拒绝请求之前,该设备不被视为可信,并保持在设备 lobby 中轮转。

如需更多信息,请参阅以下部分:

6.1.1. 在 CLI 中注册设备

您必须先将设备注册到 Red Hat Edge Manager 服务中,然后才能管理它们。

先决条件

流程

  1. 运行以下命令,列出当前等待批准的所有设备:

    flightctl get enrollmentrequests --field-selector="status.approval.approved != true"
    Copy to Clipboard

    请参见以下示例:

    NAME           APPROVAL  APPROVER  APPROVED LABELS
    <device_name>  Pending   <none>    <none>
    Copy to Clipboard
    注意

    唯一的设备名称由代理生成,您无法更改它。代理选择其公钥的 base32 编码的哈希作为设备名称。

  2. 通过指定注册请求的名称来批准注册请求。另外,您可以使用- label or -l 标志向设备添加标签。请参见以下示例:

    flightctl approve -l region=eu-west-1 -l site=factory-berlin enrollmentrequest/54shovu028bvj6stkovjcvovjgo0r48618khdd5huhdjfn6raskg
    Copy to Clipboard

    请参见以下示例输出:

    NAME           APPROVAL  APPROVER  APPROVED LABELS
    <device_name>  Approved  user      region=eu-west-1,site=factory-berlin
    Copy to Clipboard

批准注册请求后,服务会发出设备的管理证书,并在设备清单中注册该设备。然后您可以管理该设备。

6.2. 查看设备

要获取有关清单中设备的更多信息,您可以使用 Red Hat Edge Manager CLI。

先决条件

6.2.1. 在 Web UI 中查看设备清单和设备详情

完成以下步骤:

流程

  1. 在导航面板中,选择 Application LinksEdge Manager。这会打开 external Edge Manager 实例。
  2. 在导航面板中,选择" 设备 ",您可以在其中查看设备清单、详情和停用设备。

6.2.2. 在 CLI 中查看设备清单和设备详情

完成以下步骤:

流程

  1. 运行以下命令,查看设备清单中的设备:

    flightctl get devices
    Copy to Clipboard

    请参见以下示例输出:

    NAME           ALIAS    OWNER   SYSTEM  UPDATED     APPLICATIONS  LAST SEEN
    <device_name>  <none>   <none>  Online  Up-to-date  <none>        3 seconds ago
    Copy to Clipboard
  2. 运行以下命令,以 YAML 格式查看该设备的详情:

    flightctl get device/<device_name> -o yaml
    Copy to Clipboard

    请参见以下示例输出:

    apiVersion: flightctl.io/v1alpha1
    kind: Device
    metadata:
      name: <device_name>
      labels: 
    1
    
        region: eu-west-1
        site: factory-berlin
    spec:
      os:
        image: quay.io/flightctl/rhel:9.5 
    2
    
      config:
      - name: my-os-configuration 
    3
    
        configType: GitConfigProviderSpec
        gitRef:
          path: /configuration
          repository: my-configuration-repo
          targetRevision: production
    status:
      os:
        image: quay.io/flightctl/rhel:9.5 
    4
    
      config:
        renderedVersion: "1" 
    5
    
      applications:
        data: {} 
    6
    
        summary:
          status: Unknown 
    7
    
      resources: 
    8
    
        cpu: Healthy
        disk: Healthy
        memory: Healthy
      systemInfo: 
    9
    
        architecture: amd64
        bootID: 037750f7-f293-4c5b-b06e-481eef4e883f
        operatingSystem: linux
      summary:
        info: ""
        status: Online 
    10
    
      updated:
        status: UpToDate 
    11
    
      lastSeen: "2024-08-28T11:45:34.812851905Z" 
    12
    
    [...]
    Copy to Clipboard
    1
    分配给该设备的用户定义标签。
    2
    设备的目标 OS 镜像版本。
    3
    设备的目标操作系统配置。
    4
    设备的当前 OS 镜像版本
    5
    设备的当前操作系统配置版本。
    6
    设备部署的应用程序的当前列表。
    7
    该设备中应用程序的健康状况。
    8
    CPU、磁盘和内存资源的可用性。
    9
    基本系统信息。
    10
    设备的健康状况。
    11
    设备的更新状态。
    12
    设备的最后检查时间和日期。

6.2.3. 标签和标签选择器

您可以通过分配它们标签来组织资源,例如记录其位置、硬件类型或目的。Red Hat Edge Manager 标签遵循与 Kubernetes 标签和标签选择器相同的语法、原则和运算符。您可以在查看设备清单或将操作应用到设备时选择带有标签的设备。

标签采用 key=value 格式。您可以使用密钥对设备进行分组。例如,如果您的标签遵循 site=<location& gt; 命名约定,您可以根据站点对设备进行分组。您还可以使用仅包含键的标签。

标签必须遵循以下规则才能有效:

  • 键和值必须是 63 个字符或更少。
  • 键和值可由字母数字字符组成(a-zA-Z0-9)。
  • 键和值也可以包含短划线(-)、下划线(_)、句点(.),但不能包含第一个或最后一个字符。
  • 值可以被省略。

您可以使用以下方法将标签应用到设备:

  • 在镜像构建期间定义一组默认标签,在部署过程中自动应用到所有设备。
  • 在注册期间分配初始标签。
  • 在注册后分配标签。

标记资源时,您可以通过创建标签选择器来选择设备子集。标签选择器是一个以逗号分隔的标签列表,用于选择具有相同标签的设备集。

请参见以下示例:

标签选择器示例选择的设备

site=factory-berlin

具有 站点 标签键和 factory-berlin 标签值的所有设备。

site!=factory-berlin

具有 站点 标签键的所有设备,但标签值不是 factory-berlin

网站(factory-berlin,factory-madrid)

具有 站点 标签键的所有设备以及标签值都是 factory-berlinfactory-madrid

如需有关标签和选择器的更多信息,请参阅 Kubernetes 文档中的 标签和选择器

6.2.3.1. 在 Web UI 中查看设备及其标签

在 Web UI 中查看设备及其关联的标签。您可以使用标签来组织设备和设备群。

完成以下步骤:

  1. 在导航面板中,选择 Application LinksEdge Manager。这会打开 external Edge Manager 实例。
  2. 在导航面板中,选择 Devices
  3. 选择您要管理的设备。在 Details 选项卡中,您可以在 Labels 下查看关联的标签。
6.2.3.2. 在 CLI 中查看设备及其标签

查看设备及其关联的标签。您可以使用标签来组织设备和设备群。

完成以下步骤:

流程

  1. 使用 -o wide 选项查看清单中的设备及其标签:

    flightctl get devices -o wide
    Copy to Clipboard

    请参见以下示例输出:

    NAME            ALIAS    OWNER   SYSTEM  UPDATED     APPLICATIONS  LAST SEEN      LABELS
    <device1_name>  <none>   <none>  Online  Up-to-date  <none>        3 seconds ago  region=eu-west-1,site=factory-berlin
    <device2_name>  <none>   <none>  Online  Up-to-date  <none>        1 minute ago   region=eu-west-1,site=factory-madrid
    Copy to Clipboard
  2. 使用 -l <key=value > 选项查看清单中的带有特定标签或一组标签的设备:

    flightctl get devices -l site=factory-berlin -o wide
    Copy to Clipboard

    请参见以下示例输出:

    NAME            ALIAS    OWNER   SYSTEM  UPDATED     APPLICATIONS  LAST SEEN      LABELS
    <device1_name>  <none>   <none>  Online  Up-to-date  <none>        3 seconds ago  region=eu-west-1,site=factory-berlin
    Copy to Clipboard
6.2.3.3. 更新 CLI 上的标签

使用 CLI 更新设备上的标签。

完成以下步骤:

流程

  1. 运行以下命令,将设备的当前定义导出到文件中:

    flightctl get device/<device1_name> -o yaml > my_device.yaml
    Copy to Clipboard
  2. 使用您的首选编辑器编辑 my_device.yaml 文件。请参见以下示例:

    apiVersion: flightctl.io/v1alpha1
    kind: Device
    metadata:
      labels:
        some_key: some_value
        some_other_key: some_other_value
      name: <device1_name>
    spec:
    [...]
    Copy to Clipboard
  3. 运行以下命令保存文件并应用更新的设备定义:

    flightctl apply -f my_device.yaml
    Copy to Clipboard
  4. 运行以下示例输出来验证您的更改:

    NAME            ALIAS    OWNER   SYSTEM  UPDATED     APPLICATIONS  LAST SEEN      LABELS
    <device1_name>  <none>   <none>  Online  Up-to-date  <none>        3 minutes ago  some_key=some_value,some_other_key=some_other_value
    <device2_name>  <none>   <none>  Online  Up-to-date  <none>        4 minutes ago  region=eu-west-1,site=factory-madrid
    Copy to Clipboard

6.2.4. 字段选择器

字段选择器根据特定资源字段值过滤 Red Hat Edge Manager 资源列表。它们遵循与 Kubernetes 字段和标签选择器相同的语法、原则和运算符,其他运算符可用于更高级的搜索用例。

6.2.4.1. 支持的字段

Red Hat Edge Manager 资源提供了一组您可以选择的元数据字段。

每个资源支持以下元数据字段:

  • metadata.name
  • metadata.owner
  • metadata.creationTimestamp
注意

要查询标签,请使用 Label Selectors 进行高级且灵活的标签过滤。

如需更多信息,请参阅 标签和标签选择器

6.2.4.2. 其他支持的字段列表

除了元数据字段外,每个资源都有自己的唯一字段集合,您可以根据特定于资源的属性对过滤和选择提供更大的灵活性。

下表列出了为每个资源类型过滤支持的字段:

Kind字段

证书签名请求

status.certificate

device

status.summary.status

status.applicationsSummary.status

status.updated.status

status.lastSeen

status.lifecycle.status

注册请求

status.approval.approved

status.certificate

fleet

spec.template.spec.os.image

软件仓库

spec.type

spec.url

资源同步

spec.repository

6.2.4.3. 字段发现

有些 Red Hat Edge Manager 资源可能会公开额外的支持字段。您可以使用带有-- field-selector 选项的 flightctl 来发现支持的字段。如果您尝试使用 unsupported 字段,错误消息列出了可用的支持字段。

请参见以下示例:

flightctl get device --field-selector='text'
Copy to Clipboard
Error: listing devices: 400, message: unknown or unsupported selector: unable to resolve selector name "text". Supported selectors are: [metadata.alias metadata.creationTimestamp metadata.name metadata.nameoralias metadata.owner status.applicationsSummary.status status.lastSeen status.summary.status status.updated.status]
Copy to Clipboard

字段 文本 不是用于过滤的有效字段。错误消息提供了可用于 Device 资源的 with -field-selector 的受支持字段列表。

然后,您可以使用其中一个支持的字段:

flightctl get devices --field-selector 'metadata.alias contains cluster'
Copy to Clipboard

metadata.alias 字段使用 包含 运算符进行检查,以查看它是否具有值 cluster

示例 1:按名称退出特定设备

以下命令根据其名称过滤出特定设备:

flightctl get devices --field-selector 'metadata.name!=c3tkb18x9fw32fzx5l556n0p0dracwbl4uiojxu19g2'
Copy to Clipboard

示例 2:按所有者、标签和创建时间戳过滤

此命令检索由 Fleet/pos-fleet 拥有的设备(位于 us 地区),并在 2024 年创建:

flightctl get devices --field-selector 'metadata.owner=Fleet/pos-fleet, metadata.creationTimestamp >= 2024-01-01T00:00:00Z, metadata.creationTimestamp < //2025-01-01T00:00:00Z' -l 'region=us'
Copy to Clipboard

示例 3:按所有者、标签和设备状态过滤

此命令检索 Fleet/pos-fleet 拥有的设备,位于 us 区域,并且 status.updated.statusUnknownOutOfDate

flightctl get devices --field-selector 'metadata.owner=Fleet/pos-fleet, status.updated.status in (Unknown, OutOfDate)' -l 'region=us'
Copy to Clipboard
6.2.4.4. 支持的 Operator
Operator符号描述

Exists

exists

检查字段是否存在

DoesNotExist

!

检查字段是否不存在

等于

=

检查字段是否等于值

DoubleEquals

==

另一种形式的相等检查

NotEquals

!=

检查字段是否不等于值

GreaterThan

>

检查字段是否大于一个值

GreaterThanOrEquals

>=

检查字段是否大于或等于值

LessThan

<

检查字段是否小于一个值

LessThanOrEquals

检查字段是否小于或等于一个值

In

in

检查字段是否位于值列表中

NotIn

NotIn

检查字段是否不在值列表中

contains

contains

检查字段是否有值

NotContains

notcontains

检查字段是否包含值

6.2.4.4.1. 根据字段类型的 Operator 使用

每个字段类型支持特定的 Operator 子集:

字段类型支持的 Operatorvalue

字符串

等于 :如果字段值与指定字符串完全匹配,则匹配。

DoubleEquals :如果字段值与指定字符串完全匹配(如 Equals)完全匹配。

NotEquals :如果字段值与指定字符串不匹配,则匹配。

中:如果字段值与列表中至少一个字符串匹配,则匹配。

NotIn: 匹配,如果字段值与列表中的任何字符串都不匹配。

包含 :如果字段值具有指定的子字符串,则匹配。

NotContains :如果字段值不包含指定的子字符串,则匹配。

存在: 如果字段存在,则匹配。

DoesNotExist: 如果字段不存在,则匹配。

文本字符串

timestamp

等于 :如果字段值与指定时间戳完全匹配,则匹配。

DoubleEquals :如果字段值与指定时间戳完全匹配(如 Equals)完全匹配。

NotEquals :如果字段值与指定时间戳不匹配,则匹配。

GreaterThan :如果字段值位于指定时间戳后,则匹配。

GreaterThanOrEquals: Matches (如果字段值之后或等于指定的时间戳)。

LessThan: 如果字段值位于指定时间戳之前,则匹配。

LessThanOrEquals :如果字段值早于或等于指定时间戳,则匹配。

中:如果字段值在列表中至少匹配一个时间戳,则匹配。

NotIn: 匹配,如果字段值与列表中的任何时间戳不匹配。

存在: 如果字段存在,则匹配。

DoesNotExist: 如果字段不存在,则匹配。

RFC 3339 格式

number

等于 :如果字段值等于指定数字,则匹配。

DoubleEquals :如果字段值等于指定号(与 Equals)相等,则匹配。

NotEquals :如果字段值不等于指定数字,则匹配。

GreaterThan :如果字段值大于指定数量,则匹配。

GreaterThanOrEquals: Matches (如果字段值大于或等于指定数目)。

lessThan: 匹配字段值小于指定数量。

less ThanOrEquals :如果字段值小于或等于指定号,则匹配。

中:如果字段值在列表中至少等于一个数字,则匹配。

NotIn: 匹配,如果字段值不等于列表中的任何数字。

如果存在 字段,如果存在 :Matches。

DoesNotExist: 如果字段不存在,则匹配。

数字格式

布尔值

等于 :如果值为 truefalse,则匹配。

DoubleEquals :如果值为 truefalse (与 Equals的原生)则匹配。

NotEquals :如果值与指定的值相反,则匹配。

中:如果值(truefalse)位于列表中,则匹配。

注意

该列表只能包含 truefalse,因此这个 Operator 被限制在使用中。

NotIn :如果值不在列表中,则匹配。

存在: 如果字段存在,则匹配。

DoesNotExist: 如果字段不存在,则匹配。

布尔值格式(truefalse)

数组

包含: 匹配,如果数组具有指定的值。

NotContains :如果数组不包含指定的值,则匹配。 中:如果数组与指定的值重叠,则匹配。

NotIn: 如果数组没有与指定的值重叠,则匹配。存在: 如果字段存在,则匹配。

如果字段不存在,则 DoesNotExist:Matches。

注意

使用 Array[Index] 将元素视为为数组元素定义的类型。例如字符串、时间戳、数字或布尔值。

数组元素

6.3. 更新操作系统

您可以通过更新设备规格中的目标操作系统镜像名称或版本来更新设备的操作系统。当代理与服务器通信时,代理会检测到请求的更新。然后,代理会自动在后台下载和验证新操作系统版本。Red Hat Edge Manager 代理会调度根据更新策略执行的实际系统更新。在调度的更新时间,代理会在不中断当前运行的操作系统的情况下安装新版本。最后,设备会重启到新版本。

Red Hat Edge Manager 目前支持以下镜像类型和镜像引用格式:

镜像类型镜像参考

bootc

对容器 registry 的 OCI 镜像引用。示例: quay.io/flightctl-example/rhel:9.5

在此过程中,代理会向服务发送状态更新。您可以通过查看设备状态来检查更新过程。

如需更多信息,请参阅查看 设备

6.3.1. 在 CLI 上更新操作系统

使用 CLI 更新设备。

完成以下步骤:

流程

  1. 运行以下命令,获取设备的当前资源清单:

    flightctl get device/<device_name> -o yaml > my_device.yaml
    Copy to Clipboard
  2. 编辑 Device 资源,以指定新的操作系统名称和版本目标。

    apiVersion: flightctl.io/v1alpha1
    kind: Device
    metadata:
      name: <device_name>
    spec:
    [...]
      os:
        image: quay.io/flightctl/rhel:9.5
    [...]
    Copy to Clipboard
  3. 运行以下命令来应用更新的 Device 资源:

    flightctl apply -f <device_name>.yaml
    Copy to Clipboard

6.4. 边缘设备的操作系统配置

您可以在镜像中包括操作系统级别的主机配置,以获得最大一致性和可重复性。要更新配置,请创建新的操作系统镜像并使用新镜像更新设备。

但是,在以下情况下,使用新镜像更新设备可能不太现实:

  • 镜像中缺少配置。
  • 配置需要特定于设备。
  • 配置需要在运行时进行更新,而无需更新操作系统镜像并重新引导。

对于这些情况,您可以声明设备文件系统上存在的一组配置文件。Red Hat Edge Manager 代理对配置文件应用更新,同时确保所有文件在文件系统中成功更新,或者回滚到其预更新状态。如果用户同时更新一组设备,Red Hat Edge Manager 代理会首先更新操作系统。然后,它会应用指定的一组配置文件。

您还可以指定 Red Hat Edge Manager 代理按顺序应用的配置设置列表。如果发生冲突,则最后应用的配置设置有效。

重要

在 Red Hat Edge Manager 代理更新磁盘上的配置后,运行的应用程序需要将新配置重新加载到内存中才能使配置生效。如果更新涉及重启,systemd 会自动使用新配置以及正确顺序重启应用程序。如果更新不涉及重新启动,则许多应用可以检测对其配置文件的更改并自动重新载入文件。当应用程序不支持更改检测时,您可以使用设备生命周期 hook 在满足特定条件时运行脚本或命令。

6.4.1. 配置供应商

您可以在 Red Hat Edge Manager 中,从多个源(称为配置供应商)提供配置。Red Hat Edge Manager 目前支持以下配置供应商:

Git 配置提供程序
从 Git 存储库获取设备配置文件。
Kubernetes Secret Provider
从 Kubernetes 集群获取 secret,并将内容写入设备的文件系统。
HTTP 配置提供程序
从 HTTP (S)端点获取设备配置文件。
内联配置提供程序
允许在设备清单中指定内联设备配置文件,而不查询外部系统。

在以下部分了解更多有关配置供应商的信息:

6.4.1.1. 从 Git 存储库配置

您可以将设备配置存储在 Git 存储库中,如 GitHub 或 GitLab。然后,您可以添加 Git Config Provider,以便 Red Hat Edge Manager 将配置从存储库同步到设备的文件系统。

Git Config Provider 使用以下参数:

参数

描述

软件仓库

Red Hat Edge Manager 中定义的 Repository 资源的名称。

targetRevision

要签出的存储库的分支、标签或提交。

路径

存储库中目录的绝对路径,从中文件和子目录同步到设备的文件系统。Path 目录对应于设备上的根目录(/),除非您指定了 MountPath 参数。

MountPath

可选。设备文件系统中目录的绝对路径,将存储库的内容写入到其中。默认情况下,该值是文件系统 root (/)。

Repository 资源定义 Git 存储库、协议和 Red Hat Edge Manager 必须使用的访问凭证。您只需要设置存储库一次。设置后,您可以使用存储库配置单个设备或设备群。

6.4.1.2. Kubernetes 集群中的 secret

Red Hat Edge Manager 只能查询 Red Hat Edge Manager 在 Kubernetes secret 上运行的 Kubernetes 集群。您可以将该 secret 的内容写入设备文件系统上的路径。

Kubernetes Secret Provider 使用以下参数:

参数

描述

Name

secret 的名称。

Namespace

secret 的命名空间。

MountPath

将 secret 内容写入到的设备文件系统中。

注意

Red Hat Edge Manager 需要权限访问定义的命名空间中的 secret。例如,创建 ClusterRoleClusterRoleBinding 允许 flightctl-worker 服务帐户获取并列出该命名空间中的 secret。

6.4.1.3. 从 HTTP 服务器配置

Red Hat Edge Manager 可以查询 HTTP 服务器以进行配置。HTTP 服务器可以为设备提供静态或动态生成的配置。

HTTP 配置提供程序使用以下参数:

参数

描述

软件仓库

Red Hat Edge Manager 中定义的 Repository 资源的名称。

Suffix

附加到 Repository 资源中定义的基本 URL 的后缀。后缀可以包含 path 和查询参数,如 /path/to/endpoint?query=param

filepath

设备文件系统中文件的绝对路径,将 HTTP 服务器响应写入。

Repository 资源指定要连接的 Red Hat Edge Manager 的 HTTP 服务器,以及要使用的协议和访问凭证。您必须设置存储库需要一次,然后使用存储库配置多个设备或设备群。

6.4.1.4. 设备规格中内联的配置

您可以在设备规格中内联指定配置。当您使用内联设备规格时,Red Hat Edge Manager 不需要连接到外部系统来获取配置。

Inline Config Provider 采用文件规格列表,每个文件规格采用以下参数:

参数

描述

路径

要写入内容的设备文件系统中文件的绝对路径。如果文件已存在于指定路径中,则该文件会被覆盖。

内容

文件的 UTF-8 或 base64 编码内容。

ContentEncoding

定义如何编码内容。必须是 plainbase64。默认值为 plain

模式

可选。文件的权限模式。您可以使用前导零指定八进制数,例如 0644,或者指定为没有前导零的十进制,如 420。支持 setuidsetgidsticky 位。如果没有指定,则文件的权限模式默认为 0644

用户

可选。文件的所有者。指定为名称或数字 ID。默认值为 root

可选。文件的组。指定为名称或数字 ID。

其他资源

  • 有关设备生命周期 hook 以及 Red Hat Edge Manager 代理使用的默认规则的更多信息,请参阅 使用设备生命周期 hook

6.4.2. 从 CLI 上的 Git 存储库管理设备配置

在 Git 存储库中创建并应用设备配置。

完成以下步骤:

流程

  1. 创建一个文件,如 site-settings-repo.yaml,其中包含名为 site-settingsRepository 资源的以下定义:

    apiVersion: flightctl.io/v1alpha1
    kind: Repository
    metadata:
      name: site-settings
    spec:
      type: git
      url: https://github.com/<your_org>/<your_repo>.git
    Copy to Clipboard
  2. 运行以下命令来创建 Repository 资源:

    flightctl apply -f site-settings-repo.yaml
    Copy to Clipboard
  3. 运行以下命令,验证资源是否已正确创建,并可以被 Red Hat Edge Manager 访问:

    flightctl get repository/site-settings
    Copy to Clipboard

    请参见以下示例输出:

    NAME           TYPE  REPOSITORY URL                                 ACCESSIBLE
    site-settings  git   https://github.com/<your_org>/<your_repo>.git  True
    Copy to Clipboard
  4. 通过更新设备规格将 example-site 配置应用到设备:

    apiVersion: flightctl.io/v1alpha1
    kind: Device
    metadata:
      name: <device_name>
    spec:
    [...]
      config: 
    1
    
      - name: example-site
        configType: GitConfigProviderSpec
        gitRef:
          repository: site-settings
          targetRevision: production
          path: /etc/example-site 
    2
    
    [...]
    Copy to Clipboard
    1
    示例配置从 site-settings 存储库的 production 分支中获取 example-site 目录中的所有文件,并将文件放置在根目录(/)中。
    2
    通过创建目录结构来确保目标路径可写入。根目录(/)在 bootc 系统中不可写入。

6.5. 使用设备生命周期 hook

Red Hat Edge Manager 代理可以使用设备生命周期 hook 在设备生命周期的特定点运行用户定义的命令。例如,您可以在操作系统镜像中添加 shell 脚本,以备份应用程序数据。然后,您可以指定该脚本必须成功运行并成功完成,然后才能代理开始更新操作系统。

另外,当磁盘上的文件发生变化时,某些应用程序或系统服务不会自动重新载入其配置文件。您可以将命令指定为另一个 hook (在代理完成更新过程后调用)来手动重新载入配置文件。

支持以下设备生命周期 hook:

生命周期 Hook描述

beforeUpdating

在代理准备更新并在实际更改系统之前,会调用此 hook。如果此 hook 中的操作返回失败,代理会取消更新。

afterUpdating

代理将更新写入到磁盘后,会调用此 hook。如果此 hook 中的操作返回失败,代理会取消并回滚更新。

beforeRebooting

在系统重启前会调用此 hook。代理会阻止重启,直到运行操作完成或超时为止。如果此 hook 中的任何操作返回失败,代理会取消并回滚更新。

afterRebooting

当代理重启后首先启动时,会调用此 hook。如果此 hook 中的任何操作返回失败,代理会报告这个信息,但将继续启动。

6.5.1. 规则文件

您可以通过在设备文件系统中的以下位置之一中添加规则文件来定义设备生命周期 hook:

  • /usr/lib/flightctl/hooks.d/<lifecycle_hook_name&gt;/ drop-in 目录中的规则是只读的。要向 /usr 目录添加规则,您必须在镜像构建过程中将它们添加到操作系统镜像中。
  • /etc/flightctl/hooks.d/<lifecycle_hook_name>/ drop-in 目录中的规则是 read-writable。您可以使用多种方法在运行时更新规则。

在创建并放置文件时,您必须考虑以下实践:

  • 规则的名称必须是所有小写。
  • 如果您在两个位置定义了规则,则规则将合并。
  • 如果您在生命周期 hook 目录中添加多个规则文件,则会按照文件名的字典顺序处理这些文件。
  • 如果您在两个位置定义了具有相同文件名的文件,/etc 文件夹中的文件优先于 /usr 文件夹中同名的文件。

规则文件以 YAML 格式编写,具有一个或多个操作的列表。操作可以是运行外部命令的指令。

当您为 hook 指定很多操作时,会按顺序执行操作,然后再开始下一个操作。

如果某个操作返回失败,则会跳过以下操作。

run 操作采用以下参数:

参数

描述

运行

要运行的命令的绝对路径,后跟任何标志或参数,如 /usr/bin/nmcli 连接重新加载。命令不会在 shell 中执行,因此您无法使用 shell 变量,如 $PATH$HOME,或链命令,如 |;。如果需要,您可以通过将 shell 指定为要运行的命令来启动 shell,例如 /usr/bin/bash -c 'echo $SHELL $HOME $USER'

EnvVars

可选。键值对列表,以设置为命令的环境变量。

WORKDIR

可选。命令从其中运行该命令的目录。

Timeout(超时)

可选。允许操作完成的最长时间。将持续时间指定为单个正整数,后跟一个时间单位。支持 smh 单元(秒、分钟和小时)。

如果

可选。运行该操作需要满足的条件列表。如果没有提供,则操作将无条件地运行。

默认情况下,系统会在每次触发 hook 时执行操作。但是,对于在更新 hook 后,您可以使用 If 参数添加执行某个操作必须满足 true 的条件。否则,会跳过该操作。

例如,只有在更新期间给定文件或目录更改时才会运行操作,您可以定义采用以下参数的路径条件:

参数

描述

作业类型

到必须在更新期间更改的文件或目录的绝对路径,作为要执行的操作的条件。使用正斜杠(/)指定路径:

  • 如果路径指向某个目录,它必须以正斜杠(/)结尾。
  • 如果指定了到文件的路径,则该文件必须已更改为满足条件
  • 如果您指定了目录的路径,则该目录或任何子目录中的文件必须已更改为满足条件

op

文件操作列表,如创建更新和删除 的,以限制执行该操作的条件对指定路径的更改。

如果您在 更新 hook 后 为操作指定路径条件,您可以在命令的参数中包含以下变量,并替换为更改文件的绝对路径:

变量

描述

${ Path }

路径条件中指定的文件或目录的绝对路径。

${ files }

在更新过程中更改的文件的空格分隔列表,由路径条件涵盖。

${ CreatedFiles }

在更新期间创建的文件的空格分隔列表,由路径条件涵盖。

${ UpdatedFiles }

在更新过程中更新的文件的绝对路径以空格分隔,由路径条件涵盖。

${ RemovedFiles }

在更新过程中删除的文件的空格分隔列表,由路径条件涵盖。

Red Hat Edge Manager 代理包含 /usr/lib/flightctl/hooks.d/afterupdating/00-default.yaml 中定义的一组内置规则。如果更改了某些文件,则执行以下命令:

File

命令

描述

/etc/systemd/system/

systemctl daemon-reload

通过向 systemd 守护进程重新载入 systemd 管理器配置激活对 systemd 单元的更改。这会重新运行所有生成器,重新载入所有单元文件,并重新创建整个依赖项树。

/etc/NetworkManager/system-connections/

nmcli conn reload

NetworkManager 系统连接的更改是通过向 NetworkManager 守护进程重新加载所有连接激活的。如需更多信息,请参阅附加资源部分

/etc/firewalld/

firewall-cmd --reload

firewalld 的永久配置的更改是通过信号 firewalld 以重新加载防火墙规则作为新的运行时配置来激活。

其他资源

6.6. 监控设备资源

您可以为设备资源设置监控器,并在使用这些资源超过定义的阈值时定义警报。当代理警告 Red Hat Edge Manager 服务时,该服务会将设备状态设置为 "degraded" 或 "error" (取决于严重性级别)。

资源监控器使用以下参数:

参数描述

MonitorType

要监控的资源。目前支持的资源包括 "CPU"、"Memory" 和 "Disk"。

SamplingInterval

monitor 样本使用的时间间隔,指定为正整数,后跟一个时间单位("s" (秒)、"m"表示分钟,"h"表示小时)。

AlertRules

警报规则列表。

路径

(仅限磁盘监控)要监控的目录的绝对路径。使用率反映了包含路径的文件系统,类似于 df,即使它不是挂载点。

警报规则采用以下参数:

参数描述

重要性

警报规则的严重性级别为 "Info", "Warning", 或 "Critical"。每个严重性级别只允许一个警报规则。

Duration

资源使用的持续时间在抽样时测量和平均值,超过正整数,后跟一个时间单位("s" (以秒为单位),"m"表示分钟,"h"表示小时)。它必须小于抽样间隔。

百分比

触发警报的使用阈值,以百分比值(基于 0 到 100,没有 "%" 符号)。

描述

警报的人类可读描述。这可用于添加有助于调试的警报的详细信息。默认情况下,它会填充警报,超过 : load 为高于 >%。

6.6.1. 监控 CLI 上的设备资源

通过 CLI 监控设备的资源,为您提供跟踪性能并排除问题的工具和命令。

流程

  • 在设备规格的 resources: 部分添加资源监控器。

例如,为您的磁盘添加以下监控器:

apiVersion: flightctl.io/v1alpha1
kind: Device
metadata:
  name: <device_name>
spec:
[...]
  resources:
  - monitorType: Disk
    samplingInterval: 5s 
1

    path: /application_data 
2

    alertRules:
    - severity: Warning 
3

      duration: 30m
      percentage: 75
      description: Disk space for application data is >75% full for over 30m.
    - severity: Critical 
4

      duration: 10m
      percentage: 90
      description: Disk space for application data is >90% full over 10m.
[...]
Copy to Clipboard
1
每 5 秒进行样本使用。
2
检查与 /applications_data 路径关联的文件系统上的磁盘用量。
3
如果平均用量超过 30 分钟,则启动警告。
4
如果平均使用量超过 90% 超过 10 分钟,则启动一个关键警报。

第 7 章 在边缘设备上管理应用程序

您可以通过更新设备规格中的应用程序列表来部署、更新或删除设备上的应用程序。当 Red Hat Edge Manager 代理检查并检测规格中的更改时,代理会从开放容器项目(OCI)兼容 registry 中下载任何新的或更新的应用程序软件包和镜像。然后,代理将软件包部署到适当的应用程序运行时,或从该运行时中删除它们。

Red Hat Edge Manager 支持 podman-compose 工具作为应用程序运行时和格式。

先决条件

  • 您必须安装 Red Hat Edge Manager CLI。
  • 您必须登录到 Red Hat Edge Manager 服务。
  • 您的设备必须安装有 podman-compose 工具来运行操作系统镜像。

如需更多信息,请参阅 构建 bootc 操作系统镜像以用于 Red Hat Edge Manager

7.1. 构建应用程序软件包镜像

Red Hat Edge Manager 可以从兼容开放容器项目(OCI)的 registry 下载应用程序软件包。您可以构建包含 podman-compose 格式的应用程序软件包的 OCI 容器镜像,并将镜像推送到 OCI registry。

完成以下步骤:

流程

  1. 在名为 podman-compose.yaml 的文件中定义应用程序的功能,它遵循 Podman Compose 规格:

    • 使用以下内容创建一个名为 Containerfile 的文件:

      FROM scratch 
      1
      
      COPY podman-compose.yaml /podman-compose.yaml
      LABEL appType="compose" 
      2
      Copy to Clipboard
      1
      全新 容器中嵌入 compose 文件。
      2
      添加 appType=compose 标签。
  2. 构建容器镜像并将其推送到 OCI registry:

    1. 运行以下命令,定义您具有写入权限的镜像存储库:

      OCI_IMAGE_REPO=quai.io/<your_org>/<your_image>
      Copy to Clipboard
    2. 运行以下命令来定义镜像标签:

      OCI_IMAGE_TAG=v1
      Copy to Clipboard
    3. 运行以下命令来构建应用程序容器镜像:

      podman build -t ${OCI_IMAGE_REPO}:${OCI_IMAGE_TAG} .
      Copy to Clipboard
    4. 运行以下命令来推送容器镜像:

      podman push ${OCI_IMAGE_REPO}:${OCI_IMAGE_TAG} .
      Copy to Clipboard

7.2. 指定设备规格中内联的应用程序

应用程序清单在设备的规格中内联指定,因此您不需要构建 OCI registry 应用程序软件包。

内联应用程序供应商接受带有以下参数的应用程序内容列表:

参数

描述

路径

到该设备中的文件的相对路径。请注意,任何现有的文件都会被覆盖。

内容(可选)

文件的纯文本(UTF-8)或 base64 编码内容。

ContentEncoding

内容是如何编码的。必须是 "plain" 或 "base64"。默认值为"plain"。

Example

apiVersion: flightctl.io/v1alpha1
kind: Device
metadata:
  name: some_device_name
spec:
[...]
  applications:
    - name: my-app
      appType: compose
      inline:
        - content: |
            version: "3.8"
            services:
              service1:
                image:  quay.io/flightctl-tests/alpine:v1
                command: ["sleep", "infinity"]
          path: podman-compose.yaml
[...]
Copy to Clipboard

注意

内联 compose 应用程序最多可以有两个路径。您必须将第一个 podman-compose.yaml 命名为 podman-compose.yaml,第二个(override) podman-compose.override.yaml

7.3. 使用 CLI 将应用程序部署到设备

使用 CLI 从 OCI 注册表将应用程序软件包部署到设备。

完成以下步骤:

流程

  1. Device 资源的 spec.applications 字段中指定要部署的应用程序软件包:

    apiVersion: flightctl.io/v1alpha1
    kind: Device
    metadata:
      name: <device_name>
    spec:
    [...]
      applications:
      - name: wordpress 
    1
    
        image: quay.io/rhem-demos/wordpress-app:latest 
    2
    
        envVars: 
    3
    
          WORDPRESS_DB_HOST: <database_host>
          WORDPRESS_DB_USER: <user_name>
          WORDPRESS_DB_PASSWORD: <password>
    [...]
    Copy to Clipboard
    1
    Web 控制台和 CLI 列表应用时使用的应用程序用户定义的名称。
    2
    对 OCI registry 中的应用程序软件包的引用。
    3
    可选。键值对列表,作为环境变量或命令行标志传递给部署工具。
    注意

    对于设备规格 的应用程序 部分中的每个应用程序,您可以找到对应的设备状态信息。

  2. 运行以下命令,检查设备状态信息,验证设备上的应用程序部署的状态:

    flightctl get device/<your_device_id> -o yaml
    Copy to Clipboard

    请参见以下示例输出:

    [...]
    spec:
      applications:
      - name: example-app
        image: quay.io/flightctl-demos/example-app:v1
    status:
      applications:
      - name: example-app
        ready: 3/3
        restarts: 0
        status: Running
      applicationsSummary:
        info: All application workloads are healthy.
        status: Healthy
    [...]
    Copy to Clipboard

第 8 章 设备团队

Red Hat Edge Manager 通过 设备群 简化了大量设备和工作负载的管理。fleet 是一个资源,它定义由通用设备模板和管理策略管理的一组设备。

当您更改设备模板时,当 Red Hat Edge Manager 代理检测到新目标规格时,团队中的所有设备都会接收更改。

团队中的设备监控也已被简化,因为您可以检查整个团队的状态概述。

群级管理具有以下优点:

  • 扩展操作,因为您只需要为每个团队执行一次操作,而不是对每个设备执行一次操作。
  • 尽可能减少配置错误和配置偏移的风险。
  • 当您将设备添加到团队中的团队或替换设备时,会自动应用目标配置。fleet 规格由以下功能组成:

    标签选择器
    确定哪个设备是该团队的一部分。
    设备模板
    定义 Red Hat Edge Manager 在团队中的设备强制执行的配置。
    策略(policy)
    监管设备的管理方式,例如,如何将对设备模板的更改应用到设备。

您可以同时单独管理和管理的设备。

当您选择设备作为团队时,Red Hat Edge Manager 根据设备模板为新设备创建设备规格。如果您更新一个团队或新设备的设备模板,Red Hat Edge Manager 会在团队中强制实施新规格。

如果没有选择设备到任何群,则该设备被视为用户管理或非受管设备。对于用户管理的设备,您必须手动或通过外部自动化更新设备规格。

重要

设备不能是同时多个团队的成员。

如需更多信息,请参阅 标签和标签选择器

8.1. 设备选择为一个团队

默认情况下,设备不会被分配给一个机。相反,每个团队都使用一个选择器来定义必须将设备添加到团队中的标签。

要了解如何在一个团队中使用标签,请参阅以下示例。

以下列表显示了销售终端设备及其标签点:

设备

标签

A

Type: pos-terminal,region: east,stage: production

B

Type: pos-terminal,region: east,stage: development

C

Type: pos-terminal,region: west,stage: production

D

Type: pos-terminal,region: west,stage: development

如果所有销售点终端都使用相同的配置,并由同一运维团队管理,您可以使用 type=pos-terminal 标签选择器定义一个名为 pos-terminals 的团队。然后,团队包含设备 A、B、C 和 D。

但是,您可能希望为不同机构为开发或生产创建单独的团队。您可以使用 type=pos-terminal、stage=development 标签选择器(选择设备 C 和 D)定义开发团队。然后,您可以使用 type=pos-terminal, stage=production 标签选择器为 production 定义另一个团队。通过使用正确的标签选择器,您可以独立管理这两个团队。

重要

您必须以两个团队不要选择同一设备的方式定义选择器。例如,如果一个 fleet 选择 region=east,另一个 fleet 选择 stage=production,则两个团队都尝试选择设备 A。如果两个团队试图选择同一设备,Red Hat Edge Manager 会在当前分配的 fleet 中保留设备(如果有),并在受影响的 fleet 上将 OverlappingSelectors 条件设置为 true

8.2. 设备模板

团队的设备模板包含一个设备规格,在模板更新时应用于该团队中的所有设备。

例如,您可以在团队中的所有设备模板中指定,必须运行 quay.io/flightctl/rhel:9.5 操作系统镜像。

然后,Red Hat Edge Manager 服务将目标规格部署到团队中的所有设备,Red Hat Edge Manager 代理会更新每个设备。

您可以更改设备模板中的其他规格项目,Red Hat Edge Manager 会以同样的方式应用更改。

但是,有时不是该团队中的所有设备都需要有完全相同的规格。Red Hat Edge Manager 允许模板包含基于设备名称或标签值填充的占位符。

占位符的语法与 Go 模板 的语法匹配。但是,您只能使用简单的文本和操作。

不支持在占位符中使用条件或循环。

您可以从设备的元数据引用任何内容,如 {{ .metadata.labels.key }}{{ .metadata.name }}

您还可以在占位符中使用以下功能:

  • 大写 的功能会将值更改为大写。例如,函数是 {{ upper .metadata.name }}
  • 较低 函数将值改为小写。例如,函数为 {{ lower .metadata.labels.key }}
  • replace 函数将所有子字符串出现的所有替换为另一个字符串。例如,函数是 {{ replace "old" "new" .metadata.labels.key }}
  • 如果访问缺少的标签,getOrDefault 函数会返回一个默认值。例如,函数是 {{ getOrDefault .metadata.labels "key" "default" }}。您可以组合管道中的功能,例如: combined 函数为 {{ getOrDefault .metadata.labels "key" "default" | upper | replace " "-" }}
注意

确保您使用正确的 Go 模板语法。例如,{{ .metadata.labels.target-revision }} 无效,因为连字符。相反,您必须将字段指代为 {{ index .metadata.labels "target-revision" }}

您可以使用以下方法在设备模板中使用占位符:

  • 您可以按部署阶段标记设备,例如: stage 标签是 stage: testingstage: production。然后,您可以在引用要使用的操作系统镜像时将标签与 stage 键用作占位符,例如,使用 quay.io/myorg/myimage:latest-{{ .metadata.labels.stage }},或在引用 Git 存储库中的配置文件夹时。
  • 您可以通过部署站点标记设备,例如部署站点为 site: factory-berlinsite: factory-madrid
  • 然后,当使用 Kubernetes 中的网络访问凭证引用 secret 时,您可以将标签与 站点 键一起使用。设备模板中的以下字段支持占位符:

    字段

    支持的占位符

    操作系统镜像

    仓库名称、镜像名称、镜像标签

    Git 配置提供程序

    目标修订,path

    HTTP 配置提供程序

    URL 后缀、路径

    内联配置提供程序

    内容,路径

8.3. 在 Web UI 上将设备添加到团队中

定义标签选择器,在 web UI 上将设备添加到团队中。

完成以下任务:

流程

  1. 在导航面板中,选择 Application LinksEdge Manager。这会打开 external Edge Manager 实例。
  2. 在导航面板中,选择 Fleets。选择您要添加设备的 fleet。
  3. Actions,再选择 Edit fleet
  4. General info 选项卡中,点 Device selector 选项下的 Add label
  5. 添加标签以为您的团队选择设备。任何具有该标签的设备都会被添加到团队中。

8.4. 在 CLI 上将设备添加到团队中

定义标签选择器,将设备添加到团队中。

完成以下任务:

流程

  1. 运行以下命令,以验证标签选择器是否返回您要添加到团队中的设备:

    flightctl get devices -l type=pos-terminal -l stage=development
    Copy to Clipboard
  2. 如果运行命令返回预期的设备列表,您可以使用以下 YAML 文件定义一个选择设备的 fleet :

    apiVersion: flightctl.io/v1alpha1
    kind: Fleet
    metadata:
      name: my_fleet
    spec:
      selector:
        matchLabels:
          type: pos-terminal
          stage: development
    [...]
    Copy to Clipboard
  3. 运行以下命令来应用更改:

    flightctl apply -f my_fleet.yaml
    Copy to Clipboard
  4. 运行以下命令,检查与其他团队选择器的重叠:

    flightctl get fleets/my_fleet -o json | jq -r '.status.conditions[] | select(.type=="OverlappingSelectors").status'
    Copy to Clipboard

    请参见以下示例输出:

    False
    Copy to Clipboard

8.5. 推出设备选择

当使用 flightctl 执行推出部署时,您必须管理哪些设备参与推出部署以及可以接受的中断量。设备选择过程和推出中断预算概念可确保控制和可预测的推出部署。

在推出部署的过程中选择设备的流程和配置包括目标策略、批处理排序以及控制软件部署的成功标准。

8.5.1. 设备目标

rollout 仅适用于属于一个团队的设备。每个设备只能属于单个机。由于推出定义在团队级别完成,因此选择过程会根据标签标准决定团队内哪些设备参与批量推出部署。处理所有批处理后,所有团队设备都会推出。

  • 标签 :具有特定元数据标签的设备可用于推出部署。
  • fleet membership: Rollouts 仅适用于指定团队中的设备。

8.5.2. 设备选择策略

Red Hat Edge Manager 仅支持 BatchSequence 策略进行设备选择。此策略定义了根据特定标准在批处理中添加设备的步骤推出部署的过程。批处理是按顺序执行的。在每个批处理完成后,只有在上一个批处理的成功率满足或超过配置的成功阈值时,执行才会进入下一个批处理。

成功率由以下决定:

# of successful rollouts in the batch / # of devices in the batch >= success threshold
Copy to Clipboard

在批处理序列中,最终批处理是一个隐式批处理,未在批处理序列中指定。它选择已由序列中的显式批处理选择的团队中的所有设备。

8.5.3. 设备选择中的限制

BatchSequence 策略中的每个批处理都可以使用可选的 limit 参数来定义批处理中应包含多少个设备。您可以通过两种方式指定限制:

  • 绝对数字 :要选择的设备的固定数量。
  • 百分比 :要选择匹配的设备填充的百分比。

    • 如果您使用标签提供 选择器,则根据与团队中的标签标准匹配的设备数量来计算百分比。
    • 如果没有提供 选择器,则百分比将应用到该团队中的所有设备。

8.5.4. 成功阈值

successThreshold 定义继续推出部署所需的成功更新设备的百分比。如果成功率低于这个阈值,则推出部署可能会暂停,以防止进一步失败。

Example

下面显示了一个团队规格的 YAML 配置示例:

apiVersion: v1alpha1
kind: Fleet
metadata:
  name: default
spec:
  selector:
    matchLabels:
      fleet: default
  rolloutPolicy:
    deviceSelection:
      strategy: 'BatchSequence'
      sequence:
        - selector:
            matchLabels:
              site: madrid
          limit: 1  # Absolute number
        - selector:
            matchLabels:
              site: madrid
          limit: 80%  # Percentage of devices matching the label criteria within the fleet
        - limit: 50%  # Percentage of all devices in the fleet
        - selector:
            matchLabels:
              site: paris
        - limit: 80%
        - limit: 100%
    successThreshold: 95%
Copy to Clipboard

在本例中,有 6 个显式批处理和 1 个隐式批处理:

  • 第一个批处理选择一个具有标签 site:madrid 的 1 设备。
  • 使用具有标签 site:madrid 的所有设备的第二个批处理 80% 被选择在当前批处理中推出部署,或者之前已选择推出部署。
  • 在当前批处理中,选择第三个批处理 50% 的所有设备,或者之前选择用于推出部署的设备。
  • 在第四个批处理中,所有之前未选择的设备并且标签 site:paris 被选择。
  • 在当前批处理中选择了第五个批处理 80%,或者之前选择用于推出部署的设备。
  • 通过第 6 个批处理,所有设备的 100% 都可在当前批处理中推出部署,或者之前选择用于推出部署的设备。
  • 最后隐式批处理选择任何之前批处理中未选择的所有设备(might 为 none)。

8.6. 推出中断预算

推出中断预算定义了推出期间可接受的服务影响级别。这样可确保部署不会一次性停机太多设备,从而保持整体系统稳定性。

8.6.1. 中断预算参数

  • Group By :定义应用中断预算时如何分组设备。分组通过标签键来完成。
  • minAvailable :指定推出部署期间必须保持的最小设备数。
  • maxUnavailable :限制同时不可用的设备数量。

Example

下面显示了一个团队规格的 YAML 配置示例:

apiVersion: v1alpha1
kind: Fleet
metadata:
  name: default
spec:
  selector:
    matchLabels:
      fleet: default
  rolloutPolicy:
    disruptionBudget:
      groupBy: ['site', 'function']
      minAvailable: 1
      maxUnavailable: 10
Copy to Clipboard

在本例中,分组在 2 个标签键上执行: sitefunction。一个中断预算的组由团队中的所有设备组成,它们具有与前一个标签键相同的标签值。对于每个这样的组,会持续实施此规格中定义的条件。

第 9 章 Red Hat Edge Manager 故障排除

在 Red Hat Edge Manager 中使用设备时,您可能会看到与配置、连接或部署相关的问题。这些问题的故障排除需要了解设备配置是如何应用的,如何检查日志以及如何验证设备和服务之间的通信。

9.1. 查看设备的有效目标配置

flightctl get device 命令返回的设备清单仍只能引用外部配置和 secret 对象。只有设备代理查询服务时,该服务才会将引用替换为实际配置和 secret 数据。虽然这可以更好地保护潜在的敏感数据,但也会导致对故障配置进行故障排除。这就是为什么用户可以授权向代理查询服务呈现的有效配置。

流程

  • 要查询有效的配置,请使用以下命令:

    flightctl get device/${device_name} --rendered | jq
    Copy to Clipboard

9.2. 生成设备日志捆绑包

该设备包含一个脚本,用于生成调试代理所需的日志捆绑包。

流程

  • 在设备上运行以下命令,并在错误报告中包含 .tar 文件。

    注意

    这取决于用于提取 .tar 文件的 SSH 连接。

    sudo flightctl-must-gather
    Copy to Clipboard

法律通告

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat