×

要获得类似于已连接集群的更新体验,您可以使用以下步骤在断开连接的环境中安装和配置 OpenShift 更新服务 (OSUS)。

以下步骤概述了如何在断开连接的环境中使用 OSUS 更新集群的高级工作流程

  1. 配置对安全注册表的访问。

  2. 更新全局集群拉取密钥以访问您的镜像注册表。

  3. 安装 OSUS 操作符。

  4. 为 OpenShift 更新服务创建一个图形数据容器镜像。

  5. 安装 OSUS 应用程序并配置您的集群以在您的环境中使用 OpenShift 更新服务。

  6. 按照文档中说明的受支持的更新过程进行操作,就像处理已连接集群一样。

在断开连接的环境中使用 OpenShift 更新服务

OpenShift 更新服务 (OSUS) 为 OpenShift Container Platform 集群提供更新建议。Red Hat 公开托管 OpenShift 更新服务,并且已连接环境中的集群可以通过公共 API 连接到该服务以检索更新建议。

但是,断开连接的环境中的集群无法访问这些公共 API 来检索更新信息。要在断开连接的环境中获得类似的更新体验,您可以安装和配置 OpenShift 更新服务,使其在断开连接的环境中可用。

单个 OSUS 实例能够为数千个集群提供建议。可以通过更改副本值来水平扩展 OSUS 以适应更多集群。因此,对于大多数断开连接的用例,一个 OSUS 实例就足够了。例如,Red Hat 为整个已连接集群群集只托管一个 OSUS 实例。

如果要将不同环境中的更新建议分开,可以为每个环境运行一个 OSUS 实例。例如,如果您有单独的测试和阶段环境,您可能不希望阶段环境中的集群收到版本 A 的更新建议,如果该版本尚未在测试环境中进行测试。

以下部分介绍如何安装 OSUS 实例并将其配置为向集群提供更新建议。

先决条件

  • 您必须安装 oc 命令行界面 (CLI) 工具。

  • 您必须在您的环境中配置一个容器镜像注册表,其中包含您的更新的容器镜像,如镜像 OpenShift Container Platform 镜像中所述。

为 OpenShift 更新服务配置对安全注册表的访问

如果发布镜像包含在 HTTPS X.509 证书由自定义证书颁发机构签名的注册表中,请完成为镜像注册表访问配置附加信任存储中的步骤,并对更新服务进行以下更改。

OpenShift 更新服务操作符需要注册表 CA 证书中的配置映射键名updateservice-registry

更新服务的镜像注册表 CA 配置映射示例
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-registry-ca
data:
  updateservice-registry: | (1)
    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----
  registry-with-port.example.com..5000: | (2)
    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----
1 OpenShift 更新服务操作符需要注册表 CA 证书中的配置映射键名updateservice-registry
2 如果注册表具有端口,例如registry-with-port.example.com:5000,则应将:替换为..

更新全局集群拉取密钥

您可以通过替换当前拉取密钥或附加新的拉取密钥来更新集群的全局拉取密钥。

当用户使用与安装期间使用的注册表不同的注册表来存储镜像时,需要此过程。

先决条件
  • 您可以作为具有cluster-admin角色的用户访问集群。

过程
  1. 可选:要将新的拉取密钥附加到现有拉取密钥,请完成以下步骤

    1. 输入以下命令下载拉取密钥

      $ oc get secret/pull-secret -n openshift-config --template='{{index .data ".dockerconfigjson" | base64decode}}' ><pull_secret_location> (1)
      1 提供拉取密钥文件的路径。
    2. 输入以下命令添加新的拉取密钥

      $ oc registry login --registry="<registry>" \ (1)
      --auth-basic="<username>:<password>" \ (2)
      --to=<pull_secret_location> (3)
      
      1 提供新的注册表。您可以在同一注册表中包含多个仓库,例如:--registry="<registry/my-namespace/my-repository>"
      2 提供新注册表的凭据。
      3 提供拉取密钥文件的路径。

      或者,您可以手动更新拉取密钥文件。

  2. 输入以下命令以更新集群的全局拉取密钥

    $ oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=<pull_secret_location> (1)
    1 提供新的拉取密钥文件的路径。

    此更新将部署到所有节点,所需时间取决于集群的大小。

    从 OpenShift Container Platform 4.7.4 开始,对全局拉取密钥的更改不再触发节点 drain 或重启。

安装 OpenShift 更新服务 Operator

要安装 OpenShift 更新服务,您必须首先使用 OpenShift Container Platform Web 控制台或 CLI 安装 OpenShift 更新服务 Operator。

