边缘管理器


Red Hat Advanced Cluster Management for Kubernetes 2.13

了解 Red Hat Advanced Cluster Management 的 Red Hat Edge Manager (技术预览)如何为设备和团队提供可扩展的安全边缘管理。

摘要

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

第 1 章 Red Hat Edge Manager (技术预览)

技术预览: Red Hat Edge Manager 通过声明性方法简化边缘设备和应用程序的管理。

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

通过使用 Red Hat Advanced Cluster Management for Kubernetes 上的 Red Hat Edge Manager,您可以在 Red Hat OpenShift Container Platform 上管理非 Kubernetes 工作负载以及 Red Hat Enterprise Linux 机器上的操作系统配置。

参阅以下主题来了解更多有关在 Red Hat Advanced Cluster Management 上使用 Red Hat Edge Manager 的信息。所有功能都 处于技术预览状态

1.1. 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
  • 服务
  • 基于镜像的操作系统
  • API Server
  • 数据库
  • 设备
  • 设备团队

从以下部分了解更多详情:

1.1.1. Red Hat Edge Manager 代理和服务

Red Hat Edge Manager 代理是在每个受管设备中运行的进程,它定期在 Red Hat Advanced Cluster Management hub 集群中通信 Red Hat Edge Manager 服务。代理负责以下任务:

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

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

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

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

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

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

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

注: 您可以在 Git 中维护团队定义。Red Hat Edge Manager 定期与数据库中的数量定义同步。

1.1.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 证书签名或查询受管设备的配置。

1.1.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 服务信任和管理。

1.1.3.1. 注册方法

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

早期绑定
您可以构建包含注册端点和证书的操作系统镜像。使用早期绑定镜像的设备可以自动连接到定义的 Red Hat Edge Manager 服务来请求注册,而无需依赖于任何置备基础架构。

设备共享相同的长期 X.509 客户端证书。然而,在这种情况下,设备绑定到特定的服务和所有者。

后向绑定
您可以在置备时定义注册端点和证书,而不是将其包含在操作系统镜像中。使用后绑定镜像的设备不绑定到单个所有者或服务,并可具有特定于设备的、简短的 X.509 客户端证书。

但是,后向绑定需要虚拟化或裸机置备基础架构,这些基础架构可以从 Red Hat Edge Manager 服务请求特定于设备的端点和证书,并使用 cloud-initIgnitionkickstart 等机制将其注入置备的系统。

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

1.2. 启用 Red Hat Edge Manager

技术预览: 使 Red Hat Edge Manager 能够大规模管理边缘设备和应用程序。

需要的访问权限:集群管理员

1.2.1. 先决条件

  • 您需要一个 Red Hat Advanced Cluster Management hub 集群。请参阅 安装和升级

MultiClusterHub 资源进行补丁,然后验证是否启用了 Red Hat Edge Manager。完成以下步骤:

  1. 运行以下命令,在 Multiclusterhub 资源中的 spec.overrides.componentsedge-manager-preview 条目中将 enabled 字段设置为 true

    oc patch multiclusterhubs.operator.open-cluster-management.io multiclusterhub -n rhacm --type json --patch '[{"op": "add", "path":"/spec/overrides/components/-", "value": {"name":"edge-manager-preview","enabled": true}}]'
  2. 在 hub 集群中运行以下命令来验证 Red Hat Edge Manager 是否已启用:

    oc -n open-cluster-management get pods | grep flightctl-api

    请参见以下示例输出:

    flightctl-api                    2/2     Running   0             43s

1.2.3. 启用 Red Hat Edge Manager 控制台

在 OpenShift Container Platform web 控制台中启用 Red Hat Edge Manager。完成以下步骤:

  1. 运行以下命令打开控制台进行编辑:

    oc edit console.v1.operator.openshift.io
  2. 通过在 spec.plugins 部分添加 flightctl-plugin 来启用 Red Hat Edge Manager 控制台。

1.2.4. Red Hat Edge Manager 授权

技术预览: Red Hat Edge Manager Kubernetes 授权使用基于角色的访问控制(RBAC)来控制 Red Hat Edge Manager API 端点的授权。

