×

操作符订阅条件类型

订阅可以报告以下条件类型

表 1. 订阅条件类型
条件 描述

CatalogSourcesUnhealthy

一些或所有用于解析的目录源都不健康。

InstallPlanMissing

缺少订阅的安装计划。

InstallPlanPending

订阅的安装计划正在等待安装。

InstallPlanFailed

订阅的安装计划已失败。

ResolutionFailed

订阅的依赖项解析已失败。

默认的 OpenShift Container Platform 集群操作符由集群版本操作符 (CVO) 管理,它们没有 Subscription 对象。应用程序操作符由操作符生命周期管理器 (OLM) 管理,它们具有 Subscription 对象。

其他资源

使用 CLI 查看操作符订阅状态

您可以使用 CLI 查看操作符订阅状态。

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

  • 您已安装 OpenShift CLI (oc)。

步骤
  1. 列出操作符订阅

    $ oc get subs -n <operator_namespace>
  2. 使用 oc describe 命令检查 Subscription 资源

    $ oc describe sub <subscription_name> -n <operator_namespace>
  3. 在命令输出中,查找操作符订阅条件类型的状态的 Conditions 部分。在以下示例中,CatalogSourcesUnhealthy 条件类型的状态为 false,因为所有可用的目录源均健康

    示例输出
    Name:         cluster-logging
    Namespace:    openshift-logging
    Labels:       operators.coreos.com/cluster-logging.openshift-logging=
    Annotations:  <none>
    API Version:  operators.coreos.com/v1alpha1
    Kind:         Subscription
    # ...
    Conditions:
       Last Transition Time:  2019-07-29T13:42:57Z
       Message:               all available catalogsources are healthy
       Reason:                AllCatalogSourcesHealthy
       Status:                False
       Type:                  CatalogSourcesUnhealthy
    # ...

默认的 OpenShift Container Platform 集群操作符由集群版本操作符 (CVO) 管理,它们没有 Subscription 对象。应用程序操作符由操作符生命周期管理器 (OLM) 管理,它们具有 Subscription 对象。

使用 CLI 查看操作符目录源状态

您可以使用 CLI 查看操作符目录源的状态。

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

  • 您已安装 OpenShift CLI (oc)。

步骤
  1. 列出命名空间中的目录源。例如,您可以检查 openshift-marketplace 命名空间,该命名空间用于集群范围的目录源

    $ oc get catalogsources -n openshift-marketplace
    示例输出
    NAME                  DISPLAY               TYPE   PUBLISHER   AGE
    certified-operators   Certified Operators   grpc   Red Hat     55m
    community-operators   Community Operators   grpc   Red Hat     55m
    example-catalog       Example Catalog       grpc   Example Org 2m25s
    redhat-marketplace    Red Hat Marketplace   grpc   Red Hat     55m
    redhat-operators      Red Hat Operators     grpc   Red Hat     55m
  2. 使用 oc describe 命令获取有关目录源的更多详细信息和状态

    $ oc describe catalogsource example-catalog -n openshift-marketplace
    示例输出
    Name:         example-catalog
    Namespace:    openshift-marketplace
    Labels:       <none>
    Annotations:  operatorframework.io/managed-by: marketplace-operator
                  target.workload.openshift.io/management: {"effect": "PreferredDuringScheduling"}
    API Version:  operators.coreos.com/v1alpha1
    Kind:         CatalogSource
    # ...
    Status:
      Connection State:
        Address:              example-catalog.openshift-marketplace.svc:50051
        Last Connect:         2021-09-09T17:07:35Z
        Last Observed State:  TRANSIENT_FAILURE
      Registry Service:
        Created At:         2021-09-09T17:05:45Z
        Port:               50051
        Protocol:           grpc
        Service Name:       example-catalog
        Service Namespace:  openshift-marketplace
    # ...

    在前面的示例输出中,最后观察到的状态是 TRANSIENT_FAILURE。此状态表示在为目录源建立连接时存在问题。

  3. 列出创建目录源的命名空间中的 Pod

    $ oc get pods -n openshift-marketplace
    示例输出
    NAME                                    READY   STATUS             RESTARTS   AGE
    certified-operators-cv9nn               1/1     Running            0          36m
    community-operators-6v8lp               1/1     Running            0          36m
    marketplace-operator-86bfc75f9b-jkgbc   1/1     Running            0          42m
    example-catalog-bwt8z                   0/1     ImagePullBackOff   0          3m55s
    redhat-marketplace-57p8c                1/1     Running            0          36m
    redhat-operators-smxx8                  1/1     Running            0          36m

    在命名空间中创建目录源时,会在该命名空间中为目录源创建 Pod。在前面的示例输出中,example-catalog-bwt8z Pod 的状态为 ImagePullBackOff。此状态表示拉取目录源的索引映像时存在问题。

  4. 使用 oc describe 命令检查 Pod 以获取更详细的信息

    $ oc describe pod example-catalog-bwt8z -n openshift-marketplace
    示例输出
    Name:         example-catalog-bwt8z
    Namespace:    openshift-marketplace
    Priority:     0
    Node:         ci-ln-jyryyg2-f76d1-ggdbq-worker-b-vsxjd/10.0.128.2
    ...
    Events:
      Type     Reason          Age                From               Message
      ----     ------          ----               ----               -------
      Normal   Scheduled       48s                default-scheduler  Successfully assigned openshift-marketplace/example-catalog-bwt8z to ci-ln-jyryyf2-f76d1-fgdbq-worker-b-vsxjd
      Normal   AddedInterface  47s                multus             Add eth0 [10.131.0.40/23] from openshift-sdn
      Normal   BackOff         20s (x2 over 46s)  kubelet            Back-off pulling image "quay.io/example-org/example-catalog:v1"
      Warning  Failed          20s (x2 over 46s)  kubelet            Error: ImagePullBackOff
      Normal   Pulling         8s (x3 over 47s)   kubelet            Pulling image "quay.io/example-org/example-catalog:v1"
      Warning  Failed          8s (x3 over 47s)   kubelet            Failed to pull image "quay.io/example-org/example-catalog:v1": rpc error: code = Unknown desc = reading manifest v1 in quay.io/example-org/example-catalog: unauthorized: access to the requested resource is not authorized
      Warning  Failed          8s (x3 over 47s)   kubelet            Error: ErrImagePull

    在前面的示例输出中,错误消息表明目录源的索引映像由于授权问题而未能成功拉取。例如,索引映像可能存储在需要登录凭据的注册表中。

查询操作符 Pod 状态

您可以列出集群中的操作符 Pod 及其状态。您还可以收集详细的操作符 Pod 摘要。

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

  • 您的 API 服务仍在运行。

  • 您已安装 OpenShift CLI (oc)。

步骤
  1. 列出在集群中运行的操作符。输出包括操作符版本、可用性和正常运行时间信息

    $ oc get clusteroperators
  2. 列出在操作符命名空间中运行的操作符 Pod,以及 Pod 状态、重启次数和使用时长

    $ oc get pod -n <operator_namespace>
  3. 输出详细的操作符 Pod 摘要

    $ oc describe pod <operator_pod_name> -n <operator_namespace>
  4. 如果操作符问题是特定于节点的,请查询该节点上的操作符容器状态。

    1. 为节点启动调试 Pod

      $ oc debug node/my-node
    2. /host 设置为调试 shell 中的根目录。调试 Pod 将主机的根文件系统安装在 Pod 内的 /host 中。通过将根目录更改为 /host,您可以运行主机可执行路径中包含的二进制文件

      # chroot /host

      运行 Red Hat Enterprise Linux CoreOS (RHCOS) 的 OpenShift Container Platform 4.17 集群节点是不可变的,并且依赖于操作符来应用集群更改。不建议使用 SSH 访问集群节点。但是,如果 OpenShift Container Platform API 不可用,或者 kubelet 在目标节点上运行不正常,则 oc 操作将受到影响。在这种情况下,可以使用 ssh core@<node>.<cluster_name>.<base_domain> 代替。

    3. 列出有关节点容器的详细信息,包括状态和关联的 Pod ID

      # crictl ps
    4. 列出有关节点上特定操作符容器的信息。以下示例列出了有关 network-operator 容器的信息

      # crictl ps --name network-operator
    5. 退出调试 shell。

收集操作符日志

如果遇到操作符问题,您可以从操作符 Pod 日志收集详细的诊断信息。

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

  • 您的 API 服务仍在运行。

  • 您已安装 OpenShift CLI (oc)。

  • 您拥有控制平面或控制平面机器的完全限定域名。

步骤
  1. 列出在 Operator 命名空间中运行的 Operator Pod,以及 Pod 状态、重启次数和运行时间。

    $ oc get pods -n <operator_namespace>
  2. 查看 Operator Pod 的日志。

    $ oc logs pod/<pod_name> -n <operator_namespace>

    如果一个 Operator Pod 包含多个容器,之前的命令将会产生一个错误,其中包含每个容器的名称。查询单个容器的日志。

    $ oc logs pod/<operator_pod_name> -c <container_name> -n <operator_namespace>
  3. 如果 API 无法正常工作,请使用 SSH 在每个控制平面节点上查看 Operator Pod 和容器日志。请将<master-node>.<cluster_name>.<base_domain>替换为适当的值。

    1. 列出每个控制平面节点上的 Pod。

      $ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl pods
    2. 对于任何未显示Ready状态的 Operator Pod,请详细检查 Pod 的状态。请将<operator_pod_id>替换为前面命令输出中列出的 Operator Pod ID。

      $ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl inspectp <operator_pod_id>
    3. 列出与 Operator Pod 相关的容器。

      $ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl ps --pod=<operator_pod_id>
    4. 对于任何未显示Ready状态的 Operator 容器,请详细检查容器的状态。请将<container_id>替换为前面命令输出中列出的容器 ID。

      $ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl inspect <container_id>
    5. 查看任何未显示Ready状态的 Operator 容器的日志。请将<container_id>替换为前面命令输出中列出的容器 ID。

      $ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl logs -f <container_id>

      运行 Red Hat Enterprise Linux CoreOS (RHCOS) 的 OpenShift Container Platform 4.17 集群节点是不可变的,并且依赖于 Operator 来应用集群更改。不建议使用 SSH 访问集群节点。在尝试通过 SSH 收集诊断数据之前,请先检查是否可以通过运行oc adm must gather和其他oc命令来收集足够的数据。但是,如果 OpenShift Container Platform API不可用,或者 kubelet 在目标节点上无法正常工作,则oc操作将受到影响。在这种情况下,可以使用ssh core@<node>.<cluster_name>.<base_domain>访问节点。

禁用机器配置 Operator 自动重启

当机器配置 Operator (MCO) 进行配置更改时,Red Hat Enterprise Linux CoreOS (RHCOS) 必须重启才能使更改生效。无论配置更改是自动的还是手动的,RHCOS 节点都会自动重启,除非它被暂停。

以下修改不会触发节点重启

  • 当 MCO 检测到以下任何更改时,它会应用更新而无需 drain 或重启节点

    • 更改机器配置的spec.config.passwd.users.sshAuthorizedKeys参数中的 SSH 密钥。

    • 更改openshift-config命名空间中的全局拉取密钥或拉取密钥。

    • Kubernetes API Server Operator 自动轮换/etc/kubernetes/kubelet-ca.crt证书颁发机构 (CA)。

  • 当 MCO 检测到/etc/containers/registries.conf文件的更改时,例如添加或编辑ImageDigestMirrorSetImageTagMirrorSetImageContentSourcePolicy对象,它会 drain 相应的节点,应用更改,然后取消 cordon 节点。对于以下更改,不会发生节点 drain

    • 添加一个注册表,并为每个镜像设置pull-from-mirror = "digest-only"参数。

    • 在注册表中添加一个镜像,并设置pull-from-mirror = "digest-only"参数。

    • unqualified-search-registries列表中添加项目。

为了避免不必要的中断,您可以修改机器配置池 (MCP) 以防止 Operator 在对机器配置进行更改后自动重启。

使用控制台禁用机器配置 Operator 自动重启

为了避免机器配置 Operator (MCO) 进行的更改造成不必要的中断,您可以使用 OpenShift Container Platform Web 控制台修改机器配置池 (MCP),以防止 MCO 对该池中的节点进行任何更改。这将防止任何通常作为 MCO 更新过程一部分的重启。

请参见禁用机器配置 Operator 自动重启中的第二个注意

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

步骤

暂停或取消暂停自动 MCO 更新重启

  • 暂停自动重启过程

    1. 以具有cluster-admin角色的用户身份登录 OpenShift Container Platform Web 控制台。

    2. 点击**计算** → **MachineConfigPools**。

    3. 在**MachineConfigPools**页面上,点击**master**或**worker**,具体取决于您想要暂停哪些节点的重启。

    4. 在**master**或**worker**页面上,点击**YAML**。

    5. 在 YAML 中,将spec.paused字段更新为true

      MachineConfigPool 对象示例
      apiVersion: machineconfiguration.openshift.io/v1
      kind: MachineConfigPool
      # ...
      spec:
      # ...
        paused: true (1)
      # ...
      1 spec.paused字段更新为true以暂停重启。
    6. 要验证 MCP 是否已暂停,请返回**MachineConfigPools**页面。

      在**MachineConfigPools**页面上,**已暂停**列会为您修改的 MCP 报告**True**。

      如果 MCP 在暂停时有待处理的更改,则**已更新**列为**False**,而**正在更新**为**False**。当**已更新**为**True**且**正在更新**为**False**时,则没有待处理的更改。

      如果有待处理的更改(其中**已更新**和**正在更新**列均为**False**),建议尽快安排维护窗口进行重启。请使用以下步骤取消暂停自动重启过程,以应用自上次重启以来排队的更改。

  • 取消暂停自动重启过程

    1. 以具有cluster-admin角色的用户身份登录 OpenShift Container Platform Web 控制台。

    2. 点击**计算** → **MachineConfigPools**。

    3. 在**MachineConfigPools**页面上,点击**master**或**worker**,具体取决于您想要暂停哪些节点的重启。

    4. 在**master**或**worker**页面上,点击**YAML**。

    5. 在 YAML 中,将spec.paused字段更新为false

      MachineConfigPool 对象示例
      apiVersion: machineconfiguration.openshift.io/v1
      kind: MachineConfigPool
      # ...
      spec:
      # ...
        paused: false (1)
      # ...
      1 spec.paused字段更新为false以允许重启。

      通过取消暂停 MCP,MCO 会应用所有已暂停的更改并根据需要重启 Red Hat Enterprise Linux CoreOS (RHCOS)。

    6. 要验证 MCP 是否已暂停,请返回**MachineConfigPools**页面。

      在**MachineConfigPools**页面上,**已暂停**列会为您修改的 MCP 报告**False**。

      如果 MCP 正在应用任何待处理的更改,则**已更新**列为**False**,而**正在更新**列为**True**。当**已更新**为**True**且**正在更新**为**False**时,则不再进行任何更改。

使用 CLI 禁用机器配置 Operator 自动重启

为了避免机器配置 Operator (MCO) 进行的更改造成不必要的中断,您可以使用 OpenShift CLI (oc) 修改机器配置池 (MCP),以防止 MCO 对该池中的节点进行任何更改。这将防止任何通常作为 MCO 更新过程一部分的重启。

请参见禁用机器配置 Operator 自动重启中的第二个注意

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

  • 您已安装 OpenShift CLI (oc)。

步骤

暂停或取消暂停自动 MCO 更新重启

  • 暂停自动重启过程

    1. 更新MachineConfigPool自定义资源,将spec.paused字段设置为true

      控制平面 (master) 节点
      $ oc patch --type=merge --patch='{"spec":{"paused":true}}' machineconfigpool/master
      工作节点
      $ oc patch --type=merge --patch='{"spec":{"paused":true}}' machineconfigpool/worker
    2. 验证 MCP 是否已暂停

      控制平面 (master) 节点
      $ oc get machineconfigpool/master --template='{{.spec.paused}}'
      工作节点
      $ oc get machineconfigpool/worker --template='{{.spec.paused}}'
      示例输出
      true

      spec.paused 字段为 true,MCP 已暂停。

    3. 确定 MCP 是否有待处理的更改

      # oc get machineconfigpool
      示例输出
      NAME     CONFIG                                             UPDATED   UPDATING
      master   rendered-master-33cf0a1254318755d7b48002c597bf91   True      False
      worker   rendered-worker-e405a5bdb0db1295acea08bcca33fa60   False     False

      如果**已更新 (UPDATED)** 列为**False** 且**正在更新 (UPDATING)** 为**False**,则存在待处理的更改。当**已更新 (UPDATED)** 为**True** 且**正在更新 (UPDATING)** 为**False** 时,则没有待处理的更改。在上一个示例中,工作节点有待处理的更改,控制平面节点没有任何待处理的更改。

      如果有待处理的更改(其中**已更新**和**正在更新**列均为**False**),建议尽快安排维护窗口进行重启。请使用以下步骤取消暂停自动重启过程,以应用自上次重启以来排队的更改。

  • 取消暂停自动重启过程

    1. 更新MachineConfigPool 自定义资源,将spec.paused字段设置为false

      控制平面 (master) 节点
      $ oc patch --type=merge --patch='{"spec":{"paused":false}}' machineconfigpool/master
      工作节点
      $ oc patch --type=merge --patch='{"spec":{"paused":false}}' machineconfigpool/worker

      取消暂停 MCP 后,MCO 会应用所有暂停的更改,并根据需要重新引导 Red Hat Enterprise Linux CoreOS (RHCOS)。

    2. 验证 MCP 是否已取消暂停

      控制平面 (master) 节点
      $ oc get machineconfigpool/master --template='{{.spec.paused}}'
      工作节点
      $ oc get machineconfigpool/worker --template='{{.spec.paused}}'
      示例输出
      false

      spec.paused 字段为 false,MCP 已取消暂停。

    3. 确定 MCP 是否有待处理的更改

      $ oc get machineconfigpool
      示例输出
      NAME     CONFIG                                   UPDATED  UPDATING
      master   rendered-master-546383f80705bd5aeaba93   True     False
      worker   rendered-worker-b4c51bb33ccaae6fc4a6a5   False    True

      如果 MCP 正在应用任何待处理的更改,则**已更新 (UPDATED)** 列为**False**,而**正在更新 (UPDATING)** 列为**True**。当**已更新 (UPDATED)** 为**True** 且**正在更新 (UPDATING)** 为**False** 时,则不再进行任何更改。在上一个示例中,MCO 正在更新工作节点。

刷新失败的订阅

在 Operator Lifecycle Manager (OLM) 中,如果您订阅的 Operator 引用了网络上无法访问的镜像,您会在openshift-marketplace命名空间中找到以下错误的作业

示例输出
ImagePullBackOff for
Back-off pulling image "example.com/openshift4/ose-elasticsearch-operator-bundle@sha256:6d2587129c846ec28d384540322b40b05833e7e00b25cca584e004af9a1d292e"
示例输出
rpc error: code = Unknown desc = error pinging docker registry example.com: Get "https://example.com/v2/": dial tcp: lookup example.com on 10.0.0.1:53: no such host

因此,订阅会卡在失败状态,并且无法安装或升级 Operator。

您可以通过删除订阅、集群服务版本 (CSV) 和其他相关对象来刷新失败的订阅。重新创建订阅后,OLM 就会重新安装 Operator 的正确版本。

先决条件
  • 您有一个失败的订阅,无法拉取不可访问的 bundle 镜像。

  • 您已确认正确的 bundle 镜像可以访问。