对于在隔离环境(也称为隔离集群)中安装的集群,Operator Lifecycle Manager 默认情况下无法访问托管在远程注册表上的 Red Hat 提供的 OperatorHub 源,因为这些远程源需要完全的互联网连接。更多信息,请参见 在隔离环境中使用 Operator Lifecycle Manager

使用 Web 控制台安装 OpenShift 更新服务 Operator

您可以使用 Web 控制台安装 OpenShift 更新服务 Operator。

过程
  1. 在 Web 控制台中,点击**Operators** → **OperatorHub**。

    在**按关键字筛选…**字段中输入Update Service 以更快地找到 Operator。

  2. 从可用 Operators 列表中选择**OpenShift 更新服务**,然后点击**安装**。

    1. 选择一个**更新通道**。

    2. 选择一个**版本**。

    3. 在**安装模式**下选择**集群上的特定命名空间**。

    4. 为**已安装命名空间**选择一个命名空间,或接受推荐的命名空间openshift-update-service

    5. 选择一个**更新批准**策略

      • **自动**策略允许 Operator Lifecycle Manager (OLM) 在有新版本可用时自动更新 Operator。

      • **手动**策略需要集群管理员批准 Operator 更新。

    6. 点击**安装**。

  3. 转到**Operators** → **已安装 Operators** 并验证 OpenShift 更新服务 Operator 是否已安装。

  4. 确保**OpenShift 更新服务**列在正确的命名空间中,且**状态**为**成功**。

使用 CLI 安装 OpenShift 更新服务 Operator

您可以使用 OpenShift CLI (oc) 安装 OpenShift 更新服务 Operator。

过程
  1. 为 OpenShift 更新服务 Operator 创建一个命名空间

    1. 为 OpenShift 更新服务 Operator 创建一个Namespace 对象 YAML 文件,例如update-service-namespace.yaml

      apiVersion: v1
      kind: Namespace
      metadata:
        name: openshift-update-service
        annotations:
          openshift.io/node-selector: ""
        labels:
          openshift.io/cluster-monitoring: "true" (1)
      1 设置openshift.io/cluster-monitoring标签以在此命名空间上启用 Operator 推荐的集群监控。
    2. 创建命名空间

      $ oc create -f <filename>.yaml

      例如

      $ oc create -f update-service-namespace.yaml
  2. 通过创建以下对象来安装 OpenShift 更新服务 Operator

    1. 创建一个OperatorGroup 对象 YAML 文件,例如update-service-operator-group.yaml

      apiVersion: operators.coreos.com/v1
      kind: OperatorGroup
      metadata:
        name: update-service-operator-group
        namespace: openshift-update-service
      spec:
        targetNamespaces:
        - openshift-update-service
    2. 创建一个OperatorGroup 对象

      $ oc -n openshift-update-service create -f <filename>.yaml

      例如

      $ oc -n openshift-update-service create -f update-service-operator-group.yaml
    3. 创建一个Subscription 对象 YAML 文件,例如update-service-subscription.yaml

      订阅示例
      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        name: update-service-subscription
        namespace: openshift-update-service
      spec:
        channel: v1
        installPlanApproval: "Automatic"
        source: "redhat-operators" (1)
        sourceNamespace: "openshift-marketplace"
        name: "cincinnati-operator"
      1 指定提供 Operator 的目录源的名称。对于不使用自定义 Operator Lifecycle Manager (OLM) 的集群,请指定redhat-operators。如果您的 OpenShift Container Platform 集群安装在隔离环境中,请指定配置 Operator Lifecycle Manager (OLM) 时创建的CatalogSource 对象的名称。
    4. 创建Subscription 对象

      $ oc create -f <filename>.yaml

      例如

      $ oc -n openshift-update-service create -f update-service-subscription.yaml

      OpenShift 更新服务 Operator 已安装到openshift-update-service命名空间并目标为openshift-update-service命名空间。

  3. 验证 Operator 安装

    $ oc -n openshift-update-service get clusterserviceversions
    示例输出
    NAME                             DISPLAY                    VERSION   REPLACES   PHASE
    update-service-operator.v4.6.0   OpenShift Update Service   4.6.0                Succeeded
    ...

    如果列出了 OpenShift 更新服务 Operator,则安装成功。版本号可能与显示的不同。

创建 OpenShift 更新服务图数据容器镜像

OpenShift 更新服务需要一个图数据容器镜像,OpenShift 更新服务从中检索有关通道成员资格和被阻止的更新边的信息。图数据通常直接从更新图数据存储库中获取。在无法连接互联网的环境中,从 init 容器加载此信息是另一种使图数据可用于 OpenShift 更新服务的方法。init 容器的作用是提供图数据的本地副本,在 pod 初始化期间,init 容器将数据复制到服务可访问的卷中。