您可以使用 open-cluster-management 命名空间中的以下角色设置 Kubernetes RBAC 授权:

  • 命名空间范围的授权的 RoleRoleBinding
  • 用于集群范围的授权的 ClusterRoleClusterRoleBinding

您可以使用 RoleClusterRole API 对象来定义特定角色允许的 API 资源和操作动词。

RoleBindingClusterRoleBinding API 对象向一个或多个用户授予角色中定义的权限。

如需更多信息,请参阅基于角色的访问控制

1.2.4.1. Red Hat Edge Manager RBAC 角色

Red Hat Edge Manager 有以下默认角色及其权限:

Expand

角色

权限

Resources

flightctl-admin

All

All

flightctl-viewer

获取,list

设备,fleets,resourcesyncs

flightctl-operator

获取,list,create,delete,update,patch

设备,fleets,resourcesyncs

get

devices/console

获取,list

仓库,fleets,templateversions

flightctl-installer

获取,list

enrollmentrequests

POST

enrollmentrequests/approval

获取,list,create

certificatesigningrequests

1.2.4.2. Red Hat Edge Manager 授权资源

下表包含 Red Hat Edge Manager API 端点的路由、名称、资源名称和操作动词:

Expand

Route

Name

资源

Verb

DELETE /api/v1/certificatesigningrequests

DeleteCertificateSigningRequests

certificatesigningrequests

deletecollection

GET /api/v1/certificatesigningrequests

ListCertificateSigningRequests

certificatesigningrequests

list

POST /api/v1/certificatesigningrequests

CreateCertificateSigningRequest

certificatesigningrequests

create

DELETE /api/v1/certificatesigningrequests/{name}

DeleteCertificateSigningRequest

certificatesigningrequests

delete

GET /api/v1/certificatesigningrequests/{name}

ReadCertificateSigningRequest

certificatesigningrequests

get

PATCH /api/v1/certificatesigningrequests/{name}

PatchCertificateSigningRequest

certificatesigningrequests

patch

PUT /api/v1/certificatesigningrequests/{name}

ReplaceCertificateSigningRequest

certificatesigningrequests

update

DELETE /api/v1/certificatesigningrequests/{name}/approval

DenyCertificateSigningRequest

certificatesigningrequests/approval

delete

POST /api/v1/devices

CreateDevice

devices

create

GET /api/v1/devices

ListDevices

devices

list

DELETE /api/v1/devices

DeleteDevices

devices

deletecollection

GET /api/v1/devices/{name}

ReadDevice

devices

get

PUT /api/v1/devices/{name}

ReplaceDevice

devices

update

DELETE /api/v1/devices/{name}

DeleteDevice

devices

delete

GET /api/v1/devices/{name}/status

ReadDeviceStatus

devices/status

get

PUT /api/v1/devices/{name}/status

ReplaceDeviceStatus

devices/status

update

GET /api/v1/devices/{name}/rendered

GetRenderedDevice

devices/rendered

get

PUT /api/v1/devices/{name}/decommission

DecommissionDevice

devices/decommission

update

GET /ws/v1/devices/{name}/console

DeviceConsole

devices/console

get

POST /api/v1/enrollmentrequests

CreateEnrollmentRequest

enrollmentrequests

create

GET /api/v1/enrollmentrequests

ListEnrollmentRequests

enrollmentrequests

list

DELETE /api/v1/enrollmentrequests

DeleteEnrollmentRequests

enrollmentrequests

deletecollection

GET /api/v1/enrollmentrequests/{name}

ReadEnrollmentRequest

enrollmentrequests

get

PUT /api/v1/enrollmentrequests/{name}

ReplaceEnrollmentRequest

enrollmentrequests

update

PATCH /api/v1/enrollmentrequests/{name}

PatchEnrollmentRequest

enrollmentrequests

patch

DELETE /api/v1/enrollmentrequests/{name}

DeleteEnrollmentRequest

enrollmentrequests

delete

GET /api/v1/enrollmentrequests/{name}/status

ReadEnrollmentRequestStatus

enrollmentrequests/status

get

POST /api/v1/enrollmentrequests/{name}/approval

ApproveEnrollmentRequest

enrollmentrequests/approval

POST

PUT /api/v1/enrollmentrequests/{name}/status

ReplaceEnrollmentRequestStatus

enrollmentrequests/status

update

POST /api/v1/fleets

CreateFleet

fleets

create

GET /api/v1/fleets

ListFleets

fleets

list

DELETE /api/v1/fleets

DeleteFleets

fleets

deletecollection

GET /api/v1/fleets/{name}

ReadFleet

fleets

get

PUT /api/v1/fleets/{name}

ReplaceFleet

fleets

update

DELETE /api/v1/fleets/{name}

DeleteFleet

fleets

delete

GET /api/v1/fleets/{name}/status

ReadFleetStatus

fleets/status

get

PUT /api/v1/fleets/{name}/status

ReplaceFleetStatus

fleets/status

update

POST /api/v1/repositories

CreateRepository

软件仓库

create

GET /api/v1/repositories

ListRepositories

软件仓库

list

DELETE /api/v1/repositories

DeleteRepositories

软件仓库

deletecollection

PUT /api/v1/repositories/{name}

replaceRepository

软件仓库

update

DELETE /api/v1/repositories/{name}

DeleteRepository

软件仓库

delete

POST /api/v1/resourcesyncs

CreateResourceSync

resourcesyncs

create

GET /api/v1/resourcesyncs

ListResourceSync

resourcesyncs

list

DELETE /api/v1/resourcesyncs

DeleteResourceSyncs

resourcesyncs

deletecollection

GET /api/v1/resourcesyncs/{name}

ReadResourceSync

resourcesyncs

get

PUT /api/v1/resourcesyncs/{name}

ReplaceResourceSync

resourcesyncs

update

DELETE /api/v1/resourcesyncs/{name}

DeleteResourceSync

resourcesyncs

delete

GET /api/v1/fleets/{fleet}/templateVersions

ListTemplateVersions

fleets/templateversions

list

DELETE /api/v1/fleets/{fleet}/templateVersions

DeleteTemplateVersions

fleets/templateversions

deletecollection

GET /api/v1/fleets/{fleet}/templateVersions/{name}

ReadTemplateVersion

fleets/templateversions

get

DELETE /api/v1/fleets/{fleet}/templateVersions/{name}

DeleteTemplateVersion

fleets/templateversions

delete

1.3. Red Hat Edge Manager 的操作系统镜像

基于镜像的操作系统允许将操作系统和配置和应用程序版本化、部署和更新为单个单元。

使用基于镜像的操作系统可以降低对以下功能的操作风险:

  • 最小化测试和部署环境之间的偏移。
  • 通过事务更新和回滚减少失败的更新,并降低维护和替换成本。

Red Hat Edge Manager 侧重于运行可引导容器镜像(bootc)的基于镜像的 Linux 操作系统。如需更多信息,请参阅 bootc

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

了解如何从以下内容构建镜像:

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

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

注: 操作系统磁盘镜像包含分区、卷、文件系统和初始 bootc 镜像。在置备过程中,只需要创建一次操作系统磁盘镜像。

对于后续的设备更新,只需要 bootc 操作系统镜像,其中包含文件系统中的文件。

请参阅以下镜像构建主题:

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

技术预览: 以下主题涵盖了为 Red Hat Edge Manager 构建镜像的特殊注意事项:

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

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

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

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

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

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

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

使用置入目录来添加、替换或删除服务聚合的配置文件。不要直接编辑可能导致从目标配置分离的配置文件。

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

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

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

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

1.3.1.5. 其他资源

技术预览: 要准备由 Red Hat Edge Manager 管理的设备,请构建包含 Red Hat Edge Manager 代理的 bootc 操作系统镜像。然后为您的设备构建操作系统磁盘镜像。

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

1.3.2.1. 先决条件

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

1.3.2.2. 安装 Red Hat Edge Manager CLI

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

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

    subscription-manager repos --enable rhacm-2.13-for-rhel-<version>-<arch>-rpms

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

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

    sudo dnf install flightctl
