12.3. 使用 OpenShift Update Service 在断开连接的环境中更新集群

要获得与连接的集群类似的更新体验,您可以使用以下步骤在断开连接的环境中安装和配置 OpenShift Update Service。

12.3.1. 在断开连接的环境中使用 OpenShift Update Service

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

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

单个 OSUS 实例能够为数千台集群提供建议。通过更改 replica 值,OSUS 可以水平扩展到 cater 到更多集群。因此,对于大多数断开连接的用例,一个 OSUS 实例就足够了。例如,红帽为整个连接的集群只运行一个 OSUS 实例。

如果要在不同环境中单独保留更新建议,您可以为每个环境运行一个 OSUS 实例。例如,如果您有单独的测试和暂存环境,您可能不希望在暂存环境中有一个集群来接收对版本 A 的更新建议(如果还没有在测试环境中测试该版本)。

以下小节介绍了如何安装本地 OSUS 实例,并将其配置为为集群提供更新建议。

12.3.2. 先决条件

12.3.3. 为 OpenShift Update Service 配置对安全 registry 的访问

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

OpenShift Update Service Operator 需要 registry CA 证书中的配置映射键名称为 updateservice-registry

更新服务的镜像 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 Update Service Operator 需要 registry CA 证书中的配置映射键名称 updateservice-registry。
2
如果 registry 带有端口,如 registry-with-port.example.com:5000: 需要被 .. 替换。

12.3.4. 更新全局集群 pull secret

您可以通过替换当前的 pull secret 或附加新的 pull secret 来更新集群的全局 pull secret。

当用户使用单独的 registry 存储镜像而不使用安装过程中的 registry时,需要这个过程。

先决条件

  • 您可以使用具有 cluster-admin 角色的用户访问集群。

流程

  1. 可选: 要将新的 pull secret 附加到现有 pull secret 中,请完成以下步骤:

    1. 输入以下命令下载 pull secret:

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

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

      另外,您可以对 pull secret 文件执行手动更新。

  2. 输入以下命令为您的集群更新全局 pull secret:

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

    该更新将推广至所有节点,可能需要一些时间,具体取决于集群大小。

    注意

    从 OpenShift Container Platform 4.7.4 开始,对全局 pull secret 的更改不再触发节点排空或重启。

12.3.5. 安装 OpenShift Update Service Operator

要安装 OpenShift Update Service,您必须首先使用 OpenShift Container Platform Web 控制台或 CLI 安装 OpenShift Update Service Operator。

注意

对于在断开连接的环境中安装的集群(也称为断开连接的集群),Operator Lifecycle Manager 默认无法访问托管在远程 registry 上的红帽提供的 OperatorHub 源,因为这些远程源需要有互联网连接。如需更多信息,请参阅在受限网络中使用 Operator Lifecycle Manager

12.3.5.1. 使用 Web 控制台安装 OpenShift Update Service Operator

您可以使用 Web 控制台安装 OpenShift Update Service Operator。

流程

  1. 在 Web 控制台中,点 OperatorsOperatorHub

    注意

    Filter by keyword…​ 字段中输入 Update Service,以更快地查找 Operator。

  2. 从可用的 Operator 列表中选择 OpenShift Update Service,然后点 Install

    1. 频道 v1 被选为 Update Channel,因为它是这个版本中唯一可用的频道。
    2. Installation Mode 下选择 A specific namespace on the cluster
    3. Installed Namespace 选择一个命名空间,或接受推荐的命名空间 openshift-update-service
    4. 选择一个 批准策略

      • Automatic 策略允许 Operator Lifecycle Manager(OLM)在有新版本可用时自动更新 Operator。
      • Manual 策略要求集群管理员批准 Operator 更新。
    5. Install
  3. 通过切换到 OperatorsInstalled Operators 页来验证 OpenShift Update Service Operator 是否已安装。
  4. 确保 OpenShift Update Service 列在所选命名空间中,StatusSucceeded

12.3.5.2. 使用 CLI 安装 OpenShift Update Service Operator

您可以使用 OpenShift CLI(oc)安装 OpenShift Update Service Operator。

流程

  1. 为 OpenShift Update Service Operator 创建命名空间:

    1. 为 OpenShift Update Service 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-recommended 集群监控。
    2. 创建命名空间:

      $ oc create -f <filename>.yaml

      例如:

      $ oc create -f update-service-namespace.yaml
  2. 通过创建以下对象来安装 OpenShift Update Service Operator:

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

      apiVersion: operators.coreos.com/v1
      kind: OperatorGroup
      metadata:
        name: update-service-operator-group
      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
      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 Update Service 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 Update Service Operator,则会成功安装。版本号可能与所示不同。

12.3.6. 创建 OpenShift Update Service 图形数据容器镜像

OpenShift Update Service 需要图形数据容器镜像,OpenShift Update Service 从中检索有关频道成员资格和阻止更新边缘的信息。图形数据通常直接从升级图形数据仓库中获取。在互联网连接不可用的环境中,从 init 容器加载此信息是使图形数据可供 OpenShift Update Service 使用的另一种方式。init 容器的角色是提供图形数据的本地副本,在 pod 初始化期间,init 容器会将数据复制到该服务可访问的卷中。

流程

  1. 创建一个 Dockerfile,如 ./Dockerfile,包含以下内容:

    FROM registry.access.redhat.com/ubi8/ubi:8.1
    
    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. 将上一步中创建的 graph-data 容器镜像推送到 OpenShift Update Service 可以访问的存储库,如 registry.example.com/openshift/graph-data:latest

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

    要将图形数据镜像推送到受限网络中的本地 registry,请将上一步中创建的 graph-data 容器镜像复制到可供 OpenShift Update Service 访问的存储库。运行 oc image mirror --help 查看可用选项。

12.3.7. 创建 OpenShift Update Service 应用程序

您可以使用 OpenShift Container Platform Web 控制台或 CLI 创建 OpenShift Update Service 应用程序。

12.3.7.1. 使用 Web 控制台创建 OpenShift Update Service 应用程序

您可以使用 OpenShift Container Platform Web 控制台使用 OpenShift Update Service Operator 创建 OpenShift Update Service 应用程序。

先决条件

  • 已安装 OpenShift Update Service Operator。
  • OpenShift Update Service graph-data 容器镜像已创建并推送到 OpenShift Update Service 访问的存储库。
  • 当前发行版本和更新目标版本已被 mirror 到本地可访问的 registry 中。

流程

  1. 在 Web 控制台中,点 OperatorsInstalled Operators
  2. 从安装的 Operator 列表中选择 OpenShift Update Service
  3. Update Service 选项卡。
  4. Create UpdateService
  5. Name 字段中输入名称,如 service
  6. Graph Data Image 字段中输入本地 pullspec,指向在"创建 OpenShift Update Service 图形数据容器镜像"中创建的图形数据容器镜像,如 registry.example.com/openshift/graph-data:latest
  7. Releases 字段中,输入创建的本地 registry 和存储库,以在"镜像 OpenShift Container Platform 镜像存储库"中包括发行镜像,例如 registry.example.com/ocp4/openshift4-release-images
  8. Replicas 字段中输入 2
  9. 单击 Create 以创建 OpenShift Update Service 应用。
  10. 验证 OpenShift Update Service 应用程序:

    • Update Service 选项卡中的 UpdateServices 列表中,点刚才创建的 Update Service 应用程序。
    • 单击 Resources 选项卡。
    • 验证每个应用资源的状态是否为 Created

12.3.7.2. 使用 CLI 创建 OpenShift Update Service 应用程序

您可以使用 OpenShift CLI(oc)来创建 OpenShift Update Service 应用。

先决条件

  • 已安装 OpenShift Update Service Operator。
  • OpenShift Update Service graph-data 容器镜像已创建并推送到 OpenShift Update Service 访问的存储库。
  • 当前发行版本和更新目标版本已被 mirror 到本地可访问的 registry 中。

流程

  1. 配置 OpenShift Update Service 目标命名空间,如 openshift-update-service

    $ NAMESPACE=openshift-update-service

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

  2. 配置 OpenShift Update Service 应用程序的名称,如 service

    $ NAME=service
  3. 按照"镜像 OpenShift Container Platform 镜像存储库"中配置,为发行镜像配置本地 registry 和存储库,如 registry.example.com/ocp4/openshift4-release-images

    $ RELEASE_IMAGES=registry.example.com/ocp4/openshift4-release-images
  4. 将 graph-data 镜像的本地 pullspec 设置为在"创建 OpenShift Update Service 图形数据容器镜像"中创建的图形数据容器镜像,如 registry.example.com/openshift/graph-data:latest:

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

    $ 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 Update Service 应用程序:

    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.10 中运行,请使用 stable-4.10

      $ 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,原因为 CreateRouteFailed caused by host must conform to DNS 1123 naming convention and must be no more than 63 characters,请尝试使用较短的名称创建 Update Service。

12.3.7.2.1. 配置 Cluster Version Operator(CVO)

安装 OpenShift Update Service Operator 并创建 OpenShift Update Service 应用程序后,可以更新 Cluster Version Operator(CVO)从本地安装的 OpenShift Update Service 中拉取图形数据。

先决条件

  • 已安装 OpenShift Update Service Operator。
  • OpenShift Update Service graph-data 容器镜像已创建并推送到 OpenShift Update Service 访问的存储库。
  • 当前发行版本和更新目标版本已被 mirror 到本地可访问的 registry 中。
  • OpenShift Update Service 应用已创建。

流程

  1. 设置 OpenShift Update Service 目标命名空间,如 openshift-update-service

    $ NAMESPACE=openshift-update-service
  2. 设置 OpenShift Update Service 应用程序的名称,如 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 配置为信任更新服务器。

12.3.8. 后续步骤

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

  • Cluster Version Operator (CVO) 被配置为使用本地安装的 OpenShift Update Service 应用程序。
  • 新发行版本的发行镜像签名配置映射应用到集群。

    注意

    发行镜像签名配置映射允许 Cluster Version Operator (CVO) 通过验证实际镜像签名是否与预期的签名匹配来确保发行镜像的完整性。

  • 当前发行版本和更新目标发行镜像被镜像到本地可访问的 registry 中。
  • 最近图数据容器镜像已镜像到本地 registry。

将集群配置为使用本地安装的 OpenShift Update Service 和本地镜像 registry 后,您可以使用以下任何更新方法: