9.3. 使用 OpenShift Update Service 在断开连接的环境中更新集群
9.3.1. 关于 OpenShift Update 服务
OpenShift Update Service (OSUS) 为 OpenShift Container Platform 提供更新,包括 Red Hat Enterprise Linux CoreOS (RHCOS)。它提供了一个图表,其中包含组件 Operator 的顶点(vertices)和连接它们的 边(edges)。图中的边代表了您可以安全更新到的版本。顶点是更新的有效负载,用于指定受管集群组件的预期状态。
集群中的 Cluster Version Operator (CVO) 会检查 OpenShift Container Platform 更新服务,并根据当前组件版本和图中的信息决定有效的更新和更新路径。当您请求更新时,CVO 使用该更新的发行镜像来升级您的集群。发行工件 (artifact) 作为容器镜像托管在 Quay 中。
为了让 OpenShift Update Service 仅提供兼容的更新,可以使用一个版本验证管道来驱动自动化过程。每个发行工件都会被验证是否与支持的云平台和系统架构以及其他组件包兼容。在管道确认有适用的版本后,OpenShift Update Service 会通知您它可用。
OpenShift Update Service 显示当前集群的所有推荐更新。如果 OpenShift Update Service 不建议升级路径,这可能是因为更新或目标发行版本存在已知问题。
两个控制器在持续更新模式下运行。第一个控制器持续更新有效负载清单,将清单应用到集群,并输出 Operator 的受控推出的状态,以指示它们是否处于可用、升级或失败状态。第二个控制器轮询 OpenShift Update Service,以确定更新是否可用。
仅支持升级到较新版本。不支持将集群还原或回滚到以前的版本。如果您的更新失败,请联系红帽支持。
在更新过程中,Machine Config Operator(MCO)将新配置应用到集群机器。MCO 会处理由 maxUnavailable
字段指定的、协调机器配置池中的节点数量,并将它们标记为不可用。在默认情况下,这个值被设置为 1
。然后,MCO 会应用新配置并重启机器。
如果您将 Red Hat Enterprise Linux (RHEL) 机器用作 worker,MCO 不会在这些机器上更新 kubelet,因为您必须首先在这些机器上更新 OpenShift API。
当新版本规格应用到旧的 kubelet 时,RHEL 机器无法返回 Ready
状态。在机器可用前,您无法完成更新。但是,因为已设置了最大不可用节点数,所以可以在一定机器无法使用的情况下,确保正常的集群操作。
OpenShift Update Service 由 Operator 和一个或多个应用程序实例组成。
在更新过程中,集群中的节点可能会临时不可用。MachineHealthCheck
可能会识别不健康的节点,并重新引导它们。为避免重新引导这样的节点,请在更新集群前删除您部署的任何 MachineHealthCheck
资源。但是,默认部署的 MachineHealthCheck 资源(如 machine-api-termination-handler
)不能被删除并重新创建。
其他资源
对于可访问互联网的集群,红帽通过 OpenShift Container Platform 更新服务提供更新建议,作为公共 API 后面的一个托管服务。但是,在断开连接的环境中的集群无法访问公共 API 来更新信息。
要在断开连接的环境中提供类似的更新体验,您可以在本地安装和配置 OpenShift Update Service,使其在断开连接的环境中可用。
以下小节介绍了如何为断开连接的集群及其底层操作系统提供更新。
9.3.2. 先决条件
-
您必须安装了
oc
命令行界面(CLI)工具。 - 您必须使用容器镜像置备本地容器镜像 registry,如镜像 OpenShift Container Platform 镜像存储库 中所述。
9.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-----
9.3.4. 更新全局集群 pull secret
您可以通过替换当前的 pull secret 或附加新的 pull secret 来更新集群的全局 pull secret。
当用户使用单独的 registry 存储镜像而不使用安装过程中的 registry时,需要这个过程。
先决条件
-
您可以使用具有
cluster-admin
角色的用户访问集群。
流程
可选: 要将新的 pull secret 附加到现有 pull secret 中,请完成以下步骤:
输入以下命令下载 pull secret:
$ oc get secret/pull-secret -n openshift-config --template='{{index .data ".dockerconfigjson" | base64decode}}' ><pull_secret_location> 1
- 1
- 提供 pull secret 文件的路径。
输入以下命令来添加新 pull secret:
$ oc registry login --registry="<registry>" \ 1 --auth-basic="<username>:<password>" \ 2 --to=<pull_secret_location> 3
另外,您可以对 pull secret 文件执行手动更新。
输入以下命令为您的集群更新全局 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 的更改不再触发节点排空或重启。
9.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。
9.3.5.1. 使用 Web 控制台安装 OpenShift Update Service Operator
您可以使用 Web 控制台安装 OpenShift Update Service Operator。
流程
在 Web 控制台中,点 Operators
OperatorHub。 注意在 Filter by keyword… 字段中输入
Update Service
,以更快地查找 Operator。从可用的 Operator 列表中选择 OpenShift Update Service,然后点 Install。
-
频道
v1
被选为 Update Channel,因为它是这个版本中唯一可用的频道。 - 在 Installation Mode 下选择 A specific namespace on the cluster。
-
为 Installed Namespace 选择一个命名空间,或接受推荐的命名空间
openshift-update-service
。 选择一个 批准策略:
- Automatic 策略允许 Operator Lifecycle Manager(OLM)在有新版本可用时自动更新 Operator。
- Manual 策略要求集群管理员批准 Operator 更新。
- 点 Install。
-
频道
-
通过切换到 Operators
Installed Operators 页来验证 OpenShift Update Service Operator 是否已安装。 - 确保 OpenShift Update Service 列在所选命名空间中,Status 为 Succeeded。
9.3.5.2. 使用 CLI 安装 OpenShift Update Service Operator
您可以使用 OpenShift CLI(oc
)安装 OpenShift Update Service Operator。
流程
为 OpenShift Update Service Operator 创建命名空间:
为 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 集群监控。
创建命名空间:
$ oc create -f <filename>.yaml
例如:
$ oc create -f update-service-namespace.yaml
通过创建以下对象来安装 OpenShift Update Service Operator:
创建一个
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
创建一个
OperatorGroup
对象:$ oc -n openshift-update-service create -f <filename>.yaml
例如:
$ oc -n openshift-update-service create -f update-service-operator-group.yaml
创建一个
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
对象的名称。
创建
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
命名空间为目标。
验证 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,则会成功安装。版本号可能与所示不同。
其他资源
9.3.6. 创建 OpenShift Update Service 图形数据容器镜像
OpenShift Update Service 需要图形数据容器镜像,OpenShift Update Service 从中检索有关频道成员资格和阻止更新边缘的信息。图形数据通常直接从升级图形数据仓库中获取。在互联网连接不可用的环境中,从 init 容器加载此信息是使图形数据可供 OpenShift Update Service 使用的另一种方式。init 容器的角色是提供图形数据的本地副本,在 pod 初始化期间,init 容器会将数据复制到该服务可访问的卷中。
流程
创建一个 Dockerfile,如
./Dockerfile
,包含以下内容:FROM registry.access.redhat.com/ubi8/ubi:8.1 RUN curl -L -o cincinnati-graph-data.tar.gz https://github.com/openshift/cincinnati-graph-data/archive/master.tar.gz CMD exec /bin/bash -c "tar xvzf cincinnati-graph-data.tar.gz -C /var/lib/cincinnati/graph-data/ --strip-components=1"
使用上一步中创建的 docker 文件来构建图形数据容器镜像,如
registry.example.com/openshift/graph-data:latest
:$ podman build -f ./Dockerfile -t registry.example.com/openshift/graph-data:latest
将上一步中创建的 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
查看可用选项。
9.3.7. 创建 OpenShift Update Service 应用程序
您可以使用 OpenShift Container Platform Web 控制台或 CLI 创建 OpenShift Update Service 应用程序。
9.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 中。
流程
-
在 Web 控制台中,点 Operators
Installed Operators。 - 从安装的 Operator 列表中选择 OpenShift Update Service。
- 点 Update Service 选项卡。
- 点 Create UpdateService。
-
在 Name 字段中输入名称,如
service
。 -
在 Graph Data Image 字段中输入本地 pullspec,指向在"创建 OpenShift Update Service 图形数据容器镜像"中创建的图形数据容器镜像,如
registry.example.com/openshift/graph-data:latest
。 -
在 Releases 字段中,输入创建的本地 registry 和存储库,以在"镜像 OpenShift Container Platform 镜像存储库"中包括发行镜像,例如
registry.example.com/ocp4/openshift4-release-images
。 -
在 Replicas 字段中输入
2
。 - 单击 Create 以创建 OpenShift Update Service 应用。
验证 OpenShift Update Service 应用程序:
- 从 Update Service 选项卡中的 UpdateServices 列表中,点刚才创建的 Update Service 应用程序。
- 单击 Resources 选项卡。
- 验证每个应用资源的状态是否为 Created。
9.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 中。
流程
配置 OpenShift Update Service 目标命名空间,如
openshift-update-service
:$ NAMESPACE=openshift-update-service
命名空间必须与 operator 组中的
targetNamespaces
值匹配。配置 OpenShift Update Service 应用程序的名称,如
service
:$ NAME=service
按照"镜像 OpenShift Container Platform 镜像存储库"中配置,为发行镜像配置本地 registry 和存储库,如
registry.example.com/ocp4/openshift4-release-images
:$ RELEASE_IMAGES=registry.example.com/ocp4/openshift4-release-images
将 graph-data 镜像的本地 pullspec 设置为在"创建 OpenShift Update Service 图形数据容器镜像"中创建的图形数据容器镜像,如
registry.example.com/openshift/graph-data:latest
:$ GRAPH_DATA_IMAGE=registry.example.com/openshift/graph-data:latest
创建 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
验证 OpenShift Update Service 应用程序:
使用以下命令获取策略引擎路由:
$ 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
您可能需要轮询,直到命令成功为止。
从策略引擎检索图形。确保为
channel
指定一个有效版本。例如,如果在 OpenShift Container Platform 4.8 中运行,请使用stable-4.8
:$ 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。
9.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 应用已创建。
流程
设置 OpenShift Update Service 目标命名空间,如
openshift-update-service
:$ NAMESPACE=openshift-update-service
设置 OpenShift Update Service 应用程序的名称,如
service
:$ NAME=service
获取策略引擎路由:
$ POLICY_ENGINE_GRAPH_URI="$(oc -n "${NAMESPACE}" get -o jsonpath='{.status.policyEngineURI}/api/upgrades_info/v1/graph{"\n"}' updateservice "${NAME}")"
为拉取图形数据设置补丁:
$ PATCH="{\"spec\":{\"upstream\":\"${POLICY_ENGINE_GRAPH_URI}\"}}"
对 CVO 进行补丁以使用本地 OpenShift 更新服务:
$ oc patch clusterversion version -p $PATCH --type merge
请参阅启用集群范围代理以将 CA 配置为信任更新服务器。
9.3.8. 删除 OpenShift Update Service 应用程序
您可以使用 OpenShift Container Platform Web 控制台或 CLI 删除 OpenShift Update Service 应用程序。
9.3.8.1. 使用 Web 控制台删除 OpenShift Update Service 应用程序
您可以使用 OpenShift Container Platform Web 控制台使用 OpenShift Update Service Operator 删除 OpenShift Update Service 应用程序。
先决条件
- 已安装 OpenShift Update Service Operator。
流程
-
在 Web 控制台中,点 Operators
Installed Operators。 - 从安装的 Operator 列表中选择 OpenShift Update Service。
- 点 Update Service 选项卡。
- 从安装的 OpenShift Update Service 应用列表中,选择要删除的应用,然后单击 Delete UpdateService。
- 从 Delete UpdateService? 确认对话框中,单击 Delete 以确认删除。
9.3.8.2. 使用 CLI 删除 OpenShift Update Service 应用程序
您可以使用 OpenShift CLI(oc
)删除 OpenShift Update Service 应用。
流程
使用 OpenShift Update Service 应用程序在其中创建的命名空间获取 OpenShift Update Service 应用程序的名称,如
openshift-update-service
:$ oc get updateservice -n openshift-update-service
输出示例
NAME AGE service 6s
使用上一步中的
NAME
值以及 OpenShift Update Service 应用程序创建命名空间删除 OpenShift Update Service 应用程序,如openshift-update-service
:$ oc delete updateservice service -n openshift-update-service
输出示例
updateservice.updateservice.operator.openshift.io "service" deleted
9.3.9. 卸载 OpenShift Update Service Operator
要卸载 OpenShift Update Service,首先需要使用 OpenShift Container Platform Web 控制台或 CLI 删除所有 OpenShift Update Service 应用程序。
9.3.9.1. 使用 Web 控制台卸载 OpenShift Update Service Operator
您可以使用 OpenShift Container Platform Web 控制台卸载 OpenShift Update Service Operator。
先决条件
- 所有 OpenShift Update Service 应用都已删除。
流程
-
在 Web 控制台中,点 Operators
Installed Operators。 - 从安装的 Operator 列表中选择 OpenShift Update Service 并点 Uninstall Operator。
- 在 Uninstall Operator? 确认对话框中点 Uninstall 确认卸载。
9.3.9.2. 使用 CLI 卸载 OpenShift Update Service Operator
您可以使用 OpenShift CLI(oc
)卸载 OpenShift Update Service Operator。
先决条件
- 所有 OpenShift Update Service 应用都已删除。
流程
更改到包含 OpenShift Update Service Operator 的项目,如
openshift-update-service
:$ oc project openshift-update-service
输出示例
Now using project "openshift-update-service" on server "https://example.com:6443".
获取 OpenShift Update Service Operator operator 组的名称:
$ oc get operatorgroup
输出示例
NAME AGE openshift-update-service-fprx2 4m41s
删除 operator 组,如
openshift-update-service-fprx2
:$ oc delete operatorgroup openshift-update-service-fprx2
输出示例
operatorgroup.operators.coreos.com "openshift-update-service-fprx2" deleted
获取 OpenShift Update Service Operator 订阅的名称:
$ oc get subscription
输出示例
NAME PACKAGE SOURCE CHANNEL update-service-operator update-service-operator updateservice-index-catalog v1
使用上一步中的
Name
值,在currentCSV
字段中检查订阅的 OpenShift Update Service Operator 的当前版本:$ oc get subscription update-service-operator -o yaml | grep " currentCSV"
输出示例
currentCSV: update-service-operator.v0.0.1
删除订阅,如
update-service-operator
:$ oc delete subscription update-service-operator
输出示例
subscription.operators.coreos.com "update-service-operator" deleted
使用上一步中的
currentCSV
值删除 OpenShift Update Service Operator 的 CSV:$ oc delete clusterserviceversion update-service-operator.v0.0.1
输出示例
clusterserviceversion.operators.coreos.com "update-service-operator.v0.0.1" deleted