×

Operator 是一种打包、部署和管理 OpenShift Dedicated 应用程序的方法。它们就像软件供应商工程团队的扩展,监控 OpenShift Dedicated 环境并使用其当前状态来实时做出决策。Operator 旨在无缝处理升级、自动响应故障,并且不会采取捷径,例如跳过软件备份过程以节省时间。

OpenShift Dedicated 包含一组默认的 Operator,这些 Operator 对于集群的正常运行是必需的。这些默认 Operator 由集群版本 Operator (CVO) 管理。

作为集群管理员,您可以使用 OpenShift Dedicated Web 控制台或 CLI 从 OperatorHub 安装应用程序 Operator。然后,您可以将 Operator 订阅到一个或多个命名空间,以使其可供集群中的开发人员使用。应用程序 Operator 由 Operator 生命周期管理器 (OLM) 管理。

如果遇到 Operator 问题,请验证 Operator 订阅状态。检查整个集群中的 Operator Pod 健康状况并收集 Operator 日志以进行诊断。

Operator 订阅条件类型

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

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

CatalogSourcesUnhealthy

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

InstallPlanMissing

缺少订阅的安装计划。

InstallPlanPending

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

InstallPlanFailed

订阅的安装计划已失败。

ResolutionFailed

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

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

附加资源

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

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

先决条件
  • 您具有作为具有dedicated-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 Dedicated 集群操作符由集群版本操作符 (CVO) 管理,它们没有Subscription 对象。应用程序操作符由操作符生命周期管理器 (OLM) 管理,它们具有Subscription 对象。

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

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

先决条件
  • 您具有作为具有dedicated-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 摘要。

先决条件
  • 您具有作为具有dedicated-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>

收集操作符日志

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

先决条件
  • 您具有作为具有dedicated-admin 角色的用户访问集群的权限。

  • 您的 API 服务仍在运行。

  • 您已安装 OpenShift CLI (oc)。

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

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

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

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

    如果操作符 Pod 具有多个容器,则前面的命令将产生一个错误,其中包含每个容器的名称。查询单个容器的日志。

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

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

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

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

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

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

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

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