oc-mirror OpenShift CLI (oc) 插件除了镜像发布镜像外,还会创建此图数据容器镜像。如果您使用 oc-mirror 插件镜像了您的发布镜像,则可以跳过此过程。

过程
  1. 创建一个 Dockerfile,例如./Dockerfile,其中包含以下内容

    FROM registry.access.redhat.com/ubi9/ubi:latest
    
    RUN curl -L -o cincinnati-graph-data.tar.gz https://api.openshift.com/api/upgrades_info/graph-data
    
    RUN mkdir -p /var/lib/cincinnati-graph-data && tar xvzf cincinnati-graph-data.tar.gz -C /var/lib/cincinnati-graph-data/ --no-overwrite-dir --no-same-owner
    
    CMD ["/bin/bash", "-c" ,"exec cp -rp /var/lib/cincinnati-graph-data/* /var/lib/cincinnati/graph-data"]
  2. 使用上面步骤中创建的 docker 文件构建图数据容器镜像,例如registry.example.com/openshift/graph-data:latest

    $ podman build -f ./Dockerfile -t registry.example.com/openshift/graph-data:latest
  3. 将上一步中创建的图数据容器镜像推送到 OpenShift 更新服务可以访问的存储库,例如registry.example.com/openshift/graph-data:latest

    $ podman push registry.example.com/openshift/graph-data:latest

    要将图数据镜像推送到隔离环境中的注册表,请将上一步中创建的图数据容器镜像复制到 OpenShift 更新服务可以访问的存储库。运行oc image mirror --help以获取可用选项。

创建 OpenShift 更新服务应用程序

您可以使用 OpenShift Container Platform Web 控制台或 CLI 创建 OpenShift 更新服务应用程序。

使用 Web 控制台创建 OpenShift 更新服务应用程序

您可以使用 OpenShift Container Platform Web 控制台通过 OpenShift 更新服务 Operator 创建 OpenShift 更新服务应用程序。

先决条件
  • OpenShift 更新服务 Operator 已安装。

  • OpenShift 更新服务图数据容器镜像已创建并推送到 OpenShift 更新服务可以访问的存储库。

  • 当前发行版和更新目标发行版已镜像到隔离环境中的注册表。

过程
  1. 在 Web 控制台中,点击**Operators** → **已安装 Operators**。

  2. 从已安装的 Operators 列表中选择OpenShift 更新服务

  3. 点击更新服务选项卡。

  4. 点击创建 UpdateService

  5. 名称字段中输入名称,例如:service

  6. 图数据镜像字段中输入在“创建 OpenShift 更新服务图数据容器镜像”中创建的图数据容器镜像的本地 pullspec,例如:registry.example.com/openshift/graph-data:latest

  7. 发行版字段中,输入在“镜像 OpenShift Container Platform 镜像仓库”中创建的注册表和仓库,例如:registry.example.com/ocp4/openshift4-release-images

  8. 副本数字段中输入2

  9. 点击创建以创建 OpenShift 更新服务应用程序。

  10. 验证 OpenShift 更新服务应用程序

    • 更新服务选项卡的UpdateServices列表中,点击刚刚创建的 Update Service 应用程序。

    • 点击资源选项卡。

    • 验证每个应用程序资源的状态是否为已创建

使用 CLI 创建 OpenShift 更新服务应用程序

您可以使用 OpenShift CLI (oc) 创建 OpenShift 更新服务应用程序。

先决条件
  • OpenShift 更新服务 Operator 已安装。

  • OpenShift 更新服务图数据容器镜像已创建并推送到 OpenShift 更新服务可以访问的存储库。

  • 当前发行版和更新目标发行版已镜像到隔离环境中的注册表。