步骤
  1. 从安装 Operator 的命名空间获取SubscriptionClusterServiceVersion对象的名称

    $ oc get sub,csv -n <namespace>
    示例输出
    NAME                                                       PACKAGE                  SOURCE             CHANNEL
    subscription.operators.coreos.com/elasticsearch-operator   elasticsearch-operator   redhat-operators   5.0
    
    NAME                                                                         DISPLAY                            VERSION    REPLACES   PHASE
    clusterserviceversion.operators.coreos.com/elasticsearch-operator.5.0.0-65   OpenShift Elasticsearch Operator   5.0.0-65              Succeeded
  2. 删除订阅

    $ oc delete subscription <subscription_name> -n <namespace>
  3. 删除集群服务版本

    $ oc delete csv <csv_name> -n <namespace>
  4. 获取openshift-marketplace命名空间中任何失败的作业和相关配置映射的名称

    $ oc get job,configmap -n openshift-marketplace
    示例输出
    NAME                                                                        COMPLETIONS   DURATION   AGE
    job.batch/1de9443b6324e629ddf31fed0a853a121275806170e34c926d69e53a7fcbccb   1/1           26s        9m30s
    
    NAME                                                                        DATA   AGE
    configmap/1de9443b6324e629ddf31fed0a853a121275806170e34c926d69e53a7fcbccb   3      9m30s
  5. 删除作业

    $ oc delete job <job_name> -n openshift-marketplace

    这可以确保不会重新创建尝试拉取不可访问镜像的 Pod。

  6. 删除配置映射

    $ oc delete configmap <configmap_name> -n openshift-marketplace
  7. 使用 Web 控制台中的 OperatorHub 重新安装 Operator。

验证
  • 检查 Operator 是否已成功重新安装

    $ oc get sub,csv,installplan -n <namespace>

卸载失败后重新安装 Operator

在尝试重新安装相同的 Operator 之前,必须成功且完全卸载该 Operator。未能完全正确卸载 Operator 会导致资源(例如项目或命名空间)卡在“终止”状态,并导致“解析资源错误”消息。例如:

示例Project资源描述
...
    message: 'Failed to delete all resource types, 1 remaining: Internal error occurred:
      error resolving resource'
...

这些类型的问题会阻止 Operator 成功重新安装。

强制删除命名空间不太可能解决“终止”状态问题,并可能导致集群行为不稳定或不可预测,因此最好尝试查找可能阻止命名空间删除的相关资源。更多信息,请参阅Red Hat 知识库解决方案 #4165791,并仔细注意注意事项和警告。

以下步骤说明了如何解决由于先前安装的 Operator 的现有自定义资源定义 (CRD) 阻止相关命名空间成功删除而导致无法重新安装 Operator 的问题。

步骤
  1. 检查是否有任何与 Operator 相关的命名空间卡在“终止”状态

    $ oc get namespaces
    示例输出
    operator-ns-1                                       Terminating
  2. 检查卸载失败后是否存在任何与 Operator 相关的 CRD

    $ oc get crds

    CRD 是全局集群定义;与 CRD 相关的实际自定义资源 (CR) 实例可能位于其他命名空间中或为全局集群实例。

  3. 如果存在您知道是由 Operator 提供或管理且应该在卸载后删除的任何 CRD,请删除该 CRD

    $ oc delete crd <crd_name>
  4. 检查卸载后是否存在任何与 Operator 相关的剩余 CR 实例,如果存在,请删除这些 CR

    1. 卸载后要搜索的 CR 类型可能难以确定,可能需要知道 Operator 管理哪些 CRD。例如,如果您正在对 etcd Operator 的卸载进行故障排除,该 Operator 提供EtcdCluster CRD,则可以搜索命名空间中剩余的EtcdCluster CR

      $ oc get EtcdCluster -n <namespace_name>

      或者,您可以在所有命名空间中搜索

      $ oc get EtcdCluster --all-namespaces
    2. 如果存在任何应该删除的剩余 CR,请删除这些实例

      $ oc delete <cr_name> <cr_instance_name> -n <namespace_name>
  5. 检查命名空间删除是否已成功解决

    $ oc get namespace <namespace_name>

    如果命名空间或其他 Operator 资源仍未被干净地卸载,请联系 Red Hat 支持。

  6. 使用 Web 控制台中的 OperatorHub 重新安装 Operator。

验证
  • 检查 Operator 是否已成功重新安装

    $ oc get sub,csv,installplan -n <namespace>