×

您可以对 OpenShift Container Platform 集群执行次要版本和补丁更新。如果您的集群包含 Red Hat Enterprise Linux (RHEL) 机器,则必须采取额外步骤来更新这些机器。

在 OpenShift Container Platform 集群上使用 RHEL 计算机已被弃用,并将在未来版本中移除。

先决条件

  • 以具有 admin 权限的用户身份访问集群。请参阅 使用 RBAC 定义和应用权限

  • 拥有最新的 etcd 备份,以防更新失败并且必须将集群恢复到之前的状态。

  • 您的 RHEL7 工作节点将被 RHEL8 或 RHCOS 工作节点替换。Red Hat 不支持对 RHEL 工作节点进行 RHEL7 到 RHEL8 的就地更新;必须使用干净的操作系统安装替换这些主机。

  • 如果您的集群使用手动维护的凭据,请更新新版本的云提供商资源。有关更多信息(包括如何确定这是否是集群的要求),请参阅 准备更新具有手动维护凭据的集群

  • 如果您运行 Operator 或已使用 Pod 中断预算配置任何应用程序,则在更新过程中可能会遇到中断。如果在 PodDisruptionBudget 中将 minAvailable 设置为 1,则会清空节点以应用挂起的机器配置,这可能会阻止驱逐过程。如果重新引导多个节点,所有 Pod 都可能只在一个节点上运行,并且 PodDisruptionBudget 字段可以阻止节点清空。

使用 Web 控制台更新集群

如果可用更新,您可以从 Web 控制台更新集群。

您可以在客户门户的 勘误部分 中找到有关可用的 OpenShift Container Platform 安全公告和更新的信息。

先决条件
  • 以具有 cluster-admin 权限的用户身份访问 Web 控制台。

  • 您可以访问 OpenShift Container Platform Web 控制台。

  • 暂停所有 MachineHealthCheck 资源。

  • 您已将之前通过 Operator Lifecycle Manager (OLM) 安装的所有 Operator 更新到与目标版本兼容的版本。更新 Operator 可确保它们在集群更新期间默认 OperatorHub 目录从当前次要版本切换到下一个版本时具有有效的更新路径。有关如何检查兼容性以及如何在必要时更新已安装的 Operator 的更多信息,请参阅“其他资源”部分中的“更新已安装的 Operator”。

  • 您的机器配置池 (MCP) 正在运行并且未暂停。在更新过程中会跳过与已暂停 MCP 关联的节点。如果您正在执行金丝雀发布更新策略,则可以暂停 MCP。

  • 您的 RHEL7 工作节点将被 RHEL8 或 RHCOS 工作节点替换。Red Hat 不支持对 RHEL 工作节点进行 RHEL7 到 RHEL8 的就地更新;必须使用干净的操作系统安装替换这些主机。

步骤
  1. 在 Web 控制台中,单击**管理** → **集群设置**,并查看**详细信息**选项卡的内容。

  2. 对于生产集群,请确保**通道**设置为要更新到的版本的正确通道,例如 stable-4.17

    对于生产集群,您必须订阅 stable-*eus-*fast-* 通道。

    当您准备好转到下一个次要版本时,请选择与该次要版本对应的通道。越早声明更新通道,集群就越能有效地推荐更新路径到您的目标版本。集群可能需要一些时间来评估所有可用的更新选项,并提供最佳的更新建议供您选择。更新建议可能会随着时间的推移而改变,因为它们基于当时可用的更新选项。

    如果您看不到到目标次要版本的更新路径,请继续将集群更新到当前版本的最新补丁版本,直到下一个次要版本在路径中可用。

    • 如果**更新状态**不是**可用更新**,则无法更新集群。

    • **选择通道**指示集群正在运行或正在更新到的集群版本。

  3. 选择要更新到的版本,然后单击**保存**。

    输入通道的**更新状态**将变为**正在更新至<产品版本>**,您可以通过观察操作员和节点的进度条来查看集群更新的进度。

    如果您正在将集群更新到下一个次要版本(例如,从 4.10 版更新到 4.11 版),请在部署依赖于新功能的工作负载之前确认您的节点已更新。任何包含尚未更新的工作节点的池都将显示在**集群设置**页面上。

  4. 更新完成后且集群版本操作员刷新了可用的更新后,请检查当前通道中是否有更多可用更新。

    • 如果有可用更新,请继续在当前通道中执行更新,直到无法再更新为止。

    • 如果没有可用更新,请将**通道**更改为下一个次要版本的stable-*eus-*fast-*通道,然后更新到该通道中所需的版本。

    您可能需要执行几个中间更新才能达到所需的版本。

    更新包含 Red Hat Enterprise Linux (RHEL) 工作机的集群时,这些工作机在更新过程中将暂时不可用。您必须针对每台进入集群NotReady状态的 RHEL 机器运行更新剧本,才能完成集群更新。