过程
  1. 配置 OpenShift 更新服务的目标命名空间,例如:openshift-update-service

    $ NAMESPACE=openshift-update-service

    命名空间必须与 operator 组中的targetNamespaces值匹配。

  2. 配置 OpenShift 更新服务应用程序的名称,例如:service

    $ NAME=service
  3. 配置发行版镜像的注册表和仓库,如“镜像 OpenShift Container Platform 镜像仓库”中所配置,例如:registry.example.com/ocp4/openshift4-release-images

    $ RELEASE_IMAGES=registry.example.com/ocp4/openshift4-release-images
  4. 将图数据镜像的本地 pullspec 设置为在“创建 OpenShift 更新服务图数据容器镜像”中创建的图数据容器镜像,例如:registry.example.com/openshift/graph-data:latest

    $ GRAPH_DATA_IMAGE=registry.example.com/openshift/graph-data:latest
  5. 创建 OpenShift 更新服务应用程序对象

    $ oc -n "${NAMESPACE}" create -f - <<EOF
    apiVersion: updateservice.operator.openshift.io/v1
    kind: UpdateService
    metadata:
      name: ${NAME}
    spec:
      replicas: 2
      releases: ${RELEASE_IMAGES}
      graphDataImage: ${GRAPH_DATA_IMAGE}
    EOF
  6. 验证 OpenShift 更新服务应用程序

    1. 使用以下命令获取策略引擎路由

      $ while sleep 1; do POLICY_ENGINE_GRAPH_URI="$(oc -n "${NAMESPACE}" get -o jsonpath='{.status.policyEngineURI}/api/upgrades_info/v1/graph{"\n"}' updateservice "${NAME}")"; SCHEME="${POLICY_ENGINE_GRAPH_URI%%:*}"; if test "${SCHEME}" = http -o "${SCHEME}" = https; then break; fi; done

      您可能需要轮询直到命令成功。

    2. 从策略引擎检索图。请确保为channel指定有效的版本。例如,如果在 OpenShift Container Platform 4.17 中运行,请使用stable-4.17

      $ while sleep 10; do HTTP_CODE="$(curl --header Accept:application/json --output /dev/stderr --write-out "%{http_code}" "${POLICY_ENGINE_GRAPH_URI}?channel=stable-4.6")"; if test "${HTTP_CODE}" -eq 200; then break; fi; echo "${HTTP_CODE}"; done

      这会轮询直到图请求成功;但是,根据您已镜像的发行版镜像,生成的图可能为空。

根据 RFC-1123,策略引擎路由名称不得超过 63 个字符。如果您看到ReconcileCompleted状态为false,原因是CreateRouteFailedhost must conform to DNS 1123 naming convention and must be no more than 63 characters导致,请尝试使用较短的名称创建更新服务。

配置集群版本操作符 (CVO)

安装 OpenShift 更新服务操作符并创建 OpenShift 更新服务应用程序后,可以更新集群版本操作符 (CVO) 以从您环境中安装的 OpenShift 更新服务中提取图数据。

先决条件
  • OpenShift 更新服务 Operator 已安装。

  • OpenShift 更新服务图数据容器镜像已创建并推送到 OpenShift 更新服务可以访问的存储库。

  • 当前发行版和更新目标发行版已镜像到隔离环境中的注册表。

  • OpenShift 更新服务应用程序已创建。

过程
  1. 设置 OpenShift 更新服务的目标命名空间,例如:openshift-update-service

    $ NAMESPACE=openshift-update-service
  2. 设置 OpenShift 更新服务应用程序的名称,例如:service

    $ NAME=service
  3. 获取策略引擎路由

    $ POLICY_ENGINE_GRAPH_URI="$(oc -n "${NAMESPACE}" get -o jsonpath='{.status.policyEngineURI}/api/upgrades_info/v1/graph{"\n"}' updateservice "${NAME}")"
  4. 设置拉取图数据的补丁

    $ PATCH="{\"spec\":{\"upstream\":\"${POLICY_ENGINE_GRAPH_URI}\"}}"
  5. 修补 CVO 以使用您环境中的 OpenShift 更新服务

    $ oc patch clusterversion version -p $PATCH --type merge

请参阅配置集群范围代理以配置 CA 以信任更新服务器。

后续步骤

在更新集群之前,请确认满足以下条件:

  • 集群版本操作符 (CVO) 配置为使用已安装的 OpenShift 更新服务应用程序。

  • 新发行版的发行版镜像签名配置映射已应用到您的集群。

    集群版本操作符 (CVO) 使用发行版镜像签名来确保发行版镜像未被修改,方法是验证发行版镜像签名是否与预期结果匹配。

  • 当前发行版和更新目标发行版镜像已镜像到断开连接的环境中的注册表。

  • 最新的图数据容器镜像已镜像到您的注册表。

  • 已安装最新版本的 OpenShift 更新服务操作符。

    如果您最近没有安装或更新 OpenShift 更新服务操作符,可能会有更新的版本可用。请参阅在断开连接的环境中使用 Operator Lifecycle Manager,了解有关如何在断开连接的环境中更新 OLM 目录的更多信息。

配置集群以使用已安装的 OpenShift 更新服务和本地镜像注册表后,您可以使用以下任何更新方法: