×

您可以使用拓扑感知生命周期管理器 (TALM) 来管理多个集群的软件生命周期。TALM 使用 Red Hat Advanced Cluster Management (RHACM) 策略对目标集群执行更改。

将 PolicyGenerator 资源与 GitOps ZTP 一起使用仅是技术预览功能。技术预览功能不受 Red Hat 生产服务级别协议 (SLA) 的支持,并且可能功能不完整。Red Hat 不建议在生产环境中使用它们。这些功能可让您抢先体验即将推出的产品功能,使客户能够在开发过程中测试功能并提供反馈。

有关 Red Hat 技术预览功能的支持范围的更多信息,请参见 技术预览功能支持范围

关于拓扑感知生命周期管理器配置

拓扑感知生命周期管理器 (TALM) 管理一个或多个 OpenShift Container Platform 集群的 Red Hat Advanced Cluster Management (RHACM) 策略的部署。在大型集群网络中使用 TALM 允许分阶段将策略分批次地推出到集群。这有助于在更新时最大限度地减少可能的服務中断。使用 TALM,您可以控制以下操作

  • 更新的时间

  • RHACM 托管集群的数量

  • 要应用策略的托管集群的子集

  • 集群的更新顺序

  • 应用于集群的策略集

  • 应用于集群的策略顺序

  • 金丝雀集群的分配

对于单节点 OpenShift,拓扑感知生命周期管理器 (TALM) 为带宽有限的集群提供镜像预缓存。

TALM 支持 OpenShift Container Platform y 流和 z 流更新的编排,以及 y 流和 z 流上的第二天操作。

关于与拓扑感知生命周期管理器一起使用的托管策略

拓扑感知生命周期管理器 (TALM) 使用 RHACM 策略进行集群更新。

TALM 可用于管理任何策略 CR 的推出,其中remediationAction 字段设置为inform。支持的用例包括以下内容

  • 手动创建策略 CR

  • PolicyGeneratorPolicyGentemplate 自定义资源定义 (CRD) 自动生成的策略

对于使用手动批准更新 Operator 订阅的策略,TALM 提供了批准安装更新的 Operator 的附加功能。

有关托管策略的更多信息,请参阅 RHACM 文档中的 策略概述

使用 Web 控制台安装拓扑感知生命周期管理器

您可以使用 OpenShift Container Platform Web 控制台安装拓扑感知生命周期管理器。

先决条件
  • 安装最新版本的 RHACM Operator。

  • TALM 需要 RHACM 2.9 或更高版本。

  • 使用断开连接的注册表设置中心集群。

  • 以具有cluster-admin权限的用户身份登录。

步骤
  1. 在 OpenShift Container Platform Web 控制台中,导航到**Operators** → **OperatorHub**。

  2. 从可用 Operators 列表中搜索**拓扑感知生命周期管理器**,然后单击**安装**。

  3. 保留**安装模式** ["集群上的所有命名空间(默认)"] 和**已安装命名空间** ("openshift-operators") 的默认选择,以确保 Operator 正确安装。

  4. 单击**安装**。

验证

要确认安装成功

  1. 导航到**Operators** → **已安装 Operators** 页面。

  2. 检查 Operator 是否已安装在All Namespaces 命名空间中,并且其状态为Succeeded

如果 Operator 未成功安装

  1. 导航到**Operators** → **已安装 Operators** 页面,并检查Status 列中是否存在任何错误或故障。

  2. 导航到**Workloads** → **Pods** 页面,并检查cluster-group-upgrades-controller-manager pod 中任何报告问题的容器中的日志。

使用 CLI 安装拓扑感知生命周期管理器

您可以使用 OpenShift CLI (oc) 安装拓扑感知生命周期管理器 (TALM)。

先决条件
  • 安装 OpenShift CLI (oc)。

  • 安装最新版本的 RHACM Operator。

  • TALM 需要 RHACM 2.9 或更高版本。

  • 使用断开连接的注册表设置中心集群。

  • 以具有cluster-admin权限的用户身份登录。

步骤
  1. 创建Subscription CR

    1. 定义Subscription CR 并保存 YAML 文件,例如talm-subscription.yaml

      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        name: openshift-topology-aware-lifecycle-manager-subscription
        namespace: openshift-operators
      spec:
        channel: "stable"
        name: topology-aware-lifecycle-manager
        source: redhat-operators
        sourceNamespace: openshift-marketplace
    2. 运行以下命令创建Subscription CR

      $ oc create -f talm-subscription.yaml
验证
  1. 通过检查 CSV 资源来验证安装是否成功

    $ oc get csv -n openshift-operators
    示例输出
    NAME                                                   DISPLAY                            VERSION               REPLACES                           PHASE
    topology-aware-lifecycle-manager.4.17.x   Topology Aware Lifecycle Manager   4.17.x                                      Succeeded
  2. 验证 TALM 是否已启动并正在运行

    $ oc get deploy -n openshift-operators
    示例输出
    NAMESPACE                                          NAME                                             READY   UP-TO-DATE   AVAILABLE   AGE
    openshift-operators                                cluster-group-upgrades-controller-manager        1/1     1            1           14s

关于 ClusterGroupUpgrade CR

拓扑感知生命周期管理器 (TALM) 从一组集群的ClusterGroupUpgrade CR 构建补救计划。您可以在ClusterGroupUpgrade CR 中定义以下规范

  • 组中的集群

  • 阻止ClusterGroupUpgrade CR

  • 适用的托管策略列表

  • 并发更新的数量

  • 适用的金丝雀更新

  • 在更新之前和之后要执行的操作

  • 更新时间

您可以使用ClusterGroupUpgrade CR 中的enable字段来控制更新的开始时间。例如,如果您有四个小时的计划维护窗口,您可以准备一个enable字段设置为falseClusterGroupUpgrade CR。

您可以通过配置以下spec.remediationStrategy.timeout设置来设置超时

spec
  remediationStrategy:
          maxConcurrency: 1
          timeout: 240

您可以使用batchTimeoutAction来确定如果集群更新失败会发生什么。您可以指定continue来跳过失败的集群并继续升级其他集群,或者指定abort来停止所有集群的策略补救。超时过后,TALM 将删除所有enforce策略,以确保不会对集群进行进一步更新。

要应用更改,请将enabled字段设置为true

更多信息,请参见“将更新策略应用于托管集群”部分。

当TALM处理对指定集群的策略修复时,ClusterGroupUpgrade CR可以报告多种条件的真假状态。

TALM完成集群更新后,集群不会在同一ClusterGroupUpgrade CR的控制下再次更新。在以下情况下,您必须创建一个新的ClusterGroupUpgrade CR

  • 当您需要再次更新集群时

  • 当集群在更新后不符合inform策略时

选择集群

TALM构建修复计划并基于以下字段选择集群

  • clusterLabelSelector字段指定要更新的集群的标签。它由来自k8s.io/apimachinery/pkg/apis/meta/v1的标准标签选择器列表组成。列表中的每个选择器都使用标签值对或标签表达式。来自每个选择器的匹配项将添加到最终的集群列表中,以及来自clusterSelector字段和cluster字段的匹配项。

  • clusters字段指定要更新的集群列表。

  • canaries字段指定用于金丝雀更新的集群。

  • maxConcurrency字段指定批量更新的集群数量。

  • actions字段指定TALM在开始更新过程时采取的beforeEnable操作,以及TALM在完成每个集群的策略修复时采取的afterCompletion操作。

您可以将clustersclusterLabelSelectorclusterSelector字段一起使用以创建一个组合的集群列表。

修复计划从canaries字段中列出的集群开始。每个金丝雀集群构成一个单集群批次。

enabled字段设置为false的示例ClusterGroupUpgrade CR
apiVersion: ran.openshift.io/v1alpha1
kind: ClusterGroupUpgrade
metadata:
  creationTimestamp: '2022-11-18T16:27:15Z'
  finalizers:
    - ran.openshift.io/cleanup-finalizer
  generation: 1
  name: talm-cgu
  namespace: talm-namespace
  resourceVersion: '40451823'
  uid: cca245a5-4bca-45fa-89c0-aa6af81a596c
Spec:
  actions:
    afterCompletion: (1)
      addClusterLabels:
        upgrade-done: ""
      deleteClusterLabels:
        upgrade-running: ""
      deleteObjects: true
    beforeEnable: (2)
      addClusterLabels:
        upgrade-running: ""
  clusters: (3)
    - spoke1
  enable: false (4)
  managedPolicies: (5)
    - talm-policy
  preCaching: false
  remediationStrategy: (6)
    canaries: (7)
        - spoke1
    maxConcurrency: 2 (8)
    timeout: 240
  clusterLabelSelectors: (9)
    - matchExpressions:
      - key: label1
      operator: In
      values:
        - value1a
        - value1b
  batchTimeoutAction: (10)
status: (11)
    computedMaxConcurrency: 2
    conditions:
      - lastTransitionTime: '2022-11-18T16:27:15Z'
        message: All selected clusters are valid
        reason: ClusterSelectionCompleted
        status: 'True'
        type: ClustersSelected (12)
      - lastTransitionTime: '2022-11-18T16:27:15Z'
        message: Completed validation
        reason: ValidationCompleted
        status: 'True'
        type: Validated (13)
      - lastTransitionTime: '2022-11-18T16:37:16Z'
        message: Not enabled
        reason: NotEnabled
        status: 'False'
        type: Progressing
    managedPoliciesForUpgrade:
      - name: talm-policy
        namespace: talm-namespace
    managedPoliciesNs:
      talm-policy: talm-namespace
    remediationPlan:
      - - spoke1
      - - spoke2
        - spoke3
    status:
1 指定TALM在完成每个集群的策略修复时采取的操作。
2 指定TALM在开始更新过程时采取的操作。
3 定义要更新的集群列表。
4 enable字段设置为false
5 列出要修复的用户定义策略集。
6 定义集群更新的细节。
7 定义金丝雀更新的集群。
8 定义批次中并发更新的最大数量。修复批次的数目等于金丝雀集群的数量,加上除金丝雀集群外的集群数量,再除以maxConcurrency值。已经符合所有托管策略的集群将从修复计划中排除。
9 显示选择集群的参数。
10 控制批处理超时时发生的情况。可能的值为abortcontinue。如果未指定,则默认为continue
11 显示有关更新状态的信息。
12 ClustersSelected条件显示所有选定的集群都是有效的。
13 Validated条件显示所有选定的集群都已验证。

金丝雀集群更新期间的任何故障都会停止更新过程。

成功创建修复计划后,您可以将enable字段设置为true,然后TALM开始使用指定的托管策略更新不符合要求的集群。

只有当ClusterGroupUpgrade CR的enable字段设置为false时,才能更改spec字段。

验证

TALM检查所有指定的托管策略是否可用且正确,并使用Validated条件报告如下状态和原因

  • true

    验证已完成。

  • false

    策略缺失或无效,或者指定了无效的平台镜像。

预缓存

集群可能带宽有限,无法访问容器镜像注册表,这可能会导致在更新完成之前超时。在单节点OpenShift集群上,您可以使用预缓存来避免这种情况。当您创建preCaching字段设置为trueClusterGroupUpgrade CR时,容器镜像预缓存开始。TALM将可用磁盘空间与估计的OpenShift Container Platform镜像大小进行比较,以确保有足够的可用空间。如果集群空间不足,TALM将取消该集群的预缓存,并且不会对其进行策略修复。

TALM使用PrecacheSpecValid条件报告如下状态信息

  • true

    预缓存规范有效且一致。

  • false

    预缓存规范不完整。

TALM使用PrecachingSucceeded条件报告如下状态信息

  • true

    TALM已结束预缓存过程。如果任何集群的预缓存失败,则该集群的更新将失败,但其他集群的更新将继续进行。如果任何集群的预缓存失败,则会显示一条消息通知您。

  • false

    一个或多个集群的预缓存仍在进行中,或者所有集群的预缓存都已失败。

更多信息,请参见“使用容器镜像预缓存功能”部分。

更新集群

TALM按照修复计划执行策略。对后续批次的策略执行会在当前批次的所有集群都符合所有托管策略后立即开始。如果批次超时,TALM将转到下一个批次。批次的超时值是spec.timeout字段除以修复计划中的批次数。

TALM使用Progressing条件报告如下状态和原因

  • true

    TALM正在修复不符合要求的策略。

  • false

    更新未进行中。可能的原因如下:

    • 所有集群都符合所有托管策略。

    • 由于策略修复时间过长,更新超时。

    • 系统中缺少阻止性CR,或者阻止性CR尚未完成。

    • ClusterGroupUpgrade CR未启用。

托管策略按其在ClusterGroupUpgrade CR的managedPolicies字段中列出的顺序应用。一次只对指定的集群应用一个托管策略。当集群符合当前策略时,将对其应用下一个托管策略。

处于Progressing状态的示例ClusterGroupUpgrade CR
apiVersion: ran.openshift.io/v1alpha1
kind: ClusterGroupUpgrade
metadata:
  creationTimestamp: '2022-11-18T16:27:15Z'
  finalizers:
    - ran.openshift.io/cleanup-finalizer
  generation: 1
  name: talm-cgu
  namespace: talm-namespace
  resourceVersion: '40451823'
  uid: cca245a5-4bca-45fa-89c0-aa6af81a596c
Spec:
  actions:
    afterCompletion:
      deleteObjects: true
    beforeEnable: {}
  clusters:
    - spoke1
  enable: true
  managedPolicies:
    - talm-policy
  preCaching: true
  remediationStrategy:
    canaries:
        - spoke1
    maxConcurrency: 2
    timeout: 240
  clusterLabelSelectors:
    - matchExpressions:
      - key: label1
      operator: In
      values:
        - value1a
        - value1b
  batchTimeoutAction:
status:
    clusters:
      - name: spoke1
        state: complete
    computedMaxConcurrency: 2
    conditions:
      - lastTransitionTime: '2022-11-18T16:27:15Z'
        message: All selected clusters are valid
        reason: ClusterSelectionCompleted
        status: 'True'
        type: ClustersSelected
      - lastTransitionTime: '2022-11-18T16:27:15Z'
        message: Completed validation
        reason: ValidationCompleted
        status: 'True'
        type: Validated
      - lastTransitionTime: '2022-11-18T16:37:16Z'
        message: Remediating non-compliant policies
        reason: InProgress
        status: 'True'
        type: Progressing (1)
    managedPoliciesForUpgrade:
      - name: talm-policy
        namespace: talm-namespace
    managedPoliciesNs:
      talm-policy: talm-namespace
    remediationPlan:
      - - spoke1
      - - spoke2
        - spoke3
    status:
      currentBatch: 2
      currentBatchRemediationProgress:
        spoke2:
          state: Completed
        spoke3:
          policyIndex: 0
          state: InProgress
      currentBatchStartedAt: '2022-11-18T16:27:16Z'
      startedAt: '2022-11-18T16:27:15Z'
1 Progressing字段显示TALM正在修复策略。

更新状态

TALM使用Succeeded条件报告如下状态和原因

  • true

    所有集群都符合指定的托管策略。

  • false

    策略修复失败,因为没有可用于修复的集群,或者因为策略修复时间过长,原因如下:

    • 当前批次包含金丝雀更新,并且批次中的集群未遵守批次超时内的所有托管策略。

    • 集群在remediationStrategy字段中指定的timeout值内未遵守托管策略。

处于Succeeded状态的示例ClusterGroupUpgrade CR
    apiVersion: ran.openshift.io/v1alpha1
    kind: ClusterGroupUpgrade
    metadata:
      name: cgu-upgrade-complete
      namespace: default
    spec:
      clusters:
      - spoke1
      - spoke4
      enable: true
      managedPolicies:
      - policy1-common-cluster-version-policy
      - policy2-common-pao-sub-policy
      remediationStrategy:
        maxConcurrency: 1
        timeout: 240
    status: (3)
      clusters:
        - name: spoke1
          state: complete
        - name: spoke4
          state: complete
      conditions:
      - message: All selected clusters are valid
        reason: ClusterSelectionCompleted
        status: "True"
        type: ClustersSelected
      - message: Completed validation
        reason: ValidationCompleted
        status: "True"
        type: Validated
      - message: All clusters are compliant with all the managed policies
        reason: Completed
        status: "False"
        type: Progressing (1)
      - message: All clusters are compliant with all the managed policies
        reason: Completed
        status: "True"
        type: Succeeded (2)
      managedPoliciesForUpgrade:
      - name: policy1-common-cluster-version-policy
        namespace: default
      - name: policy2-common-pao-sub-policy
        namespace: default
      remediationPlan:
      - - spoke1
      - - spoke4
      status:
        completedAt: '2022-11-18T16:27:16Z'
        startedAt: '2022-11-18T16:27:15Z'
1 Progressing字段中,状态为false,因为更新已完成;集群符合所有托管策略。
2 Succeeded字段显示验证已成功完成。
3 status字段包含集群及其各自状态的列表。集群的状态可以是completetimedout
处于timedout状态的示例ClusterGroupUpgrade CR
apiVersion: ran.openshift.io/v1alpha1
kind: ClusterGroupUpgrade
metadata:
  creationTimestamp: '2022-11-18T16:27:15Z'
  finalizers:
    - ran.openshift.io/cleanup-finalizer
  generation: 1
  name: talm-cgu
  namespace: talm-namespace
  resourceVersion: '40451823'
  uid: cca245a5-4bca-45fa-89c0-aa6af81a596c
spec:
  actions:
    afterCompletion:
      deleteObjects: true
    beforeEnable: {}
  clusters:
    - spoke1
    - spoke2
  enable: true
  managedPolicies:
    - talm-policy
  preCaching: false
  remediationStrategy:
    maxConcurrency: 2
    timeout: 240
status:
  clusters:
    - name: spoke1
      state: complete
    - currentPolicy: (1)
        name: talm-policy
        status: NonCompliant
      name: spoke2
      state: timedout
  computedMaxConcurrency: 2
  conditions:
    - lastTransitionTime: '2022-11-18T16:27:15Z'
      message: All selected clusters are valid
      reason: ClusterSelectionCompleted
      status: 'True'
      type: ClustersSelected
    - lastTransitionTime: '2022-11-18T16:27:15Z'
      message: Completed validation
      reason: ValidationCompleted
      status: 'True'
      type: Validated
    - lastTransitionTime: '2022-11-18T16:37:16Z'
      message: Policy remediation took too long
      reason: TimedOut
      status: 'False'
      type: Progressing
    - lastTransitionTime: '2022-11-18T16:37:16Z'
      message: Policy remediation took too long
      reason: TimedOut
      status: 'False'
      type: Succeeded (2)
  managedPoliciesForUpgrade:
    - name: talm-policy
      namespace: talm-namespace
  managedPoliciesNs:
    talm-policy: talm-namespace
  remediationPlan:
    - - spoke1
      - spoke2
  status:
        startedAt: '2022-11-18T16:27:15Z'
        completedAt: '2022-11-18T20:27:15Z'
1 如果集群的状态为timedout,则currentPolicy字段将显示策略的名称和策略状态。
2 succeeded的状态为false,并且消息指示策略修复耗时太长。

阻止ClusterGroupUpgrade CR

您可以创建多个ClusterGroupUpgrade CR 并控制它们的应用顺序。

例如,如果您创建阻止ClusterGroupUpgrade CR A 启动的ClusterGroupUpgrade CR C,则ClusterGroupUpgrade CR A 必须等到ClusterGroupUpgrade CR C 的状态变为UpgradeComplete后才能启动。

一个ClusterGroupUpgrade CR 可以有多个阻塞 CR。在这种情况下,所有阻塞 CR 都必须完成,然后才能开始当前 CR 的升级。

先决条件
  • 安装拓扑感知生命周期管理器 (TALM)。

  • 配置一个或多个托管集群。

  • 以具有cluster-admin权限的用户身份登录。

  • 在中心集群中创建 RHACM 策略。

步骤
  1. ClusterGroupUpgrade CR 的内容保存到cgu-a.yamlcgu-b.yamlcgu-c.yaml文件中。

    apiVersion: ran.openshift.io/v1alpha1
    kind: ClusterGroupUpgrade
    metadata:
      name: cgu-a
      namespace: default
    spec:
      blockingCRs: (1)
      - name: cgu-c
        namespace: default
      clusters:
      - spoke1
      - spoke2
      - spoke3
      enable: false
      managedPolicies:
      - policy1-common-cluster-version-policy
      - policy2-common-pao-sub-policy
      - policy3-common-ptp-sub-policy
      remediationStrategy:
        canaries:
        - spoke1
        maxConcurrency: 2
        timeout: 240
    status:
      conditions:
      - message: The ClusterGroupUpgrade CR is not enabled
        reason: UpgradeNotStarted
        status: "False"
        type: Ready
      managedPoliciesForUpgrade:
      - name: policy1-common-cluster-version-policy
        namespace: default
      - name: policy2-common-pao-sub-policy
        namespace: default
      - name: policy3-common-ptp-sub-policy
        namespace: default
      placementBindings:
      - cgu-a-policy1-common-cluster-version-policy
      - cgu-a-policy2-common-pao-sub-policy
      - cgu-a-policy3-common-ptp-sub-policy
      placementRules:
      - cgu-a-policy1-common-cluster-version-policy
      - cgu-a-policy2-common-pao-sub-policy
      - cgu-a-policy3-common-ptp-sub-policy
      remediationPlan:
      - - spoke1
      - - spoke2
    1 定义阻塞 CR。cgu-a 更新必须等到cgu-c 完成后才能启动。
    apiVersion: ran.openshift.io/v1alpha1
    kind: ClusterGroupUpgrade
    metadata:
      name: cgu-b
      namespace: default
    spec:
      blockingCRs: (1)
      - name: cgu-a
        namespace: default
      clusters:
      - spoke4
      - spoke5
      enable: false
      managedPolicies:
      - policy1-common-cluster-version-policy
      - policy2-common-pao-sub-policy
      - policy3-common-ptp-sub-policy
      - policy4-common-sriov-sub-policy
      remediationStrategy:
        maxConcurrency: 1
        timeout: 240
    status:
      conditions:
      - message: The ClusterGroupUpgrade CR is not enabled
        reason: UpgradeNotStarted
        status: "False"
        type: Ready
      managedPoliciesForUpgrade:
      - name: policy1-common-cluster-version-policy
        namespace: default
      - name: policy2-common-pao-sub-policy
        namespace: default
      - name: policy3-common-ptp-sub-policy
        namespace: default
      - name: policy4-common-sriov-sub-policy
        namespace: default
      placementBindings:
      - cgu-b-policy1-common-cluster-version-policy
      - cgu-b-policy2-common-pao-sub-policy
      - cgu-b-policy3-common-ptp-sub-policy
      - cgu-b-policy4-common-sriov-sub-policy
      placementRules:
      - cgu-b-policy1-common-cluster-version-policy
      - cgu-b-policy2-common-pao-sub-policy
      - cgu-b-policy3-common-ptp-sub-policy
      - cgu-b-policy4-common-sriov-sub-policy
      remediationPlan:
      - - spoke4
      - - spoke5
      status: {}
    1 cgu-b 更新必须等到cgu-a 完成后才能启动。
    apiVersion: ran.openshift.io/v1alpha1
    kind: ClusterGroupUpgrade
    metadata:
      name: cgu-c
      namespace: default
    spec: (1)
      clusters:
      - spoke6
      enable: false
      managedPolicies:
      - policy1-common-cluster-version-policy
      - policy2-common-pao-sub-policy
      - policy3-common-ptp-sub-policy
      - policy4-common-sriov-sub-policy
      remediationStrategy:
        maxConcurrency: 1
        timeout: 240
    status:
      conditions:
      - message: The ClusterGroupUpgrade CR is not enabled
        reason: UpgradeNotStarted
        status: "False"
        type: Ready
      managedPoliciesCompliantBeforeUpgrade:
      - policy2-common-pao-sub-policy
      - policy3-common-ptp-sub-policy
      managedPoliciesForUpgrade:
      - name: policy1-common-cluster-version-policy
        namespace: default
      - name: policy4-common-sriov-sub-policy
        namespace: default
      placementBindings:
      - cgu-c-policy1-common-cluster-version-policy
      - cgu-c-policy4-common-sriov-sub-policy
      placementRules:
      - cgu-c-policy1-common-cluster-version-policy
      - cgu-c-policy4-common-sriov-sub-policy
      remediationPlan:
      - - spoke6
      status: {}
    1 cgu-c 更新没有任何阻塞 CR。当enable字段设置为true时,TALM 将启动cgu-c 更新。
  2. 通过对每个相关的 CR 运行以下命令来创建ClusterGroupUpgrade CR

    $ oc apply -f <name>.yaml
  3. 通过对每个相关的 CR 运行以下命令来启动更新过程

    $ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/<name> \
    --type merge -p '{"spec":{"enable":true}}'

    以下示例显示enable字段设置为trueClusterGroupUpgrade CR

    带有阻塞 CR 的cgu-a示例
    apiVersion: ran.openshift.io/v1alpha1
    kind: ClusterGroupUpgrade
    metadata:
      name: cgu-a
      namespace: default
    spec:
      blockingCRs:
      - name: cgu-c
        namespace: default
      clusters:
      - spoke1
      - spoke2
      - spoke3
      enable: true
      managedPolicies:
      - policy1-common-cluster-version-policy
      - policy2-common-pao-sub-policy
      - policy3-common-ptp-sub-policy
      remediationStrategy:
        canaries:
        - spoke1
        maxConcurrency: 2
        timeout: 240
    status:
      conditions:
      - message: 'The ClusterGroupUpgrade CR is blocked by other CRs that have not yet
          completed: [cgu-c]' (1)
        reason: UpgradeCannotStart
        status: "False"
        type: Ready
      managedPoliciesForUpgrade:
      - name: policy1-common-cluster-version-policy
        namespace: default
      - name: policy2-common-pao-sub-policy
        namespace: default
      - name: policy3-common-ptp-sub-policy
        namespace: default
      placementBindings:
      - cgu-a-policy1-common-cluster-version-policy
      - cgu-a-policy2-common-pao-sub-policy
      - cgu-a-policy3-common-ptp-sub-policy
      placementRules:
      - cgu-a-policy1-common-cluster-version-policy
      - cgu-a-policy2-common-pao-sub-policy
      - cgu-a-policy3-common-ptp-sub-policy
      remediationPlan:
      - - spoke1
      - - spoke2
      status: {}
    1 显示阻塞 CR 列表。
    带有阻塞 CR 的cgu-b示例
    apiVersion: ran.openshift.io/v1alpha1
    kind: ClusterGroupUpgrade
    metadata:
      name: cgu-b
      namespace: default
    spec:
      blockingCRs:
      - name: cgu-a
        namespace: default
      clusters:
      - spoke4
      - spoke5
      enable: true
      managedPolicies:
      - policy1-common-cluster-version-policy
      - policy2-common-pao-sub-policy
      - policy3-common-ptp-sub-policy
      - policy4-common-sriov-sub-policy
      remediationStrategy:
        maxConcurrency: 1
        timeout: 240
    status:
      conditions:
      - message: 'The ClusterGroupUpgrade CR is blocked by other CRs that have not yet
          completed: [cgu-a]' (1)
        reason: UpgradeCannotStart
        status: "False"
        type: Ready
      managedPoliciesForUpgrade:
      - name: policy1-common-cluster-version-policy
        namespace: default
      - name: policy2-common-pao-sub-policy
        namespace: default
      - name: policy3-common-ptp-sub-policy
        namespace: default
      - name: policy4-common-sriov-sub-policy
        namespace: default
      placementBindings:
      - cgu-b-policy1-common-cluster-version-policy
      - cgu-b-policy2-common-pao-sub-policy
      - cgu-b-policy3-common-ptp-sub-policy
      - cgu-b-policy4-common-sriov-sub-policy
      placementRules:
      - cgu-b-policy1-common-cluster-version-policy
      - cgu-b-policy2-common-pao-sub-policy
      - cgu-b-policy3-common-ptp-sub-policy
      - cgu-b-policy4-common-sriov-sub-policy
      remediationPlan:
      - - spoke4
      - - spoke5
      status: {}
    1 显示阻塞 CR 列表。
    带有阻塞 CR 的cgu-c示例
    apiVersion: ran.openshift.io/v1alpha1
    kind: ClusterGroupUpgrade
    metadata:
      name: cgu-c
      namespace: default
    spec:
      clusters:
      - spoke6
      enable: true
      managedPolicies:
      - policy1-common-cluster-version-policy
      - policy2-common-pao-sub-policy
      - policy3-common-ptp-sub-policy
      - policy4-common-sriov-sub-policy
      remediationStrategy:
        maxConcurrency: 1
        timeout: 240
    status:
      conditions:
      - message: The ClusterGroupUpgrade CR has upgrade policies that are still non compliant (1)
        reason: UpgradeNotCompleted
        status: "False"
        type: Ready
      managedPoliciesCompliantBeforeUpgrade:
      - policy2-common-pao-sub-policy
      - policy3-common-ptp-sub-policy
      managedPoliciesForUpgrade:
      - name: policy1-common-cluster-version-policy
        namespace: default
      - name: policy4-common-sriov-sub-policy
        namespace: default
      placementBindings:
      - cgu-c-policy1-common-cluster-version-policy
      - cgu-c-policy4-common-sriov-sub-policy
      placementRules:
      - cgu-c-policy1-common-cluster-version-policy
      - cgu-c-policy4-common-sriov-sub-policy
      remediationPlan:
      - - spoke6
      status:
        currentBatch: 1
        remediationPlanForBatch:
          spoke6: 0
    1 cgu-c 更新没有任何阻塞 CR。

更新托管集群上的策略

拓扑感知生命周期管理器 (TALM) 会修复ClusterGroupUpgrade自定义资源 (CR) 中指定的集群的一组inform策略。TALM 通过控制Policy CR 中的remediationAction规范(通过PlacementBinding CR 中的bindingOverrides.remediationActionsubFilter规范)来修复inform策略。每个策略都有其对应的 RHACM 位置规则和 RHACM 位置绑定。

TALM会逐个将当前批次中的每个集群添加到与适用的托管策略相对应的放置规则中。如果集群已经符合策略,TALM 将跳过对符合策略的集群应用该策略。然后,TALM继续将下一个策略应用于不符合策略的集群。TALM 完成批次中的更新后,所有集群都将从与策略关联的放置规则中移除。然后,下一个批次的更新开始。

如果 spoke 集群未向 RHACM 报告任何符合状态,则中心集群上的托管策略可能缺少 TALM 需要的状态信息。TALM 以以下方式处理这些情况

  • 如果策略的status.compliant字段缺失,TALM 将忽略该策略并添加日志条目。然后,TALM继续查看策略的status.status字段。

  • 如果策略的status.status缺失,TALM 将产生错误。

  • 如果策略的status.status字段中缺少集群的合规性状态,TALM 将认为该集群不符合该策略。