可选:添加挂钩以在 RHEL 机器上执行 Ansible 任务

您可以使用挂钩在 OpenShift Container Platform 更新期间在 RHEL 计算机器上运行 Ansible 任务。

关于更新的 Ansible 挂钩

更新 OpenShift Container Platform 时,您可以使用挂钩在特定操作期间在 Red Hat Enterprise Linux (RHEL) 节点上运行自定义任务。挂钩允许您提供定义在特定更新任务之前或之后运行的任务的文件。在更新 OpenShift Container Platform 集群中的 RHEL 计算节点时,您可以使用挂钩来验证或修改自定义基础架构。

由于挂钩失败会导致操作失败,因此您必须设计幂等的挂钩,或者可以多次运行并提供相同的结果。

挂钩具有以下重要限制:- 挂钩没有定义或版本化的接口。它们可以使用内部openshift-ansible变量,但这些变量可能会在将来的 OpenShift Container Platform 版本中被修改或删除。- 挂钩没有错误处理,因此挂钩中的错误会停止更新过程。如果出现错误,您必须解决问题,然后重新启动更新。

配置 Ansible 清单文件以使用挂钩

更新 Red Hat Enterprise Linux (RHEL) 计算机(也称为工作机)时,您需要在hosts清单文件的all:vars部分定义要使用的挂钩。

先决条件
  • 您可以访问用于添加 RHEL 计算机集群的机器。您必须访问定义 RHEL 机器的hosts Ansible 清单文件。

步骤
  1. 设计挂钩后,创建一个 YAML 文件来定义它的 Ansible 任务。此文件必须是一组任务,不能是剧本,如下例所示

    ---
    # Trivial example forcing an operator to acknowledge the start of an upgrade
    # file=/home/user/openshift-ansible/hooks/pre_compute.yml
    
    - name: note the start of a compute machine update
      debug:
          msg: "Compute machine upgrade of {{ inventory_hostname }} is about to start"
    
    - name: require the user agree to start an upgrade
      pause:
          prompt: "Press Enter to start the compute machine update"
  2. 修改hosts Ansible 清单文件以指定挂钩文件。挂钩文件在[all:vars]部分中作为参数值指定,如下所示

    清单文件中的挂钩定义示例
    [all:vars]
    openshift_node_pre_upgrade_hook=/home/user/openshift-ansible/hooks/pre_node.yml
    openshift_node_post_upgrade_hook=/home/user/openshift-ansible/hooks/post_node.yml

    为避免挂钩路径不明确,请使用绝对路径而不是相对路径进行定义。

RHEL 计算机的可用挂钩

更新 OpenShift Container Platform 集群中的 Red Hat Enterprise Linux (RHEL) 计算机时,可以使用以下挂钩。

挂钩名称 描述

openshift_node_pre_cordon_hook

  • 在隔离每个节点**之前**运行。

  • 此挂钩将按顺序针对**每个节点**运行。

  • 如果任务必须针对不同的主机运行,则任务必须使用delegate_tolocal_action

openshift_node_pre_upgrade_hook

  • 在隔离每个节点**之后**但更新**之前**运行。

  • 此挂钩将按顺序针对**每个节点**运行。

  • 如果任务必须针对不同的主机运行,则任务必须使用delegate_tolocal_action

openshift_node_pre_uncordon_hook

  • 在更新每个节点**之后**但取消隔离**之前**运行。

  • 此挂钩将按顺序针对**每个节点**运行。

  • 如果任务必须针对不同的主机运行,则任务必须使用delegate_tolocal_action

openshift_node_post_upgrade_hook

  • 在每个节点取消隔离**之后**运行。这是**最后一个**节点更新操作。

  • 此挂钩将按顺序针对**每个节点**运行。

  • 如果任务必须针对不同的主机运行,则任务必须使用delegate_tolocal_action

更新集群中的 RHEL 计算机

更新集群后,必须更新集群中的 Red Hat Enterprise Linux (RHEL) 计算机。

RHEL 计算机支持 Red Hat Enterprise Linux (RHEL) 8.6 及更高版本。

