$ oc get subs -n <operator_namespace>
如果遇到操作符问题,请验证操作符订阅状态。检查集群中操作符 Pod 的运行状况并收集操作符日志以进行诊断。
订阅可以报告以下条件类型
条件 | 描述 |
---|---|
|
一些或所有用于解析的目录源都不健康。 |
|
缺少订阅的安装计划。 |
|
订阅的安装计划正在等待安装。 |
|
订阅的安装计划已失败。 |
|
订阅的依赖项解析已失败。 |
默认的 OpenShift Container Platform 集群操作符由集群版本操作符 (CVO) 管理,它们没有 |
您可以使用 CLI 查看操作符订阅状态。
您可以作为具有 cluster-admin
角色的用户访问集群。
您已安装 OpenShift CLI (oc
)。
列出操作符订阅
$ oc get subs -n <operator_namespace>
使用 oc describe
命令检查 Subscription
资源
$ oc describe sub <subscription_name> -n <operator_namespace>
在命令输出中,查找操作符订阅条件类型的状态的 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) 管理,它们没有 |
您可以使用 CLI 查看操作符目录源的状态。
您可以作为具有 cluster-admin
角色的用户访问集群。
您已安装 OpenShift CLI (oc
)。
列出命名空间中的目录源。例如,您可以检查 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
使用 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
。此状态表示在为目录源建立连接时存在问题。
列出创建目录源的命名空间中的 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
。此状态表示拉取目录源的索引映像时存在问题。
使用 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
在前面的示例输出中,错误消息表明目录源的索引映像由于授权问题而未能成功拉取。例如,索引映像可能存储在需要登录凭据的注册表中。
gRPC 文档:连接状态
您可以列出集群中的操作符 Pod 及其状态。您还可以收集详细的操作符 Pod 摘要。
您可以作为具有 cluster-admin
角色的用户访问集群。
您的 API 服务仍在运行。
您已安装 OpenShift CLI (oc
)。
列出在集群中运行的操作符。输出包括操作符版本、可用性和正常运行时间信息
$ oc get clusteroperators
列出在操作符命名空间中运行的操作符 Pod,以及 Pod 状态、重启次数和使用时长
$ oc get pod -n <operator_namespace>
输出详细的操作符 Pod 摘要
$ oc describe pod <operator_pod_name> -n <operator_namespace>
如果操作符问题是特定于节点的,请查询该节点上的操作符容器状态。
为节点启动调试 Pod
$ oc debug node/my-node
将 /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 在目标节点上运行不正常,则 |
列出有关节点容器的详细信息,包括状态和关联的 Pod ID
# crictl ps
列出有关节点上特定操作符容器的信息。以下示例列出了有关 network-operator
容器的信息
# crictl ps --name network-operator
退出调试 shell。
如果遇到操作符问题,您可以从操作符 Pod 日志收集详细的诊断信息。
您可以作为具有 cluster-admin
角色的用户访问集群。
您的 API 服务仍在运行。
您已安装 OpenShift CLI (oc
)。
您拥有控制平面或控制平面机器的完全限定域名。
列出在 Operator 命名空间中运行的 Operator Pod,以及 Pod 状态、重启次数和运行时间。
$ oc get pods -n <operator_namespace>
查看 Operator Pod 的日志。
$ oc logs pod/<pod_name> -n <operator_namespace>
如果一个 Operator Pod 包含多个容器,之前的命令将会产生一个错误,其中包含每个容器的名称。查询单个容器的日志。
$ oc logs pod/<operator_pod_name> -c <container_name> -n <operator_namespace>
如果 API 无法正常工作,请使用 SSH 在每个控制平面节点上查看 Operator Pod 和容器日志。请将<master-node>.<cluster_name>.<base_domain>
替换为适当的值。
列出每个控制平面节点上的 Pod。
$ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl pods
对于任何未显示Ready
状态的 Operator Pod,请详细检查 Pod 的状态。请将<operator_pod_id>
替换为前面命令输出中列出的 Operator Pod ID。
$ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl inspectp <operator_pod_id>
列出与 Operator Pod 相关的容器。
$ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl ps --pod=<operator_pod_id>
对于任何未显示Ready
状态的 Operator 容器,请详细检查容器的状态。请将<container_id>
替换为前面命令输出中列出的容器 ID。
$ ssh core@<master-node>.<cluster_name>.<base_domain> sudo crictl inspect <container_id>
查看任何未显示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 收集诊断数据之前,请先检查是否可以通过运行 |
当机器配置 Operator (MCO) 进行配置更改时,Red Hat Enterprise Linux CoreOS (RHCOS) 必须重启才能使更改生效。无论配置更改是自动的还是手动的,RHCOS 节点都会自动重启,除非它被暂停。
以下修改不会触发节点重启
|
为了避免不必要的中断,您可以修改机器配置池 (MCP) 以防止 Operator 在对机器配置进行更改后自动重启。
为了避免机器配置 Operator (MCO) 进行的更改造成不必要的中断,您可以使用 OpenShift Container Platform Web 控制台修改机器配置池 (MCP),以防止 MCO 对该池中的节点进行任何更改。这将防止任何通常作为 MCO 更新过程一部分的重启。
请参见禁用机器配置 Operator 自动重启中的第二个 |
您可以作为具有 cluster-admin
角色的用户访问集群。
暂停或取消暂停自动 MCO 更新重启
暂停自动重启过程
以具有cluster-admin
角色的用户身份登录 OpenShift Container Platform Web 控制台。
点击**计算** → **MachineConfigPools**。
在**MachineConfigPools**页面上,点击**master**或**worker**,具体取决于您想要暂停哪些节点的重启。
在**master**或**worker**页面上,点击**YAML**。
在 YAML 中,将spec.paused
字段更新为true
。
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfigPool
# ...
spec:
# ...
paused: true (1)
# ...
1 | 将spec.paused 字段更新为true 以暂停重启。 |
要验证 MCP 是否已暂停,请返回**MachineConfigPools**页面。
在**MachineConfigPools**页面上,**已暂停**列会为您修改的 MCP 报告**True**。
如果 MCP 在暂停时有待处理的更改,则**已更新**列为**False**,而**正在更新**为**False**。当**已更新**为**True**且**正在更新**为**False**时,则没有待处理的更改。
如果有待处理的更改(其中**已更新**和**正在更新**列均为**False**),建议尽快安排维护窗口进行重启。请使用以下步骤取消暂停自动重启过程,以应用自上次重启以来排队的更改。 |
取消暂停自动重启过程
以具有cluster-admin
角色的用户身份登录 OpenShift Container Platform Web 控制台。
点击**计算** → **MachineConfigPools**。
在**MachineConfigPools**页面上,点击**master**或**worker**,具体取决于您想要暂停哪些节点的重启。
在**master**或**worker**页面上,点击**YAML**。
在 YAML 中,将spec.paused
字段更新为false
。
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfigPool
# ...
spec:
# ...
paused: false (1)
# ...
1 | 将spec.paused 字段更新为false 以允许重启。 |
通过取消暂停 MCP,MCO 会应用所有已暂停的更改并根据需要重启 Red Hat Enterprise Linux CoreOS (RHCOS)。 |
要验证 MCP 是否已暂停,请返回**MachineConfigPools**页面。
在**MachineConfigPools**页面上,**已暂停**列会为您修改的 MCP 报告**False**。
如果 MCP 正在应用任何待处理的更改,则**已更新**列为**False**,而**正在更新**列为**True**。当**已更新**为**True**且**正在更新**为**False**时,则不再进行任何更改。
为了避免机器配置 Operator (MCO) 进行的更改造成不必要的中断,您可以使用 OpenShift CLI (oc) 修改机器配置池 (MCP),以防止 MCO 对该池中的节点进行任何更改。这将防止任何通常作为 MCO 更新过程一部分的重启。
请参见禁用机器配置 Operator 自动重启中的第二个 |
您可以作为具有 cluster-admin
角色的用户访问集群。
您已安装 OpenShift CLI (oc
)。
暂停或取消暂停自动 MCO 更新重启
暂停自动重启过程
更新MachineConfigPool
自定义资源,将spec.paused
字段设置为true
。
$ oc patch --type=merge --patch='{"spec":{"paused":true}}' machineconfigpool/master
$ oc patch --type=merge --patch='{"spec":{"paused":true}}' machineconfigpool/worker
验证 MCP 是否已暂停
$ oc get machineconfigpool/master --template='{{.spec.paused}}'
$ oc get machineconfigpool/worker --template='{{.spec.paused}}'
true
spec.paused
字段为 true
,MCP 已暂停。
确定 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**),建议尽快安排维护窗口进行重启。请使用以下步骤取消暂停自动重启过程,以应用自上次重启以来排队的更改。 |
取消暂停自动重启过程
更新MachineConfigPool
自定义资源,将spec.paused
字段设置为false
。
$ 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)。 |
验证 MCP 是否已取消暂停
$ oc get machineconfigpool/master --template='{{.spec.paused}}'
$ oc get machineconfigpool/worker --template='{{.spec.paused}}'
false
spec.paused
字段为 false
,MCP 已取消暂停。
确定 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 镜像可以访问。
从安装 Operator 的命名空间获取Subscription
和ClusterServiceVersion
对象的名称
$ 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
删除订阅
$ oc delete subscription <subscription_name> -n <namespace>
删除集群服务版本
$ oc delete csv <csv_name> -n <namespace>
获取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
删除作业
$ oc delete job <job_name> -n openshift-marketplace
这可以确保不会重新创建尝试拉取不可访问镜像的 Pod。
删除配置映射
$ oc delete configmap <configmap_name> -n openshift-marketplace
使用 Web 控制台中的 OperatorHub 重新安装 Operator。
检查 Operator 是否已成功重新安装
$ oc get sub,csv,installplan -n <namespace>
在尝试重新安装相同的 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 的问题。
检查是否有任何与 Operator 相关的命名空间卡在“终止”状态
$ oc get namespaces
operator-ns-1 Terminating
检查卸载失败后是否存在任何与 Operator 相关的 CRD
$ oc get crds
CRD 是全局集群定义;与 CRD 相关的实际自定义资源 (CR) 实例可能位于其他命名空间中或为全局集群实例。 |
如果存在您知道是由 Operator 提供或管理且应该在卸载后删除的任何 CRD,请删除该 CRD
$ oc delete crd <crd_name>
检查卸载后是否存在任何与 Operator 相关的剩余 CR 实例,如果存在,请删除这些 CR
卸载后要搜索的 CR 类型可能难以确定,可能需要知道 Operator 管理哪些 CRD。例如,如果您正在对 etcd Operator 的卸载进行故障排除,该 Operator 提供EtcdCluster
CRD,则可以搜索命名空间中剩余的EtcdCluster
CR
$ oc get EtcdCluster -n <namespace_name>
或者,您可以在所有命名空间中搜索
$ oc get EtcdCluster --all-namespaces
如果存在任何应该删除的剩余 CR,请删除这些实例
$ oc delete <cr_name> <cr_instance_name> -n <namespace_name>
检查命名空间删除是否已成功解决
$ oc get namespace <namespace_name>
如果命名空间或其他 Operator 资源仍未被干净地卸载,请联系 Red Hat 支持。 |
使用 Web 控制台中的 OperatorHub 重新安装 Operator。
检查 Operator 是否已成功重新安装
$ oc get sub,csv,installplan -n <namespace>