1.3.2.3. 可选:为早期绑定请求注册证书

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

  1. 使用 flightctl CLI 使用 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 标志来绕过服务器验证。

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

    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.2.4. 可选:使用镜像 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"
        }
      }
    }

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

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

    重要: 如果您的设备依赖于私有存储库中的容器,则设备 pull secret 必须放在 /etc/ostree/auth.json 路径中。在 secret 可以被消耗前,该设备中必须存在 pull secret。

    1. 可选: 要启用 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
    2. 可选: 如果您为早期绑定创建了 config.yaml,请在 Containerfile 中添加以下部分:

      ADD config.yaml /etc/flightctl/

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

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

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

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

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

    sudo podman build -t ${OCI_IMAGE_REPO}:${OCI_IMAGE_TAG} .

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

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

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

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

    sudo podman push \
        --sign-by-sigstore-private-key ./signingkey.private \
        ${OCI_IMAGE_REPO}:${OCI_IMAGE_TAG}
1.3.2.7. 构建操作系统磁盘镜像

构建包含设备文件系统的操作系统磁盘镜像。完成以下步骤:

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

    mkdir -p output
  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}

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

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

1.3.2.8.1. 先决条件

签署您的磁盘镜像并将其发布到您的 OCI 注册表。完成以下步骤:

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

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

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

    sudo podman manifest create \
        ${OCI_DISK_IMAGE_REPO}:${OCI_IMAGE_TAG}
  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"
  5. 使用您的私有 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.2.9. 其他资源

1.3.3. 为特定目标平台构建

为了优化置备并与 Red Hat OpenShift Virtualization 和 VMware vSphere 集成,可以使用 cloud-init 工具提供注册证书和代理配置,而不是将其嵌入到镜像中。另外,您还可以包含适当的客户机工具以更好地集成平台。这个过程生成特定于平台的镜像格式,如 Red Hat OpenShift Virtualization 的 QCOW2 和 vSphere 的 VMDK

1.3.3.1. 为 Red Hat OpenShift Virtualization 构建镜像

在为 Red Hat OpenShift Virtualization 构建操作系统镜像和磁盘镜像时,您可以按照以下更改为 Red Hat Edge Manager 进程构建 bootc 操作系统镜像

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

完成对以下步骤的步骤:

  1. 构建基于 RHEL 9 的操作系统镜像,其中包含 Red Hat Edge Manager 代理和虚拟机客户机工具,但排除代理配置。
  2. 使用以下内容创建一个名为 Containerfile 的文件:

    FROM registry.redhat.io/rhel9/rhel-bootc:<required_os_version>
    
    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
  3. 可选: 要启用 podman-compose 应用程序支持,请在 Containerfile 文件中添加以下部分:

    RUN dnf -y 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 操作系统镜像。

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

    mkdir -p output
  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}

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

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
    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}
1.3.3.2. 为 VMware vSphere 构建镜像

在为 VMware vSphere 构建操作系统镜像和磁盘镜像时,您可以按照以下更改为 Red Hat Edge Manager 进程构建 bootc 操作系统镜像

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

构建基于 RHEL 9 的操作系统镜像,其中包含 Red Hat Edge Manager 代理和虚拟机客户机工具,但排除代理配置。

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

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

    FROM registry.redhat.io/rhel9/rhel-bootc:<required_os_version>
    
    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
  2. 运行以下命令,创建一个名为 output 的目录:

    mkdir -p output
  3. 运行以下命令,从您的操作系统镜像生成类型为 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 路径中找到磁盘镜像。

1.4. 置备设备

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

需要的访问权限:集群管理员

请参阅以下文档:

1.4.1. 置备物理设备

技术预览: 当您使用 bootc-image-builder 工具从操作系统镜像构建 ISO 磁盘镜像时,该镜像与可用于下载的 RHEL ISO 类似。但是,您的操作系统镜像内容嵌入 ISO 磁盘镜像中。

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

有关通过网络安装 ISO 的详情,请参考 通过 PXE 引导部署 ISO bootc 镜像

1.4.2. 在 OpenShift Virtualization 中置备设备

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

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

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

1.4.2.1. 先决条件
  • 已安装 flightctl CLI 并登录到 Red Hat Edge Manager 服务实例。
  • 已安装 oc CLI,使用它来登录到 OpenShift 集群实例,并改为您要创建虚拟机的项目。
1.4.2.2. 创建 cloud-init 配置

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

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

    flightctl certificate request --signer=enrollment --expiration=365d --output=embedded > config.yaml
  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
  3. 创建包含云配置用户数据文件的 Kubernetes Secret

    oc create secret generic enrollment-secret --from-file=userdata=cloud-config.yaml
1.4.2.3. 创建虚拟机

创建一个虚拟机,其主磁盘填充自您的 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
  2. 运行以下命令,将资源清单应用到集群:

    oc apply -f my-bootc-vm.yaml
1.4.2.4. 其他资源

1.5. 管理设备

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

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

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

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

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

需要的访问权限:集群管理员

以下文档侧重于管理独立设备:

要了解更多有关在团队中管理设备的信息,请参阅管理设备团队

1.5.1. 注册设备

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

第一次在设备上运行 Red Hat Edge Manager 代理时,代理将通过生成加密密钥对来为注册过程准备注册过程。设备的加密密钥对由公钥和私钥组成。私钥不会离开设备,因此设备无法重复或模拟。密钥对在注册过程中注册到 Red Hat Edge Manager 服务,并在停用该设备时删除。

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

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

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

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

1.5.1.1. 先决条件
1.5.1.2. 使用 CLI 注册设备

您必须先将设备注册到 Red Hat Edge Manager 服务中,然后才能管理它们。完成以下步骤:

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

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

    请参见以下示例输出:

    NAME           APPROVAL  APPROVER  APPROVED LABELS
    <device_name>  Pending   <none>    <none>

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

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

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

    请参见以下示例输出:

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

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

1.5.2. 查看设备

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

1.5.2.1. 先决条件
1.5.2.2. 查看设备清单和设备详情

查看设备清单中的设备。完成以下步骤:

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

    flightctl get devices

    请参见以下示例输出:

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

    flightctl get device/<device_name> -o yaml

    请参见以下示例输出:

    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
    
    [...]
    1
    分配给该设备的用户定义标签。
    2
    设备的目标 OS 镜像版本。
    3
    设备的目标操作系统配置。
    4
    设备的当前 OS 镜像版本
    5
    设备的当前操作系统配置版本。
    6
    设备部署的应用程序的当前列表。
    7
    该设备中应用程序的健康状况。
    8
    CPU、磁盘和内存资源的可用性。
    9
    基本系统信息。
    10
    设备的健康状况。
    11
    设备的更新状态。
    12
    设备的最后检查时间和日期。

1.5.3. 标签和标签选择器

技术预览: 您可以通过分配标签来组织资源,包括独立设备、团队和任何其他资源。例如,您可以使用标签记录位置、硬件类型或目的。Red Hat Edge Manager 标签遵循与 Kubernetes 标签和标签选择器相同的语法、原则和运算符。

您可以在查看设备清单或将操作应用到设备时选择带有标签的设备。

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

您还可以使用仅包含键的标签。

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

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

您可以使用以下方法将标签应用到资源:

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

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

请参见以下示例:

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

site=factory-berlin

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

site!=factory-berlin

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

网站(factory-berlin,factory-madrid)

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

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

1.5.4. 使用标签

技术预览: 您可以使用标签组织设备。

1.5.4.1. 使用 CLI 查看设备及其标签

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

完成以下步骤:

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

    flightctl get devices -o wide

    请参见以下示例输出:

    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
  2. 使用 -l <key=value > 选项查看清单中的带有特定标签或一组标签的设备:

    flightctl get devices -l site=factory-berlin -o wide

    请参见以下示例输出:

    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
1.5.4.2. 使用 CLI 更新标签

使用 CLI 更新设备上的标签。完成以下步骤:

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

    flightctl get device/<device1_name> -o yaml > my_device.yaml
  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:
    [...]
  3. 运行以下命令保存文件并应用更新的设备定义:

    flightctl apply -f my_device.yaml
  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

1.5.5. 字段选择器

字段选择器根据特定的资源字段值过滤 Red Hat Edge Manager 资源列表,包括独立设备、团队和任何其他资源。

字段选择器遵循与 Kubernetes 字段相同的语法、原则和运算符,以及用于更高级的搜索用例,使用其他运算符的标签选择器。

1.5.5.1. 支持的字段

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

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

  • metadata.name
  • metadata.owner
  • metadata.creationTimestamp

注: 要查询标签,请使用标签选择器进行高级且灵活的标签过滤。

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

1.5.5.2. 其他支持的字段列表

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

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

Expand

Kind

字段

证书签名请求

status.certificate

设备

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

1.5.5.3. 字段发现

有些 Red Hat Edge Manager 资源可能会公开额外的支持字段。您可以使用 flightctl 命令和-- field-selector 选项发现支持的字段。如果您尝试使用 unsupported 字段,错误消息列出了可用的支持字段。请参见以下示例:

flightctl get device --field-selector='text'
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]

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

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

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

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

1.5.5.3.1. 例子

按名称排除特定设备

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

flightctl get devices --field-selector 'metadata.name!=<device_name>'

根据所有者、标签并创建时间戳过滤

此命令检索由 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'

根据所有者、标签和设备状态过滤

以下命令检索由 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'
1.5.5.4. 支持的 Operator
Expand

Operator

符号

描述

Exists

--field-selector <field>

检查是否存在字段。例如,--field-selector 'metadata.owner' 字段选择器返回具有 metadata.owner 字段的资源。

DoesNotExist

!

检查字段是否不存在。

等于

=

检查字段是否等于一个值。

DoubleEquals

==

另一种形式的相等性检查。

NotEquals

!=

检查字段是否不等于值。

GreaterThan

>

检查字段是否大于一个值。

GreaterThanOrEquals

>=

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

LessThan

<

检查字段是否小于一个值。

LessThanOrEquals

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

In

in

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

NotIn

NotIn

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

contains

contains

检查字段是否具有值。

NotContains

notcontains

检查字段是否包含值。

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

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

Expand

字段类型

支持的 Operator

value

字符串

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

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: 匹配,如果字段值不等于列表中的任何数字。

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

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

数字格式

布尔值

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

DoubleEquals :如果值为 truefalse,则匹配。等于 Equals 的替代选择。

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

中:如果值为 truefalse,则匹配在列表中。该列表只能包含 truefalse,因此这个 Operator 被限制在使用中。

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

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

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

布尔值格式(truefalse)

Array

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

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

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

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

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

数组元素

1.5.6. 更新操作系统

技术预览: 您可以通过更新设备规格中的目标操作系统镜像名称或版本来更新设备的操作系统。

当 Red Hat Edge Manager 代理与服务通信时,代理会检测到请求的更新。然后,代理会自动在后台下载和验证新操作系统版本。

Red Hat Edge Manager 代理根据更新策略调度实际系统更新。在调度的更新时间,代理会在不中断当前运行的操作系统的情况下安装新版本。

最后,设备会重启到新版本。

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

Expand

镜像类型

镜像参考

bootc

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

在此过程中,代理会向服务发送状态更新。您可以通过查看设备状态来监控更新过程。如需更多信息,请参阅查看设备

1.5.6.1. 在 CLI 上更新操作系统

使用 CLI 更新设备。完成以下步骤:

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

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

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

    flightctl apply -f <device_name>.yaml

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

技术预览: 您可以在镜像中包括操作系统级别的主机配置,以提供最大一致性和可重复性。

要更新配置,您可以创建一个新的操作系统镜像并使用新镜像更新设备。

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

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

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

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

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

1.5.7.1. 配置供应商

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

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

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

1.5.7.1.1. 从 Git 存储库配置

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

Git Config Provider 使用以下参数:

Expand

参数

描述

软件仓库

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

targetRevision

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

路径

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

MountPath

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

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

1.5.7.1.2. Kubernetes 集群中的 secret

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

Kubernetes Secret Provider 使用以下参数:

Expand

参数

描述

Name

secret 的名称。

Namespace

secret 的命名空间。

MountPath

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

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

1.5.7.1.3. 从 HTTP 服务器配置

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

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

Expand

参数

描述

软件仓库

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

Suffix

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

filepath

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

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

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

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

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

Expand

参数

描述

路径

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

内容

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

ContentEncoding

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

模式

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

用户

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

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

1.5.7.2. 其他资源

1.5.8. 将 fleets 配置为自动注册 MicroShift 集群

技术预览: 如果您有一组运行包含 MicroShift 的操作系统镜像的设备,您可以将您的团队配置为使用 Red Hat Advanced Cluster Management 自动注册 MicroShift 集群。

1.5.8.1. 配置设备模板

要在团队中启用自动注册,请将配置添加到设备模板中。完成以下步骤:

  1. 添加 acm-crd 资源配置,其中包含 crd.yaml 文件的 filePath、您的仓库和 后缀Fleet 资源。请参见以下示例:

    apiVersion: flightctl.io/v1alpha1
    kind: Fleet
    metadata:
     name: fleet-acm
    spec:
     selector:
      matchLabels:
       fleet: acm
     template:
      spec:
       os:
        image: <your os image>
    config:
       - name: acm-crd
        httpRef:
         filePath: /var/local/acm-import/crd.yaml
         repository: acm-registration
         suffix: /agent-registration/crds/v1
  2. 使用 filePathrepositorysuffix 添加 acm-import 资源配置,如下例所示:

    - name: acm-import
        httpRef:
         filePath: /var/local/acm-import/import.yaml
         repository: acm-registration
         suffix: /agent-registration/manifests/{{.metadata.name}}
  3. 可选: 如果您的 MicroShift 集群没有拉取 Red Hat Advanced Cluster Management 镜像,请添加 pull-secret 资源,如下所示:

    - name: pull-secret
        inline:
        - path: "/etc/crio/openshift-pull-secret"
         content: "{\"auths\":{...}}"
  4. 如果需要,在 crd.yaml 文件和 import.yaml 文件上运行 kubectl apply -f,请添加 apply-acm-manifests 资源:

    - name: apply-acm-manifests
        inline:
        - path: "/etc/flightctl/hooks.d/afterupdating/50-acm-registration.yaml"
         content: |
          - if:
           - path: /var/local/acm-import/crd.yaml
            op: [created]
           run: kubectl apply -f /var/local/acm-import/crd.yaml
           envVars:
            KUBECONFIG: /var/lib/microshift/resources/kubeadmin/kubeconfig
          - if:
           - path: /var/local/acm-import/import.yaml
            op: [created]
           run: kubectl apply -f /var/local/acm-import/import.yaml
           envVars:
            KUBECONFIG: /var/lib/microshift/resources/kubeadmin/kubeconfig
  5. 在控制台中,标记设备 fleet:acm,再点 Approve,这将自动选择 fleet-acm fleet。有关使用标签 管理 设备的信息,请参阅管理设备团队。

1.5.9. 从 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
  2. 运行以下命令来创建 Repository 资源:

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

    flightctl get repository/site-settings

    请参见以下示例输出:

    NAME           TYPE  REPOSITORY URL                                 ACCESSIBLE
    site-settings  git   https://github.com/<your_org>/<your_repo>.git  True
  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
    
    [...]
    1
    示例配置从 site-settings 存储库的 production 分支中获取 example-site 目录中的所有文件,并将文件放置在根目录(/)中。
    2
    通过创建目录结构来确保目标路径可写入。根目录(/)在 bootc 系统中不可写入。

1.5.10. 设备生命周期 hook

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

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

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

Expand

生命周期 hook

描述

beforeUpdating

代理完成更新后,会调用 hook,但在更改操作系统前。如果此 hook 中的操作返回失败,代理会取消更新。

afterUpdating

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

beforeRebooting

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

afterRebooting

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

1.5.10.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 操作采用以下参数:

Expand

参数

描述

运行

要运行的命令的绝对路径,后跟任何标志或参数,如 /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 的条件。否则,会跳过该操作。

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

Expand

参数

描述

路径

到必须在更新期间更改的文件或目录的绝对路径,作为要执行的操作的条件。使用正斜杠(/)指定路径。如果路径指向某个目录,它必须以正斜杠(/)结尾。如果指定了到文件的路径,则该文件必须已更改为满足条件。如果您指定了目录的路径,则该目录或任何子目录中的文件必须已更改为满足条件。

op

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

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

Expand

变量

描述

${ Path }

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

${ files }

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

${ CreatedFiles }

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

${ UpdatedFiles }

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