如果您使用 RHEL 作为操作系统,也可以将计算机更新到 OpenShift Container Platform 的另一个次要版本。执行次要版本更新时,无需从 RHEL 中排除任何 RPM 包。

无法将 RHEL 7 计算机更新到 RHEL 8。必须部署新的 RHEL 8 主机,并且应删除旧的 RHEL 7 主机。

先决条件
  • 您已更新集群。

    由于 RHEL 机器需要集群生成的资产才能完成更新过程,因此必须先更新集群,然后再更新其中的 RHEL 工作机。

  • 您可以访问用于将 RHEL 计算机添加到集群的本地机器。您必须访问定义 RHEL 机器的hosts Ansible 清单文件和upgrade剧本。

  • 对于次要版本的更新,RPM 存储库使用与集群上运行的 OpenShift Container Platform 相同的版本。

步骤
  1. 停止并禁用主机上的 firewalld

    # systemctl disable --now firewalld.service

    默认情况下,使用“最小”安装选项的基本操作系统 RHEL 会启用 firewalld 服务。在主机上启用 firewalld 服务会阻止您访问工作机上的 OpenShift Container Platform 日志。如果您希望继续访问工作机上的 OpenShift Container Platform 日志,则以后不要启用 firewalld。

  2. 启用 OpenShift Container Platform 4.17 所需的存储库

    1. 在运行 Ansible 剧本的机器上,更新所需的存储库

      # subscription-manager repos --disable=rhocp-4.16-for-rhel-8-x86_64-rpms \
                                   --enable=rhocp-4.17-for-rhel-8-x86_64-rpms

      从 OpenShift Container Platform 4.11 开始,仅为 RHEL 8 提供 Ansible 剧本。如果 RHEL 7 系统用作 OpenShift Container Platform 4.10 Ansible 剧本的主机,则必须将 Ansible 主机更新到 RHEL 8,或在 RHEL 8 系统上创建一个新的 Ansible 主机并将清单从旧的 Ansible 主机复制过来。

    2. 在运行 Ansible 剧本的机器上,更新 Ansible 包

      # yum swap ansible ansible-core
    3. 在运行 Ansible 剧本的机器上,更新所需的包,包括openshift-ansible

      # yum update openshift-ansible openshift-clients
    4. 在每个 RHEL 计算节点上,更新所需的存储库

      # subscription-manager repos --disable=rhocp-4.16-for-rhel-8-x86_64-rpms \
                                   --enable=rhocp-4.17-for-rhel-8-x86_64-rpms
  3. 更新 RHEL 工作节点机器

    1. 查看您的 Ansible inventory 文件(位于 /<path>/inventory/hosts)并更新其内容,以便将 RHEL 8 机器列在 [workers] 部分中,如下例所示:

      [all:vars]
      ansible_user=root
      #ansible_become=True
      
      openshift_kubeconfig_path="~/.kube/config"
      
      [workers]
      mycluster-rhel8-0.example.com
      mycluster-rhel8-1.example.com
      mycluster-rhel8-2.example.com
      mycluster-rhel8-3.example.com
    2. 切换到 openshift-ansible 目录

      $ cd /usr/share/ansible/openshift-ansible
    3. 运行 upgrade playbook

      $ ansible-playbook -i /<path>/inventory/hosts playbooks/upgrade.yml (1)
      1 对于 <path>,请指定您创建的 Ansible inventory 文件的路径。

      upgrade playbook 只更新 OpenShift Container Platform 包。它不会更新操作系统包。

  4. 更新所有工作节点后,确认所有集群节点都已更新到新版本

    # oc get node
    示例输出
    NAME                        STATUS                        ROLES    AGE    VERSION
    mycluster-control-plane-0   Ready                         master   145m   v1.30.3
    mycluster-control-plane-1   Ready                         master   145m   v1.30.3
    mycluster-control-plane-2   Ready                         master   145m   v1.30.3
    mycluster-rhel8-0           Ready                         worker   98m    v1.30.3
    mycluster-rhel8-1           Ready                         worker   98m    v1.30.3
    mycluster-rhel8-2           Ready                         worker   98m    v1.30.3
    mycluster-rhel8-3           Ready                         worker   98m    v1.30.3
  5. 可选:更新未由 upgrade playbook 更新的操作系统包。要更新非 4.17 版本的包,请使用以下命令:

    # yum update

    如果您使用的是安装 4.17 时使用的相同 RPM 仓库,则无需排除 RPM 包。