ClusterGroupUpgrade CR 的batchTimeoutAction确定如果集群的升级失败会发生什么。您可以指定continue跳过失败的集群并继续升级其他集群,或者指定abort停止所有集群的策略修复。超时过后,TALM 将删除其创建的所有资源,以确保不会对集群进行进一步更新。

示例升级策略
apiVersion: policy.open-cluster-management.io/v1
kind: Policy
metadata:
  name: ocp-4.4.17.4
  namespace: platform-upgrade
spec:
  disabled: false
  policy-templates:
  - objectDefinition:
      apiVersion: policy.open-cluster-management.io/v1
      kind: ConfigurationPolicy
      metadata:
        name: upgrade
      spec:
        namespaceselector:
          exclude:
          - kube-*
          include:
          - '*'
        object-templates:
        - complianceType: musthave
          objectDefinition:
            apiVersion: config.openshift.io/v1
            kind: ClusterVersion
            metadata:
              name: version
            spec:
              channel: stable-4.17
              desiredUpdate:
                version: 4.4.17.4
              upstream: https://api.openshift.com/api/upgrades_info/v1/graph
            status:
              history:
                - state: Completed
                  version: 4.4.17.4
        remediationAction: inform
        severity: low
  remediationAction: inform

有关 RHACM 策略的更多信息,请参阅 策略概述

配置使用 TALM 安装的托管集群的 Operator 订阅

拓扑感知生命周期管理器 (TALM) 只有在 Operator 的Subscription自定义资源 (CR) 包含status.state.AtLatestKnown字段时,才能批准 Operator 的安装计划。

步骤
  1. status.state.AtLatestKnown字段添加到 Operator 的Subscription CR

    示例 Subscription CR
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: cluster-logging
      namespace: openshift-logging
      annotations:
        ran.openshift.io/ztp-deploy-wave: "2"
    spec:
      channel: "stable"
      name: cluster-logging
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      installPlanApproval: Manual
    status:
      state: AtLatestKnown (1)
    1 status.state: AtLatestKnown字段用于 Operator 目录中提供的最新 Operator 版本。

    当注册表中提供新版本的 Operator 时,关联的策略将变得不符合。

  2. 使用ClusterGroupUpgrade CR 将更改的Subscription策略应用于您的托管集群。

将更新策略应用于托管集群

您可以通过应用策略来更新托管集群。

先决条件
  • 安装拓扑感知生命周期管理器 (TALM)。

  • TALM 需要 RHACM 2.9 或更高版本。

  • 配置一个或多个托管集群。

  • 以具有cluster-admin权限的用户身份登录。

  • 在中心集群中创建 RHACM 策略。

步骤
  1. ClusterGroupUpgrade CR 的内容保存到cgu-1.yaml文件中。

    apiVersion: ran.openshift.io/v1alpha1
    kind: ClusterGroupUpgrade
    metadata:
      name: cgu-1
      namespace: default
    spec:
      managedPolicies: (1)
        - policy1-common-cluster-version-policy
        - policy2-common-nto-sub-policy
        - policy3-common-ptp-sub-policy
        - policy4-common-sriov-sub-policy
      enable: false
      clusters: (2)
      - spoke1
      - spoke2
      - spoke5
      - spoke6
      remediationStrategy:
        maxConcurrency: 2 (3)
        timeout: 240 (4)
      batchTimeoutAction: (5)
    1 要应用的策略的名称。
    2 要更新的集群列表。
    3 maxConcurrency字段表示同时更新的集群数量。
    4 更新超时(分钟)。
    5 控制批处理超时时发生的情况。可能的值为abortcontinue。如果未指定,则默认为continue
  2. 通过运行以下命令创建ClusterGroupUpgrade CR

    $ oc create -f cgu-1.yaml
    1. 通过运行以下命令检查中心集群中是否创建了ClusterGroupUpgrade CR

      $ oc get cgu --all-namespaces
      示例输出
      NAMESPACE   NAME  AGE  STATE      DETAILS
      default     cgu-1 8m55 NotEnabled Not Enabled
    2. 通过运行以下命令检查更新的状态

      $ oc get cgu -n default cgu-1 -ojsonpath='{.status}' | jq
      示例输出
      {
        "computedMaxConcurrency": 2,
        "conditions": [
          {
            "lastTransitionTime": "2022-02-25T15:34:07Z",
            "message": "Not enabled", (1)
            "reason": "NotEnabled",
            "status": "False",
            "type": "Progressing"
          }
        ],
        "managedPoliciesContent": {
          "policy1-common-cluster-version-policy": "null",
          "policy2-common-nto-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"node-tuning-operator\",\"namespace\":\"openshift-cluster-node-tuning-operator\"}]",
          "policy3-common-ptp-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"ptp-operator-subscription\",\"namespace\":\"openshift-ptp\"}]",
          "policy4-common-sriov-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"sriov-network-operator-subscription\",\"namespace\":\"openshift-sriov-network-operator\"}]"
        },
        "managedPoliciesForUpgrade": [
          {
            "name": "policy1-common-cluster-version-policy",
            "namespace": "default"
          },
          {
            "name": "policy2-common-nto-sub-policy",
            "namespace": "default"
          },
          {
            "name": "policy3-common-ptp-sub-policy",
            "namespace": "default"
          },
          {
            "name": "policy4-common-sriov-sub-policy",
            "namespace": "default"
          }
        ],
        "managedPoliciesNs": {
          "policy1-common-cluster-version-policy": "default",
          "policy2-common-nto-sub-policy": "default",
          "policy3-common-ptp-sub-policy": "default",
          "policy4-common-sriov-sub-policy": "default"
        },
        "placementBindings": [
          "cgu-policy1-common-cluster-version-policy",
          "cgu-policy2-common-nto-sub-policy",
          "cgu-policy3-common-ptp-sub-policy",
          "cgu-policy4-common-sriov-sub-policy"
        ],
        "placementRules": [
          "cgu-policy1-common-cluster-version-policy",
          "cgu-policy2-common-nto-sub-policy",
          "cgu-policy3-common-ptp-sub-policy",
          "cgu-policy4-common-sriov-sub-policy"
        ],
        "remediationPlan": [
          [
            "spoke1",
            "spoke2"
          ],
          [
            "spoke5",
            "spoke6"
          ]
        ],
        "status": {}
      }
      1 ClusterGroupUpgrade CR 中的spec.enable字段设置为false
  3. 通过运行以下命令将spec.enable字段的值更改为true

    $ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-1 \
    --patch '{"spec":{"enable":true}}' --type=merge
验证
  1. 通过运行以下命令检查更新的状态

    $ oc get cgu -n default cgu-1 -ojsonpath='{.status}' | jq
    示例输出
    {
      "computedMaxConcurrency": 2,
      "conditions": [ (1)
        {
          "lastTransitionTime": "2022-02-25T15:33:07Z",
          "message": "All selected clusters are valid",
          "reason": "ClusterSelectionCompleted",
          "status": "True",
          "type": "ClustersSelected"
        },
        {
          "lastTransitionTime": "2022-02-25T15:33:07Z",
          "message": "Completed validation",
          "reason": "ValidationCompleted",
          "status": "True",
          "type": "Validated"
        },
        {
          "lastTransitionTime": "2022-02-25T15:34:07Z",
          "message": "Remediating non-compliant policies",
          "reason": "InProgress",
          "status": "True",
          "type": "Progressing"
        }
      ],
      "managedPoliciesContent": {
        "policy1-common-cluster-version-policy": "null",
        "policy2-common-nto-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"node-tuning-operator\",\"namespace\":\"openshift-cluster-node-tuning-operator\"}]",
        "policy3-common-ptp-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"ptp-operator-subscription\",\"namespace\":\"openshift-ptp\"}]",
        "policy4-common-sriov-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"sriov-network-operator-subscription\",\"namespace\":\"openshift-sriov-network-operator\"}]"
      },
      "managedPoliciesForUpgrade": [
        {
          "name": "policy1-common-cluster-version-policy",
          "namespace": "default"
        },
        {
          "name": "policy2-common-nto-sub-policy",
          "namespace": "default"
        },
        {
          "name": "policy3-common-ptp-sub-policy",
          "namespace": "default"
        },
        {
          "name": "policy4-common-sriov-sub-policy",
          "namespace": "default"
        }
      ],
      "managedPoliciesNs": {
        "policy1-common-cluster-version-policy": "default",
        "policy2-common-nto-sub-policy": "default",
        "policy3-common-ptp-sub-policy": "default",
        "policy4-common-sriov-sub-policy": "default"
      },
      "placementBindings": [
        "cgu-policy1-common-cluster-version-policy",
        "cgu-policy2-common-nto-sub-policy",
        "cgu-policy3-common-ptp-sub-policy",
        "cgu-policy4-common-sriov-sub-policy"
      ],
      "placementRules": [
        "cgu-policy1-common-cluster-version-policy",
        "cgu-policy2-common-nto-sub-policy",
        "cgu-policy3-common-ptp-sub-policy",
        "cgu-policy4-common-sriov-sub-policy"
      ],
      "remediationPlan": [
        [
          "spoke1",
          "spoke2"
        ],
        [
          "spoke5",
          "spoke6"
        ]
      ],
      "status": {
        "currentBatch": 1,
        "currentBatchRemediationProgress": {
           "spoke1": {
              "policyIndex": 1,
              "state": "InProgress"
           },
           "spoke2": {
              "policyIndex": 1,
              "state": "InProgress"
           }
        },
        "currentBatchStartedAt": "2022-02-25T15:54:16Z",
        "startedAt": "2022-02-25T15:54:16Z"
      }
    }
    1 反映当前批次的更新进度。再次运行此命令以接收有关进度的更新信息。
  2. 通过运行以下命令检查策略的状态

    oc get policies -A
    示例输出
    NAMESPACE   NAME                                        REMEDIATION ACTION    COMPLIANCE STATE     AGE
    spoke1    default.policy1-common-cluster-version-policy enforce               Compliant            18m
    spoke1    default.policy2-common-nto-sub-policy         enforce               NonCompliant         18m
    spoke2    default.policy1-common-cluster-version-policy enforce               Compliant            18m
    spoke2    default.policy2-common-nto-sub-policy         enforce               NonCompliant         18m
    spoke5    default.policy3-common-ptp-sub-policy         inform                NonCompliant         18m
    spoke5    default.policy4-common-sriov-sub-policy       inform                NonCompliant         18m
    spoke6    default.policy3-common-ptp-sub-policy         inform                NonCompliant         18m
    spoke6    default.policy4-common-sriov-sub-policy       inform                NonCompliant         18m
    default   policy1-common-ptp-sub-policy                 inform                Compliant            18m
    default   policy2-common-sriov-sub-policy               inform                NonCompliant         18m
    default   policy3-common-ptp-sub-policy                 inform                NonCompliant         18m
    default   policy4-common-sriov-sub-policy               inform                NonCompliant         18m
    • 对于应用于当前批次集群的子策略,spec.remediationAction值将更改为enforce

    • 对于其余集群中的子策略,spec.remedationAction值保持inform

    • 批次完成后,强制执行的子策略的spec.remediationAction值将更改回inform

  3. 如果策略包含 Operator 订阅,您可以直接在单节点集群上检查安装进度。

    1. 运行以下命令,导出您要检查安装进度的单节点集群的KUBECONFIG文件

      $ export KUBECONFIG=<cluster_kubeconfig_absolute_path>
    2. 运行以下命令,检查单节点集群上存在的所有订阅,并查找您尝试通过ClusterGroupUpgrade CR安装的策略中的订阅

      $ oc get subs -A | grep -i <subscription_name>
      cluster-logging策略的示例输出
      NAMESPACE                              NAME                         PACKAGE                      SOURCE             CHANNEL
      openshift-logging                      cluster-logging              cluster-logging              redhat-operators   stable
  4. 如果其中一个托管策略包含ClusterVersion CR,请运行以下命令针对 spoke 集群检查当前批次中平台更新的状态

    $ oc get clusterversion
    示例输出
    NAME      VERSION   AVAILABLE   PROGRESSING   SINCE   STATUS
    version   4.4.17.5     True        True          43s     Working towards 4.4.17.7: 71 of 735 done (9% complete)
  5. 运行以下命令检查 Operator 订阅

    $ oc get subs -n <operator-namespace> <operator-subscription> -ojsonpath="{.status}"
  6. 运行以下命令检查与所需订阅关联的单节点集群上存在的安装计划

    $ oc get installplan -n <subscription_namespace>
    cluster-logging Operator 的示例输出
    NAMESPACE                              NAME            CSV                                 APPROVAL   APPROVED
    openshift-logging                      install-6khtw   cluster-logging.5.3.3-4             Manual     true (1)
    
    1 安装计划的Approval字段设置为Manual,并且在 TALM 批准安装计划后,其Approved字段从false更改为true

    当 TALM 正在修复包含订阅的策略时,它会自动批准附加到该订阅的任何安装计划。如果需要多个安装计划才能将 Operator 升级到最新版本,TALM 可能会批准多个安装计划,通过一个或多个中间版本进行升级以达到最终版本。

  7. 运行以下命令检查ClusterGroupUpgrade正在安装的策略的 Operator 的集群服务版本是否达到Succeeded阶段

    $ oc get csv -n <operator_namespace>
    OpenShift Logging Operator 的示例输出
    NAME                    DISPLAY                     VERSION   REPLACES   PHASE
    cluster-logging.5.4.2   Red Hat OpenShift Logging   5.4.2                Succeeded

使用容器镜像预缓存功能

单节点 OpenShift 集群可能带宽有限,无法访问容器镜像注册表,这可能会导致更新完成之前超时。

更新时间不是由 TALM 设置的。您可以通过手动应用或外部自动化在更新开始时应用ClusterGroupUpgrade CR。

ClusterGroupUpgrade CR 中的preCaching字段设置为true时,容器镜像预缓存开始。

TALM使用PrecacheSpecValid条件报告如下状态信息

  • true

    预缓存规范有效且一致。

  • false

    预缓存规范不完整。

TALM使用PrecachingSucceeded条件报告如下状态信息

  • true

    TALM已结束预缓存过程。如果任何集群的预缓存失败,则该集群的更新将失败,但其他集群的更新将继续进行。如果任何集群的预缓存失败,则会显示一条消息通知您。

  • false

    一个或多个集群的预缓存仍在进行中,或者所有集群的预缓存都已失败。

预缓存过程成功后,您可以开始修复策略。当enable字段设置为true时,修复操作开始。如果集群上预缓存失败,则该集群的升级失败。升级过程将继续进行所有其他预缓存成功的集群。

预缓存过程可能有以下状态:

  • NotStarted

    这是所有集群在ClusterGroupUpgrade CR 的第一次协调传递中自动分配的初始状态。在此状态下,TALM 将删除来自先前未完成更新的 spoke 集群的任何预缓存命名空间和 hub 视图资源。然后,TALM 为 spoke 预缓存命名空间创建一个新的ManagedClusterView资源,以在PrecachePreparing状态下验证其删除。

  • PreparingToStart

    正在清理来自先前未完成更新的任何剩余资源。

  • Starting

    创建预缓存作业先决条件和作业。

  • Active

    作业处于“活动”状态。

  • Succeeded

    预缓存作业成功。

  • PrecacheTimeout

    工件预缓存已部分完成。

  • UnrecoverableError

    作业以非零退出代码结束。

使用容器镜像预缓存过滤器

预缓存功能通常下载的镜像比集群更新所需的镜像多。您可以控制哪些预缓存镜像被下载到集群。这减少了下载时间,并节省了带宽和存储空间。

您可以使用以下命令查看要下载的所有镜像列表