${ RemovedFiles }

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

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

Expand

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 以重新加载防火墙规则作为新的运行时配置来激活。

1.5.10.2. 其他资源

1.5.11. 监控设备资源

技术预览: 您可以为设备资源设置资源监控器,并在资源利用率超过定义的阈值时创建警报。当代理警告 Red Hat Edge Manager 服务时,该服务会根据严重性级别将设备状态设置为 degradederror

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

Expand

参数

描述

MonitorType

要监控的资源。目前支持 CPU 内存和磁盘资源。

SamplingInterval

monitor 样本使用的时间间隔,以一个正整数的形式指定,后跟一个时间单位: s 表示秒,m 表示分钟,h 表示小时。

AlertRules

警报规则列表。

路径

仅针对 磁盘 监控器。要监控的目录的绝对路径。使用率反映了包含路径的文件系统,即使定义的路径不是挂载点。

警报规则采用以下参数:

Expand

参数

描述

重要性

警报规则的严重性可以是 InfoWarningCritical。每个严重性级别都只允许一个警报规则。

Duration

资源使用情况测量和平均超过抽样的时间,以正整数指定,后跟一个时间单位: s 表示秒,m 表示分钟,h 代表小时。持续时间必须小于抽样间隔。

百分比

触发警报的用量阈值,以百分比值为单位。在没有%符号的情况下,值范围从 0 到 100。

描述

警报的人类可读描述。添加警报的详细信息,以帮助调试。默认情况下,警报描述 的负载高于 >%,超过

1.5.11.1. 使用 CLI 监控设备资源

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

完成以下步骤:

  • 在设备规格的 spec.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.
    [...]
    1
    每 5 秒进行样本使用。
    2
    检查与 /applications_data 路径关联的文件系统上的磁盘用量。
    3
    如果平均用量超过 30 分钟,则启动警告。
    4
    如果平均使用量超过 90% 超过 10 分钟,则启动一个关键警报。

1.6. 在边缘设备上管理应用程序

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

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

1.6.1. 先决条件

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

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

完成以下步骤:

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

    1. 使用以下内容创建一个名为 Containerfile 的文件:
    FROM scratch 
    1
    
    COPY podman-compose.yaml /podman-compose.yaml
    LABEL appType="compose" 
    2
    1
    全新 容器中嵌入 compose 文件。
    2
    添加 appType=compose 标签。
  2. 构建并推送至 OCI registry 的容器镜像。

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

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

      OCI_IMAGE_TAG=v1
    3. 构建容器镜像。运行以下命令:

      podman build -t ${OCI_IMAGE_REPO}:${OCI_IMAGE_TAG} .
    4. 推送容器镜像。
    podman push ${OCI_IMAGE_REPO}:${OCI_IMAGE_TAG} .

1.6.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>
    [...]
    1
    Web 控制台和 CLI 列表应用时使用的应用程序用户定义的名称。
    2
    对 OCI registry 中的应用程序软件包的引用。
    3
    可选。键值对列表,作为环境变量或命令行标志传递给部署工具。

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

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

    flightctl get device/<your_device_id> -o yaml

    请参见以下示例输出:

    [...]
    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
    [...]

1.7. 管理设备团队

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

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

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

群级管理具有以下优点:

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

fleet 规格由以下功能组成:

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

您可以同时单独管理和管理的设备。当将设备选为团队时,Red Hat Edge Manager 根据设备模板为新设备创建设备规格。如果您更新一个团队或新设备的设备模板,Red Hat Edge Manager 会在团队中强制实施新规格。

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

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

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

1.7.1. 设备选择为一个团队

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

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

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

Expand

设备

标签

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

1.7.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 时,您可以将标签与 站点 键一起使用。

设备模板中的以下字段支持占位符:

Expand

字段

支持的占位符

操作系统镜像

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

Git 配置提供程序

目标修订,path

HTTP 配置提供程序

URL 后缀、路径

内联配置提供程序

内容,路径

1.7.3. 使用 CLI 选择设备到团队中

技术预览: 定义标签选择器,将设备添加到团队中。

完成以下任务:

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

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

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

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

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

    请参见以下示例输出:

    False

法律通告

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 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部