$ oc adm release info <ocp-version>

以下ConfigMap示例显示了如何使用excludePrecachePatterns字段排除镜像。

apiVersion: v1
kind: ConfigMap
metadata:
  name: cluster-group-upgrade-overrides
data:
  excludePrecachePatterns: |
    azure (1)
    aws
    vsphere
    alibaba
1 TALM 排除名称包含此处列出的任何模式的所有镜像。

创建具有预缓存功能的 ClusterGroupUpgrade CR

对于单节点 OpenShift,预缓存功能允许在更新开始之前在 spoke 集群上存在所需的容器镜像。

对于预缓存,TALM 使用ClusterGroupUpgrade CR 中的spec.remediationStrategy.timeout值。您必须设置一个允许预缓存作业完成的足够时间的timeout值。在预缓存完成后启用ClusterGroupUpgrade CR 时,您可以将timeout值更改为适合更新的持续时间。

先决条件
  • 安装拓扑感知生命周期管理器 (TALM)。

  • 配置一个或多个托管集群。

  • 以具有cluster-admin权限的用户身份登录。

步骤
  1. preCaching字段设置为trueClusterGroupUpgrade CR 的内容保存到clustergroupupgrades-group-du.yaml文件中

    apiVersion: ran.openshift.io/v1alpha1
    kind: ClusterGroupUpgrade
    metadata:
      name: du-upgrade-4918
      namespace: ztp-group-du-sno
    spec:
      preCaching: true (1)
      clusters:
      - cnfdb1
      - cnfdb2
      enable: false
      managedPolicies:
      - du-upgrade-platform-upgrade
      remediationStrategy:
        maxConcurrency: 2
        timeout: 240
    1 preCaching字段设置为true,这使得 TALM 可以在开始更新之前拉取容器镜像。
  2. 当您要开始预缓存时,运行以下命令应用ClusterGroupUpgrade CR

    $ oc apply -f clustergroupupgrades-group-du.yaml
验证
  1. 运行以下命令检查ClusterGroupUpgrade CR 是否存在于 hub 集群中

    $ oc get cgu -A
    示例输出
    NAMESPACE          NAME              AGE   STATE        DETAILS
    ztp-group-du-sno   du-upgrade-4918   10s   InProgress   Precaching is required and not done (1)
    
    1 CR 已创建。
  2. 运行以下命令检查预缓存任务的状态

    $ oc get cgu -n ztp-group-du-sno du-upgrade-4918 -o jsonpath='{.status}'
    示例输出
    {
      "conditions": [
        {
          "lastTransitionTime": "2022-01-27T19:07:24Z",
          "message": "Precaching is required and not done",
          "reason": "InProgress",
          "status": "False",
          "type": "PrecachingSucceeded"
        },
        {
          "lastTransitionTime": "2022-01-27T19:07:34Z",
          "message": "Pre-caching spec is valid and consistent",
          "reason": "PrecacheSpecIsWellFormed",
          "status": "True",
          "type": "PrecacheSpecValid"
        }
      ],
      "precaching": {
        "clusters": [
          "cnfdb1" (1)
          "cnfdb2"
        ],
        "spec": {
          "platformImage": "image.example.io"},
        "status": {
          "cnfdb1": "Active"
          "cnfdb2": "Succeeded"}
        }
    }
    1 显示已识别集群的列表。
  3. 运行以下命令在 spoke 集群上检查预缓存作业的状态

    $ oc get jobs,pods -n openshift-talo-pre-cache
    示例输出
    NAME                  COMPLETIONS   DURATION   AGE
    job.batch/pre-cache   0/1           3m10s      3m10s
    
    NAME                     READY   STATUS    RESTARTS   AGE
    pod/pre-cache--1-9bmlr   1/1     Running   0          3m10s
  4. 运行以下命令检查ClusterGroupUpgrade CR 的状态

    $ oc get cgu -n ztp-group-du-sno du-upgrade-4918 -o jsonpath='{.status}'
    示例输出
    "conditions": [
        {
          "lastTransitionTime": "2022-01-27T19:30:41Z",
          "message": "The ClusterGroupUpgrade CR has all clusters compliant with all the managed policies",
          "reason": "UpgradeCompleted",
          "status": "True",
          "type": "Ready"
        },
        {
          "lastTransitionTime": "2022-01-27T19:28:57Z",
          "message": "Precaching is completed",
          "reason": "PrecachingCompleted",
          "status": "True",
          "type": "PrecachingSucceeded" (1)
        }
    1 预缓存任务已完成。

拓扑感知生命周期管理器故障排除

拓扑感知生命周期管理器 (TALM) 是一个 OpenShift Container Platform Operator,用于修复 RHACM 策略。出现问题时,请使用oc adm must-gather命令收集详细信息和日志,并采取步骤调试问题。

有关相关主题的更多信息,请参阅以下文档:

常规故障排除

您可以通过查看以下问题来确定问题的原因:

为确保ClusterGroupUpgrade配置功能正常,您可以执行以下操作:

  1. 创建spec.enable字段设置为falseClusterGroupUpgrade CR。

  2. 等待状态更新并完成故障排除问题。

  3. 如果一切看起来都符合预期,请在ClusterGroupUpgrade CR 中将spec.enable字段设置为true

在您将ClusterGroupUpgrade CR 中的spec.enable字段设置为true之后,更新过程开始,您将无法再编辑 CR 的spec字段。

无法修改 ClusterUpgradeGroup CR

问题

启用更新后,您无法编辑ClusterUpgradeGroup CR。

解决方案

通过执行以下步骤重新启动过程:

  1. 运行以下命令删除旧的ClusterGroupUpgrade CR

    $ oc delete cgu -n <ClusterGroupUpgradeCR_namespace> <ClusterGroupUpgradeCR_name>
  2. 检查并修复托管集群和策略中存在的 issue。

    1. 确保所有集群都是托管集群且可用。

    2. 确保所有策略都存在,并且spec.remediationAction字段设置为inform

  3. 创建一个具有正确配置的新ClusterGroupUpgrade CR。

    $ oc apply -f <ClusterGroupUpgradeCR_YAML>

托管策略

检查系统上的托管策略

问题

您需要检查系统上是否存在正确的托管策略。

解决方案

运行以下命令

$ oc get cgu lab-upgrade -ojsonpath='{.spec.managedPolicies}'
示例输出
["group-du-sno-validator-du-validator-policy", "policy2-common-nto-sub-policy", "policy3-common-ptp-sub-policy"]

检查remediationAction模式

问题

您需要检查托管策略的specremediationAction字段是否设置为inform

解决方案

运行以下命令

$ oc get policies --all-namespaces
示例输出
NAMESPACE   NAME                                                 REMEDIATION ACTION   COMPLIANCE STATE   AGE
default     policy1-common-cluster-version-policy                inform               NonCompliant       5d21h
default     policy2-common-nto-sub-policy                        inform               Compliant          5d21h
default     policy3-common-ptp-sub-policy                        inform               NonCompliant       5d21h
default     policy4-common-sriov-sub-policy                      inform               NonCompliant       5d21h

检查策略合规性状态

问题

您需要检查策略的合规性状态。

解决方案

运行以下命令

$ oc get policies --all-namespaces
示例输出
NAMESPACE   NAME                                                 REMEDIATION ACTION   COMPLIANCE STATE   AGE
default     policy1-common-cluster-version-policy                inform               NonCompliant       5d21h
default     policy2-common-nto-sub-policy                        inform               Compliant          5d21h
default     policy3-common-ptp-sub-policy                        inform               NonCompliant       5d21h
default     policy4-common-sriov-sub-policy                      inform               NonCompliant       5d21h

集群

检查是否存在托管集群

问题

您需要检查ClusterGroupUpgrade CR中的集群是否为托管集群。

解决方案

运行以下命令

$ oc get managedclusters
示例输出
NAME            HUB ACCEPTED   MANAGED CLUSTER URLS                    JOINED   AVAILABLE   AGE
local-cluster   true           https://api.hub.example.com:6443        True     Unknown     13d
spoke1          true           https://api.spoke1.example.com:6443     True     True        13d
spoke3          true           https://api.spoke3.example.com:6443     True     True        27h
  1. 或者,检查TALM管理器日志

    1. 运行以下命令获取TALM管理器的名称

      $ oc get pod -n openshift-operators
      示例输出
      NAME                                                         READY   STATUS    RESTARTS   AGE
      cluster-group-upgrades-controller-manager-75bcc7484d-8k8xp   2/2     Running   0          45m
    2. 运行以下命令检查TALM管理器日志

      $ oc logs -n openshift-operators \
      cluster-group-upgrades-controller-manager-75bcc7484d-8k8xp -c manager
      示例输出
      ERROR	controller-runtime.manager.controller.clustergroupupgrade	Reconciler error	{"reconciler group": "ran.openshift.io", "reconciler kind": "ClusterGroupUpgrade", "name": "lab-upgrade", "namespace": "default", "error": "Cluster spoke5555 is not a ManagedCluster"} (1)
      sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).processNextWorkItem
      1 错误消息显示该集群不是托管集群。

检查托管集群是否可用

问题

您需要检查ClusterGroupUpgrade CR中指定的托管集群是否可用。

解决方案

运行以下命令

$ oc get managedclusters
示例输出
NAME            HUB ACCEPTED   MANAGED CLUSTER URLS                    JOINED   AVAILABLE   AGE
local-cluster   true           https://api.hub.testlab.com:6443        True     Unknown     13d
spoke1          true           https://api.spoke1.testlab.com:6443     True     True        13d (1)
spoke3          true           https://api.spoke3.testlab.com:6443     True     True        27h (1)
1 托管集群的AVAILABLE字段值为True

检查clusterLabelSelector

问题

您需要检查ClusterGroupUpgrade CR中指定的clusterLabelSelector字段是否与至少一个托管集群匹配。

解决方案

运行以下命令

$ oc get managedcluster --selector=upgrade=true (1)
1 要更新的集群的标签为upgrade:true
示例输出
NAME            HUB ACCEPTED   MANAGED CLUSTER URLS                     JOINED    AVAILABLE   AGE
spoke1          true           https://api.spoke1.testlab.com:6443      True     True        13d
spoke3          true           https://api.spoke3.testlab.com:6443      True     True        27h

检查金丝雀集群是否存在

问题

您需要检查金丝雀集群是否存在于集群列表中。

ClusterGroupUpgrade CR示例
spec:
    remediationStrategy:
        canaries:
        - spoke3
        maxConcurrency: 2
        timeout: 240
    clusterLabelSelectors:
      - matchLabels:
          upgrade: true
解决方案

运行以下命令

$ oc get cgu lab-upgrade -ojsonpath='{.spec.clusters}'
示例输出
["spoke1", "spoke3"]
  1. 运行以下命令检查金丝雀集群是否存在于与clusterLabelSelector标签匹配的集群列表中

    $ oc get managedcluster --selector=upgrade=true
    示例输出
    NAME            HUB ACCEPTED   MANAGED CLUSTER URLS   JOINED    AVAILABLE   AGE
    spoke1          true           https://api.spoke1.testlab.com:6443   True     True        13d
    spoke3          true           https://api.spoke3.testlab.com:6443   True     True        27h

集群可以存在于spec.clusters中,也可以与spec.clusterLabelSelector标签匹配。

检查 spoke 集群上的预缓存状态

  1. 在 spoke 集群上运行以下命令来检查预缓存状态

    $ oc get jobs,pods -n openshift-talo-pre-cache

修复策略

检查ClusterGroupUpgrade CR中是否存在remediationStrategy

问题

您需要检查ClusterGroupUpgrade CR中是否存在remediationStrategy

解决方案

运行以下命令

$ oc get cgu lab-upgrade -ojsonpath='{.spec.remediationStrategy}'
示例输出
{"maxConcurrency":2, "timeout":240}

检查ClusterGroupUpgrade CR中是否指定了maxConcurrency

问题

您需要检查ClusterGroupUpgrade CR中是否指定了maxConcurrency

解决方案

运行以下命令

$ oc get cgu lab-upgrade -ojsonpath='{.spec.remediationStrategy.maxConcurrency}'
示例输出
2

拓扑感知生命周期管理器

检查ClusterGroupUpgrade CR中的条件消息和状态

问题

您需要检查ClusterGroupUpgrade CR中status.conditions字段的值。

解决方案

运行以下命令

$ oc get cgu lab-upgrade -ojsonpath='{.status.conditions}'
示例输出
{"lastTransitionTime":"2022-02-17T22:25:28Z", "message":"Missing managed policies:[policyList]", "reason":"NotAllManagedPoliciesExist", "status":"False", "type":"Validated"}

检查是否计算了status.remediationPlan

问题

您需要检查是否计算了status.remediationPlan

解决方案

运行以下命令

$ oc get cgu lab-upgrade -ojsonpath='{.status.remediationPlan}'
示例输出
[["spoke2", "spoke3"]]

TALM管理器容器中的错误

问题

您需要检查TALM管理器容器的日志。

解决方案

运行以下命令

$ oc logs -n openshift-operators \
cluster-group-upgrades-controller-manager-75bcc7484d-8k8xp -c manager
示例输出
ERROR	controller-runtime.manager.controller.clustergroupupgrade	Reconciler error	{"reconciler group": "ran.openshift.io", "reconciler kind": "ClusterGroupUpgrade", "name": "lab-upgrade", "namespace": "default", "error": "Cluster spoke5555 is not a ManagedCluster"} (1)
sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).processNextWorkItem
1 显示错误。

ClusterGroupUpgrade CR完成之后,集群不符合某些策略

问题

TALM用于确定是否需要修复的策略合规性状态尚未针对所有集群完全更新。这可能是因为

  • 在创建或更新策略后不久就运行了CGU。

  • 策略的修复会影响ClusterGroupUpgrade CR中后续策略的合规性。

解决方案

创建并应用具有相同规范的新ClusterGroupUpdate CR。

GitOps ZTP工作流中自动创建的ClusterGroupUpgrade CR没有托管策略

问题

如果集群变为Ready时托管集群没有策略,则会自动创建一个没有策略的ClusterGroupUpgrade CR。ClusterGroupUpgrade CR完成后,托管集群将标记为ztp-done。如果在SiteConfig资源推送后未在规定时间内将PolicyGeneratorPolicyGenTemplate CR推送到Git仓库,则当集群变为Ready时,目标集群可能没有可用的策略。

解决方案

验证要应用的策略是否在hub集群上可用,然后创建一个包含所需策略的ClusterGroupUpgrade CR。

您可以手动创建ClusterGroupUpgrade CR,也可以再次触发自动创建。要触发ClusterGroupUpgrade CR的自动创建,请从集群中删除ztp-done标签,并删除之前在zip-install命名空间中创建的空ClusterGroupUpgrade CR。

预缓存失败

问题

预缓存可能由于以下原因之一而失败

  • 节点上没有足够的可用空间。

  • 对于断开连接的环境,预缓存镜像未正确镜像。

  • 创建pod时出现问题。

解决方案
  1. 要检查预缓存是否由于空间不足而失败,请检查节点中预缓存pod的日志。

    1. 使用以下命令查找pod的名称

      $ oc get pods -n openshift-talo-pre-cache
    2. 使用以下命令检查日志以查看错误是否与空间不足有关

      $ oc logs -n openshift-talo-pre-cache <pod name>
  2. 如果没有日志,请使用以下命令检查pod状态

    $ oc describe pod -n openshift-talo-pre-cache <pod name>
  3. 如果pod不存在,请使用以下命令检查作业状态以查看它为什么无法创建pod

    $ oc describe job -n openshift-talo-pre-cache pre-cache