×

关于 must-gather 工具

oc adm must-gather 命令行界面 (CLI) 命令会收集集群中可能需要用于调试问题的信息,包括:

  • 资源定义

  • 服务日志

默认情况下,oc adm must-gather 命令使用默认插件镜像并将数据写入 ./must-gather.local

或者,您可以使用适当的参数运行该命令来收集特定信息,如下节所述。

  • 要收集与一个或多个特定功能相关的数据,请使用带有镜像的 --image 参数,如下一节所列。

    例如:

    $ oc adm must-gather \
      --image=registry.redhat.io/container-native-virtualization/cnv-must-gather-rhel9:v4.17.3
  • 要收集审计日志,请使用 -- /usr/bin/gather_audit_logs 参数,如下节所述。

    例如:

    $ oc adm must-gather -- /usr/bin/gather_audit_logs

    为了减小文件大小,审计日志不包含在默认信息集中。

运行 oc adm must-gather 时,会在集群上的新项目中创建一个具有随机名称的新 Pod。数据将在该 Pod 上收集,并保存在当前工作目录中以 must-gather.local 开头的新的目录中。

例如:

NAMESPACE                      NAME                 READY   STATUS      RESTARTS      AGE
...
openshift-must-gather-5drcj    must-gather-bklx4    2/2     Running     0             72s
openshift-must-gather-5drcj    must-gather-s8sdh    2/2     Running     0             72s
...

可以选择使用 --run-namespace 选项在特定命名空间中运行 oc adm must-gather 命令。

例如:

$ oc adm must-gather --run-namespace <namespace> \
  --image=registry.redhat.io/container-native-virtualization/cnv-must-gather-rhel9:v4.17.3

为 Red Hat 支持收集有关集群的数据

您可以使用 oc adm must-gather CLI 命令收集有关集群的调试信息。

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

  • 已安装 OpenShift Container Platform 命令行界面 (oc)。

步骤
  1. 导航到要存储 must-gather 数据的目录。

    如果您的集群位于脱机环境中,则必须执行其他步骤。如果您的镜像注册表具有受信任的 CA,则必须首先将受信任的 CA 添加到集群。对于脱机环境中的所有集群,您必须将默认的 must-gather 镜像导入为镜像流。

    $ oc import-image is/must-gather -n openshift
  2. 运行 oc adm must-gather 命令

    $ oc adm must-gather

    如果您处于脱机环境,请使用 --image 标志作为 must-gather 的一部分,并指向有效负载镜像。

    由于此命令默认情况下会选择一个随机的控制平面节点,因此 Pod 可能被调度到处于 NotReadySchedulingDisabled 状态的控制平面节点。

    1. 如果此命令失败(例如,如果无法在集群上调度 Pod),则使用 oc adm inspect 命令来收集特定资源的信息。

      请联系 Red Hat 支持以获取建议收集的资源。

  3. 从刚刚在工作目录中创建的 must-gather 目录创建压缩文件。例如,在使用 Linux 操作系统的计算机上,运行以下命令:

    $ tar cvaf must-gather.tar.gz must-gather.local.5421342344627712289/ (1)
    1 请务必将 must-gather-local.5421342344627712289/ 替换为实际的目录名称。
  4. 将压缩文件附加到 Red Hat 客户门户网站的 客户支持页面 上的支持案例。

Must-gather 标志

下表列出了可用于 oc adm must-gather 命令的标志。

表 1. oc adm must-gather 的 OpenShift Container Platform 标志
标志 示例命令 描述

--all-images

oc adm must-gather --all-images=false

使用集群上所有标注有 operators.openshift.io/must-gather-image 的 Operator 的默认镜像收集 must-gather 数据。

--dest-dir

oc adm must-gather --dest-dir='<directory_name>'

设置本地计算机上写入收集数据的特定目录。

--host-network

oc adm must-gather --host-network=false

must-gather pod 作为 hostNetwork: true 运行。如果特定命令和镜像需要捕获主机级数据,则相关。

--image

oc adm must-gather --image=[<plugin_image>]

指定要运行的 must-gather 插件镜像。如果未指定,则使用 OpenShift Container Platform 的默认 must-gather 镜像。

--image-stream

oc adm must-gather --image-stream=[<image_stream>]

使用包含 must-gather 插件镜像的命名空间或名称:标签值指定一个`<image_stream>`。

--node-name

oc adm must-gather --node-name='<node>'

设置要使用的特定节点。如果未指定,则默认使用随机主节点。

--node-selector

oc adm must-gather --node-selector='<node_selector_name>'

设置要使用的特定节点选择器。仅当指定需要同时在集群节点集上捕获数据的命令和镜像时才相关。

--run-namespace

oc adm must-gather --run-namespace='<namespace>'

must-gather pod 应该运行的现有特权命名空间。如果未指定,则会生成一个临时命名空间。

--since

oc adm must-gather --since=<time>

仅返回比指定持续时间更新的日志。默认为所有日志。鼓励但不要求插件支持此功能。只能使用一个 since-timesince

--since-time

oc adm must-gather --since-time='<date_and_time>'

仅返回特定日期和时间之后的日志,以 (RFC3339) 格式表示。默认为所有日志。鼓励但不要求插件支持此功能。只能使用一个 since-timesince

--source-dir

oc adm must-gather --source-dir='/<directory_name>/'

设置 pod 上复制收集数据的特定目录。

--timeout

oc adm must-gather --timeout='<time>'

收集数据在超时之前的时间长度,以秒、分钟或小时表示,例如 3s、5m 或 2h。指定的时间必须大于零。如果未指定,则默认为 10 分钟。

--volume-percentage

oc adm must-gather --volume-percentage=<percent>

指定可用于 must-gather 的 pod 分配卷的最大百分比。如果超过此限制,must-gather 将停止收集,但仍会复制收集的数据。如果未指定,则默认为 30%。

收集有关特定功能的数据

您可以使用带有 --image--image-stream 参数的 oc adm must-gather CLI 命令收集有关特定功能的调试信息。must-gather 工具支持多个镜像,因此您可以通过运行单个命令来收集有关多个功能的数据。

表 2. 受支持的 must-gather 镜像
镜像 用途

registry.redhat.io/container-native-virtualization/cnv-must-gather-rhel9:v4.17.3

OpenShift Virtualization 的数据收集。

registry.redhat.io/openshift-serverless-1/svls-must-gather-rhel8

OpenShift Serverless 的数据收集。

registry.redhat.io/openshift-service-mesh/istio-must-gather-rhel8:<installed_version_service_mesh>

Red Hat OpenShift Service Mesh 的数据收集。

registry.redhat.io/rhmtc/openshift-migration-must-gather-rhel8:v<installed_version_migration_toolkit>

容器迁移工具包的数据收集。

registry.redhat.io/odf4/odf-must-gather-rhel9:v<installed_version_ODF>

Red Hat OpenShift Data Foundation 的数据收集。

registry.redhat.io/openshift-logging/cluster-logging-rhel9-operator:v<installed_version_logging>

日志收集。

quay.io/netobserv/must-gather

网络可观测性操作符的数据收集。

registry.redhat.io/openshift4/ose-csi-driver-shared-resource-mustgather-rhel8

OpenShift共享资源CSI驱动程序的数据收集。

registry.redhat.io/openshift4/ose-local-storage-mustgather-rhel9:v<installed_version_LSO>

本地存储操作符的数据收集。

registry.redhat.io/openshift-sandboxed-containers/osc-must-gather-rhel8:v<installed_version_sandboxed_containers>

用于{sandboxed-containers-first}的数据收集。

registry.redhat.io/workload-availability/node-healthcheck-must-gather-rhel8:v<installed-version-NHC>

用于Red Hat工作负载可用性操作符的数据收集,包括自节点修复(SNR)操作符、栅栏代理修复(FAR)操作符、机器删除修复(MDR)操作符、节点健康检查操作符(NHC)操作符和节点维护操作符(NMO)操作符。

registry.redhat.io/numaresources/numaresources-must-gather-rhel9:v<installed-version-nro>

NUMA资源操作符(NRO)的数据收集。

registry.redhat.io/openshift4/ptp-must-gather-rhel8:v<installed-version-ptp>

PTP操作符的数据收集。

registry.redhat.io/openshift-gitops-1/must-gather-rhel8:v<installed_version_GitOps>

Red Hat OpenShift GitOps的数据收集。

registry.redhat.io/openshift4/ose-secrets-store-csi-mustgather-rhel8:v<installed_version_secret_store>

Secrets Store CSI驱动程序操作符的数据收集。

registry.redhat.io/lvms4/lvms-must-gather-rhel9:v<installed_version_LVMS>

LVM操作符的数据收集。

ghcr.io/complianceascode/must-gather-ocp

合规性操作符的数据收集。

要确定OpenShift Container Platform组件镜像的最新版本,请参阅Red Hat客户门户网站上的OpenShift操作符生命周期网页。

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

  • 已安装 OpenShift Container Platform 命令行界面 (oc)。

步骤
  1. 导航到要存储 must-gather 数据的目录。

  2. 使用一个或多个--image--image-stream参数运行oc adm must-gather命令。

    • 要收集默认的must-gather数据以及特定功能数据,请添加--image-stream=openshift/must-gather参数。

    • 有关收集有关自定义指标自动缩放器的数据的信息,请参阅下面的“其他资源”部分。

    例如,以下命令同时收集默认的集群数据和OpenShift虚拟化相关信息

    $ oc adm must-gather \
      --image-stream=openshift/must-gather \ (1)
      --image=registry.redhat.io/container-native-virtualization/cnv-must-gather-rhel9:v4.17.3 (2)
    
    1 默认的OpenShift Container Platform must-gather镜像
    2 OpenShift虚拟化的must-gather镜像

    您可以使用must-gather工具和附加参数来收集与集群中的OpenShift Logging和Red Hat OpenShift Logging Operator特别相关的数据。对于OpenShift Logging,请运行以下命令

    $ oc adm must-gather --image=$(oc -n openshift-logging get deployment.apps/cluster-logging-operator \
      -o jsonpath='{.spec.template.spec.containers[?(@.name == "cluster-logging-operator")].image}')
    OpenShift Logging的must-gather示例输出
    ├── cluster-logging
    │  ├── clo
    │  │  ├── cluster-logging-operator-74dd5994f-6ttgt
    │  │  ├── clusterlogforwarder_cr
    │  │  ├── cr
    │  │  ├── csv
    │  │  ├── deployment
    │  │  └── logforwarding_cr
    │  ├── collector
    │  │  ├── fluentd-2tr64
    │  ├── eo
    │  │  ├── csv
    │  │  ├── deployment
    │  │  └── elasticsearch-operator-7dc7d97b9d-jb4r4
    │  ├── es
    │  │  ├── cluster-elasticsearch
    │  │  │  ├── aliases
    │  │  │  ├── health
    │  │  │  ├── indices
    │  │  │  ├── latest_documents.json
    │  │  │  ├── nodes
    │  │  │  ├── nodes_stats.json
    │  │  │  └── thread_pool
    │  │  ├── cr
    │  │  ├── elasticsearch-cdm-lp8l38m0-1-794d6dd989-4jxms
    │  │  └── logs
    │  │     ├── elasticsearch-cdm-lp8l38m0-1-794d6dd989-4jxms
    │  ├── install
    │  │  ├── co_logs
    │  │  ├── install_plan
    │  │  ├── olmo_logs
    │  │  └── subscription
    │  └── kibana
    │     ├── cr
    │     ├── kibana-9d69668d4-2rkvz
    ├── cluster-scoped-resources
    │  └── core
    │     ├── nodes
    │     │  ├── ip-10-0-146-180.eu-west-1.compute.internal.yaml
    │     └── persistentvolumes
    │        ├── pvc-0a8d65d9-54aa-4c44-9ecc-33d9381e41c1.yaml
    ├── event-filter.html
    ├── gather-debug.log
    └── namespaces
       ├── openshift-logging
       │  ├── apps
       │  │  ├── daemonsets.yaml
       │  │  ├── deployments.yaml
       │  │  ├── replicasets.yaml
       │  │  └── statefulsets.yaml
       │  ├── batch
       │  │  ├── cronjobs.yaml
       │  │  └── jobs.yaml
       │  ├── core
       │  │  ├── configmaps.yaml
       │  │  ├── endpoints.yaml
       │  │  ├── events
       │  │  │  ├── elasticsearch-im-app-1596020400-gm6nl.1626341a296c16a1.yaml
       │  │  │  ├── elasticsearch-im-audit-1596020400-9l9n4.1626341a2af81bbd.yaml
       │  │  │  ├── elasticsearch-im-infra-1596020400-v98tk.1626341a2d821069.yaml
       │  │  │  ├── elasticsearch-im-app-1596020400-cc5vc.1626341a3019b238.yaml
       │  │  │  ├── elasticsearch-im-audit-1596020400-s8d5s.1626341a31f7b315.yaml
       │  │  │  ├── elasticsearch-im-infra-1596020400-7mgv8.1626341a35ea59ed.yaml
       │  │  ├── events.yaml
       │  │  ├── persistentvolumeclaims.yaml
       │  │  ├── pods.yaml
       │  │  ├── replicationcontrollers.yaml
       │  │  ├── secrets.yaml
       │  │  └── services.yaml
       │  ├── openshift-logging.yaml
       │  ├── pods
       │  │  ├── cluster-logging-operator-74dd5994f-6ttgt
       │  │  │  ├── cluster-logging-operator
       │  │  │  │  └── cluster-logging-operator
       │  │  │  │     └── logs
       │  │  │  │        ├── current.log
       │  │  │  │        ├── previous.insecure.log
       │  │  │  │        └── previous.log
       │  │  │  └── cluster-logging-operator-74dd5994f-6ttgt.yaml
       │  │  ├── cluster-logging-operator-registry-6df49d7d4-mxxff
       │  │  │  ├── cluster-logging-operator-registry
       │  │  │  │  └── cluster-logging-operator-registry
       │  │  │  │     └── logs
       │  │  │  │        ├── current.log
       │  │  │  │        ├── previous.insecure.log
       │  │  │  │        └── previous.log
       │  │  │  ├── cluster-logging-operator-registry-6df49d7d4-mxxff.yaml
       │  │  │  └── mutate-csv-and-generate-sqlite-db
       │  │  │     └── mutate-csv-and-generate-sqlite-db
       │  │  │        └── logs
       │  │  │           ├── current.log
       │  │  │           ├── previous.insecure.log
       │  │  │           └── previous.log
       │  │  ├── elasticsearch-cdm-lp8l38m0-1-794d6dd989-4jxms
       │  │  ├── elasticsearch-im-app-1596030300-bpgcx
       │  │  │  ├── elasticsearch-im-app-1596030300-bpgcx.yaml
       │  │  │  └── indexmanagement
       │  │  │     └── indexmanagement
       │  │  │        └── logs
       │  │  │           ├── current.log
       │  │  │           ├── previous.insecure.log
       │  │  │           └── previous.log
       │  │  ├── fluentd-2tr64
       │  │  │  ├── fluentd
       │  │  │  │  └── fluentd
       │  │  │  │     └── logs
       │  │  │  │        ├── current.log
       │  │  │  │        ├── previous.insecure.log
       │  │  │  │        └── previous.log
       │  │  │  ├── fluentd-2tr64.yaml
       │  │  │  └── fluentd-init
       │  │  │     └── fluentd-init
       │  │  │        └── logs
       │  │  │           ├── current.log
       │  │  │           ├── previous.insecure.log
       │  │  │           └── previous.log
       │  │  ├── kibana-9d69668d4-2rkvz
       │  │  │  ├── kibana
       │  │  │  │  └── kibana
       │  │  │  │     └── logs
       │  │  │  │        ├── current.log
       │  │  │  │        ├── previous.insecure.log
       │  │  │  │        └── previous.log
       │  │  │  ├── kibana-9d69668d4-2rkvz.yaml
       │  │  │  └── kibana-proxy
       │  │  │     └── kibana-proxy
       │  │  │        └── logs
       │  │  │           ├── current.log
       │  │  │           ├── previous.insecure.log
       │  │  │           └── previous.log
       │  └── route.openshift.io
       │     └── routes.yaml
       └── openshift-operators-redhat
          ├── ...
  3. 使用一个或多个--image--image-stream参数运行oc adm must-gather命令。例如,以下命令同时收集默认的集群数据和KubeVirt相关信息

    $ oc adm must-gather \
     --image-stream=openshift/must-gather \ (1)
     --image=quay.io/kubevirt/must-gather (2)
    
    1 默认的OpenShift Container Platform must-gather镜像
    2 KubeVirt的must-gather镜像
  4. 从刚刚在工作目录中创建的 must-gather 目录创建压缩文件。例如,在使用 Linux 操作系统的计算机上,运行以下命令:

    $ tar cvaf must-gather.tar.gz must-gather.local.5421342344627712289/ (1)
    1 请务必将 must-gather-local.5421342344627712289/ 替换为实际的目录名称。
  5. 将压缩文件附加到 Red Hat 客户门户网站的 客户支持页面 上的支持案例。

其他资源

收集网络日志

您可以收集集群中所有节点上的网络日志。

步骤
  1. 使用--gather_network_logs运行oc adm must-gather命令。

    $ oc adm must-gather -- gather_network_logs

    默认情况下,must-gather工具会从集群中的所有节点收集OVN nbdbsbdb数据库。添加--gather_network_logs选项以包含包含OVN nbdb数据库的OVN-Kubernetes事务的其他日志。

  2. 从刚刚在工作目录中创建的 must-gather 目录创建压缩文件。例如,在使用 Linux 操作系统的计算机上,运行以下命令:

    $ tar cvaf must-gather.tar.gz must-gather.local.472290403699006248 (1)
    1 must-gather-local.472290403699006248替换为实际的目录名称。
  3. 将压缩文件附加到 Red Hat 客户门户网站的 客户支持页面 上的支持案例。

更改must-gather存储限制

使用oc adm must-gather命令收集数据时,信息的默认最大存储空间为容器存储容量的30%。达到30%的限制后,容器将被终止,收集过程停止。已收集的信息将下载到您的本地存储。要再次运行must-gather命令,您需要一个具有更多存储容量的容器或调整最大卷百分比。

如果容器达到存储限制,则会生成类似于以下示例的错误消息。

示例输出
Disk usage exceeds the volume percentage of 30% for mounted directory. Exiting...
先决条件
  • 您可以作为具有 cluster-admin 角色的用户访问集群。

  • 已安装OpenShift CLI (oc)。

步骤
  • 使用volume-percentage标志运行oc adm must-gather命令。新值不能超过100。

    $ oc adm must-gather --volume-percentage <storage_percentage>

获取集群ID

向Red Hat支持提供信息时,提供集群的唯一标识符非常有用。您可以使用OpenShift Container Platform Web控制台自动填充集群ID。您也可以使用Web控制台或OpenShift CLI (oc)手动获取集群ID。

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

  • 您可以访问Web控制台或已安装OpenShift CLI (oc)。

步骤
  • 要打开支持案例并使用Web控制台自动填充集群ID

    1. 从工具栏导航到(?) 帮助,然后从列表中选择共享反馈

    2. 告诉我们您的体验窗口中点击打开支持案例

  • 要使用Web控制台手动获取集群ID

    1. 导航到主页概述

    2. 该值可在详细信息部分的集群ID字段中找到。

  • 要使用OpenShift CLI (oc)获取集群ID,请运行以下命令

    $ oc get clusterversion -o jsonpath='{.items[].spec.clusterID}{"\n"}'

关于sosreport

sosreport是一个收集Red Hat Enterprise Linux (RHEL)和Red Hat Enterprise Linux CoreOS (RHCOS)系统的配置详细信息、系统信息和诊断数据的工具。sosreport提供了一种标准化的方式来收集与节点相关的诊断信息,然后可以将其提供给Red Hat支持进行问题诊断。

在某些支持交互中,Red Hat支持可能会要求您为特定的OpenShift Container Platform节点收集sosreport存档。例如,有时可能需要查看系统日志或oc adm must-gather输出中未包含的其他节点特定数据。

为OpenShift Container Platform集群节点生成sosreport存档

为OpenShift Container Platform 4.17集群节点生成sosreport的推荐方法是通过调试Pod。

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

  • 您可以SSH访问您的主机。

  • 您已安装OpenShift CLI (oc)。

  • 您拥有Red Hat标准或高级订阅。

  • 您拥有Red Hat客户门户帐户。

  • 您有现有的Red Hat支持案例ID。

步骤
  1. 获取集群节点列表

    $ oc get nodes
  2. 进入目标节点的调试会话。此步骤会实例化一个名为<node_name>-debug的调试Pod。

    $ oc debug node/my-cluster-node

    要进入带有NoExecute效应的标记目标节点的调试会话,请向虚拟命名空间添加容忍度,并在虚拟命名空间中启动调试Pod。

    $ oc new-project dummy
    $ oc patch namespace dummy --type=merge -p '{"metadata": {"annotations": { "scheduler.alpha.kubernetes.io/defaultTolerations": "[{\"operator\": \"Exists\"}]"}}}'
    $ oc debug node/my-cluster-node
  3. /host设置为调试shell中的根目录。调试Pod在Pod中的/host中挂载主机的根文件系统。通过将根目录更改为/host,您可以运行包含在主机可执行路径中的二进制文件。

    # chroot /host

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

  4. 启动一个 toolbox 容器,其中包含运行 sosreport 所需的二进制文件和插件。

    # toolbox

    如果已存在正在运行的 toolbox pod,则 toolbox 命令将输出 'toolbox-' already exists. Trying to start…​。删除正在运行的 toolbox 容器(使用 podman rm toolbox-)并启动一个新的 toolbox 容器,以避免 sosreport 插件出现问题。

  5. 收集一个 sosreport 归档文件。

    1. 运行 sosreport 命令以收集 criopodman 的必要故障排除数据。

      # sos report -k crio.all=on -k crio.logs=on  -k podman.all=on -k podman.logs=on (1)
      1 -k 允许您定义 sosreport 插件参数,使其超出默认值。
    2. 可选:要在报告中包含节点上 OVN-Kubernetes 网络配置的信息,请运行以下命令:

      # sos report --all-logs
    3. 出现提示时按Enter键继续。

    4. 提供 Red Hat 支持案例 ID。sosreport 会将 ID 添加到归档文件的名称中。

    5. sosreport 输出提供了归档文件的路径和校验和。以下示例输出引用支持案例 ID 01234567

      Your sosreport has been generated and saved in:
        /host/var/tmp/sosreport-my-cluster-node-01234567-2020-05-28-eyjknxt.tar.xz (1)
      
      The checksum is: 382ffc167510fd71b4f12a4f40b97a4e
      1 sosreport 归档文件的路径位于 chroot 环境之外,因为 toolbox 容器将主机的根目录挂载到 /host
  6. 使用以下方法之一,将 sosreport 归档文件提供给 Red Hat 支持部门进行分析。

    • 直接从 OpenShift Container Platform 集群将文件上传到现有的 Red Hat 支持案例。

      1. 在 toolbox 容器内,运行 redhat-support-tool 将归档文件直接附加到现有的 Red Hat 支持案例。此示例使用支持案例 ID 01234567

        # redhat-support-tool addattachment -c 01234567 /host/var/tmp/my-sosreport.tar.xz (1)
        1 toolbox 容器将主机的根目录挂载到 /host。使用 redhat-support-tool 命令指定要上传的文件时,请参考从 toolbox 容器根目录开始的绝对路径,包括 /host/
    • 将文件上传到现有的 Red Hat 支持案例。

      1. 通过运行 oc debug node/<node_name> 命令并将输出重定向到文件来连接 sosreport 归档文件。此命令假设您已退出之前的 oc debug 会话。

        $ oc debug node/my-cluster-node -- bash -c 'cat /host/var/tmp/sosreport-my-cluster-node-01234567-2020-05-28-eyjknxt.tar.xz' > /tmp/sosreport-my-cluster-node-01234567-2020-05-28-eyjknxt.tar.xz (1)
        1 调试容器将主机的根目录挂载到 /host。指定要连接的目标文件时,请参考从调试容器根目录开始的绝对路径,包括 /host

        运行 Red Hat Enterprise Linux CoreOS (RHCOS) 的 OpenShift Container Platform 4.17 集群节点是不可变的,并依赖于 Operators 来应用集群更改。不建议使用 scp 从集群节点传输 sosreport 归档文件。但是,如果 OpenShift Container Platform API 不可用,或者目标节点上的 kubelet 运行不正常,则 oc 操作将受到影响。在这种情况下,可以通过运行 scp core@<node>.<cluster_name>.<base_domain>:<file_path> <local_path> 来复制节点上的 sosreport 归档文件。

      2. 在 Red Hat 客户门户的客户支持页面中导航到现有的支持案例。

      3. 选择附加文件,然后按照提示上传文件。

查询引导节点日志

如果遇到与引导相关的問題,您可以从引导节点收集 bootkube.service journald 单元日志和容器日志。

先决条件
  • 您可以访问引导节点的 SSH。

  • 您拥有引导节点的完全限定域名。

步骤
  1. 在 OpenShift Container Platform 安装期间,从引导节点查询 bootkube.service journald 单元日志。将 <bootstrap_fqdn> 替换为引导节点的完全限定域名。

    $ ssh core@<bootstrap_fqdn> journalctl -b -f -u bootkube.service

    引导节点上的 bootkube.service 日志输出 etcd connection refused 错误,表明引导服务器无法连接到控制平面节点上的 etcd。在 etcd 在每个控制平面节点上启动并且节点加入集群后,错误应该停止。

  2. 使用引导节点上的 podman 收集引导节点容器的日志。将 <bootstrap_fqdn> 替换为引导节点的完全限定域名。

    $ ssh core@<bootstrap_fqdn> 'for pod in $(sudo podman ps -a -q); do sudo podman logs $pod; done'

查询集群节点日志

您可以收集各个集群节点上 journald 单元日志和 /var/log 中的其他日志。

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

  • 您已安装OpenShift CLI (oc)。

  • 您的 API 服务仍在运行。

  • 您可以SSH访问您的主机。

步骤
  1. 查询 OpenShift Container Platform 集群节点上的 kubelet journald 单元日志。以下示例仅查询控制平面节点。

    $ oc adm node-logs --role=master -u kubelet  (1)
    1 根据需要替换 kubelet 以查询其他单元日志。
  2. 收集集群节点上 /var/log/ 下特定子目录中的日志。

    1. 检索 /var/log/ 子目录中包含的日志列表。以下示例列出所有控制平面节点上 /var/log/openshift-apiserver/ 中的文件。

      $ oc adm node-logs --role=master --path=openshift-apiserver
    2. 检查 /var/log/ 子目录中的特定日志。以下示例输出所有控制平面节点上的 /var/log/openshift-apiserver/audit.log 内容。

      $ oc adm node-logs --role=master --path=openshift-apiserver/audit.log
    3. 如果 API 无法运行,请改用 SSH 检查每个节点上的日志。以下示例尾随 /var/log/openshift-apiserver/audit.log

      $ ssh core@<master-node>.<cluster_name>.<base_domain> sudo tail -f /var/log/openshift-apiserver/audit.log

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

网络跟踪方法

收集网络跟踪(以数据包捕获记录的形式)可以帮助 Red Hat 支持部门排除网络问题。

OpenShift Container Platform 支持两种执行网络跟踪的方法。查看下表并选择满足您需求的方法。

表 3. 支持的网络跟踪收集方法
方法 优点和功能

收集主机网络跟踪

您可以同时在一个或多个节点上执行指定持续时间的网络数据包捕获。达到指定的持续时间后,网络数据包捕获文件将从节点传输到客户端计算机。

您可以排查为什么特定操作会触发网络通信问题。运行数据包捕获,执行触发问题的操作,并使用日志来诊断问题。

从 OpenShift Container Platform 节点或容器收集网络跟踪

您可以在一个节点或一个容器上执行数据包捕获。您可以交互式地运行 tcpdump 命令,以便您可以控制数据包捕获的持续时间。

您可以手动启动数据包捕获,触发网络通信问题,然后手动停止数据包捕获。

此方法使用cat命令和shell重定向将数据包捕获数据从节点或容器复制到客户端机器。

收集主机网络跟踪

有时,通过跟踪网络通信并在多个节点上同时捕获数据包可以简化网络相关问题的故障排除。

您可以结合使用oc adm must-gather命令和registry.redhat.io/openshift4/network-tools-rhel8容器镜像从节点收集数据包捕获。分析数据包捕获可以帮助您排除网络通信问题。

oc adm must-gather命令用于在特定节点上的Pod中运行tcpdump命令。tcpdump命令记录Pod中的数据包捕获。当tcpdump命令退出时,oc adm must-gather命令将包含数据包捕获的文件从Pod传输到您的客户端机器。

以下步骤中的示例命令演示了如何使用tcpdump命令执行数据包捕获。但是,您可以在--image参数中指定的容器镜像中运行任何命令,以同时从多个节点收集故障排除信息。

先决条件
  • 您已以具有cluster-admin角色的用户身份登录到OpenShift Container Platform。

  • 您已安装OpenShift CLI (oc)。

步骤
  1. 通过运行以下命令,从某些节点的主机网络运行数据包捕获

    $ oc adm must-gather \
        --dest-dir /tmp/captures \  (1)
        --source-dir '/tmp/tcpdump/' \  (2)
        --image registry.redhat.io/openshift4/network-tools-rhel8:latest \  (3)
        --node-selector 'node-role.kubernetes.io/worker' \  (4)
        --host-network=true \  (5)
        --timeout 30s \  (6)
        -- \
        tcpdump -i any \  (7)
        -w /tmp/tcpdump/%Y-%m-%dT%H:%M:%S.pcap -W 1 -G 300
    1 --dest-dir参数指定oc adm must-gather将数据包捕获存储在客户端机器上相对于/tmp/captures的目录中。您可以指定任何可写入的目录。
    2 当在oc adm must-gather启动的调试Pod中运行tcpdump时,--source-dir参数指定数据包捕获临时存储在Pod上的/tmp/tcpdump目录中。
    3 --image参数指定包含tcpdump命令的容器镜像。
    4 --node-selector参数和示例值指定在工作节点上执行数据包捕获。或者,您可以改为指定--node-name参数以在单个节点上运行数据包捕获。如果您同时省略--node-selector--node-name参数,则将在所有节点上执行数据包捕获。
    5 --host-network=true参数是必需的,以便在节点的网络接口上执行数据包捕获。
    6 --timeout参数和值指定调试Pod运行30秒。如果您没有指定--timeout参数和持续时间,则调试Pod将运行10分钟。
    7 tcpdump命令的-i any参数指定在所有网络接口上捕获数据包。或者,您可以指定网络接口名称。
  2. 执行操作(例如访问 Web 应用程序),该操作会在网络跟踪捕获数据包时触发网络通信问题。

  3. 查看oc adm must-gather从Pod传输到客户端机器的数据包捕获文件

    tmp/captures
    ├── event-filter.html
    ├── ip-10-0-192-217-ec2-internal  (1)
    │   └── registry-redhat-io-openshift4-network-tools-rhel8-sha256-bca...
    │       └── 2022-01-13T19:31:31.pcap
    ├── ip-10-0-201-178-ec2-internal  (1)
    │   └── registry-redhat-io-openshift4-network-tools-rhel8-sha256-bca...
    │       └── 2022-01-13T19:31:30.pcap
    ├── ip-...
    └── timestamp
    1 数据包捕获存储在标识主机名、容器和文件名的目录中。如果您没有指定--node-selector参数,则主机名的目录级别不存在。

从OpenShift Container Platform节点或容器收集网络跟踪

在调查潜在的与网络相关的OpenShift Container Platform问题时,Red Hat支持可能需要来自特定OpenShift Container Platform集群节点或特定容器的网络数据包跟踪。在OpenShift Container Platform中捕获网络跟踪的推荐方法是通过调试Pod。

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

  • 您已安装OpenShift CLI (oc)。

  • 您有现有的Red Hat支持案例ID。

  • 您拥有Red Hat标准或高级订阅。

  • 您拥有Red Hat客户门户帐户。

  • 您可以SSH访问您的主机。

步骤
  1. 获取集群节点列表

    $ oc get nodes
  2. 进入目标节点的调试会话。此步骤会实例化一个名为<node_name>-debug的调试Pod。

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

    # chroot /host

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

  4. chroot环境控制台中,获取节点的接口名称

    # ip ad
  5. 启动一个 toolbox 容器,其中包含运行 sosreport 所需的二进制文件和插件。

    # toolbox

    如果已经运行了现有的toolbox Pod,则toolbox命令将输出'toolbox-' already exists. Trying to start…​。为避免tcpdump问题,请使用podman rm toolbox-删除正在运行的toolbox容器,并生成一个新的toolbox容器。

  6. 在集群节点上启动tcpdump会话并将输出重定向到捕获文件。此示例使用ens5作为接口名称

    $ tcpdump -nn -s 0 -i ens5 -w /host/var/tmp/my-cluster-node_$(date +%d_%m_%Y-%H_%M_%S-%Z).pcap  (1)
    1 tcpdump捕获文件的路径位于chroot环境之外,因为toolbox容器在/host处挂载主机的根目录。
  7. 如果需要针对节点上的特定容器进行tcpdump捕获,请按照以下步骤操作。

    1. 确定目标容器ID。此步骤中chroot host命令位于crictl命令之前,因为toolbox容器在/host处挂载主机的根目录

      # chroot /host crictl ps
    2. 确定容器的进程ID。在此示例中,容器ID为a7fe32346b120

      # chroot /host crictl inspect --output yaml a7fe32346b120 | grep 'pid' | awk '{print $2}'
    3. 在容器上启动tcpdump会话并将输出重定向到捕获文件。此示例使用49628作为容器的进程ID,并使用ens5作为接口名称。nsenter命令进入目标进程的命名空间并在其命名空间中运行命令。因为此示例中的目标进程是容器的进程ID,所以tcpdump命令是从主机在容器的命名空间中运行的

      # nsenter -n -t 49628 -- tcpdump -nn -i ens5 -w /host/var/tmp/my-cluster-node-my-container_$(date +%d_%m_%Y-%H_%M_%S-%Z).pcap  (1)
      1 tcpdump捕获文件的路径位于chroot环境之外,因为toolbox容器在/host处挂载主机的根目录。
  8. 使用以下方法之一,向Red Hat支持提供tcpdump捕获文件以进行分析。

    • 直接从 OpenShift Container Platform 集群将文件上传到现有的 Red Hat 支持案例。

      1. 在toolbox容器中,运行redhat-support-tool以将文件直接附加到现有的Red Hat支持案例。此示例使用支持案例ID01234567

        # redhat-support-tool addattachment -c 01234567 /host/var/tmp/my-tcpdump-capture-file.pcap (1)
        1 toolbox 容器将主机的根目录挂载到 /host。使用 redhat-support-tool 命令指定要上传的文件时,请参考从 toolbox 容器根目录开始的绝对路径,包括 /host/
    • 将文件上传到现有的 Red Hat 支持案例。

      1. 通过运行 oc debug node/<node_name> 命令并将输出重定向到文件来连接 sosreport 归档文件。此命令假设您已退出之前的 oc debug 会话。

        $ oc debug node/my-cluster-node -- bash -c 'cat /host/var/tmp/my-tcpdump-capture-file.pcap' > /tmp/my-tcpdump-capture-file.pcap (1)
        1 调试容器将主机的根目录挂载到 /host。指定要连接的目标文件时,请参考从调试容器根目录开始的绝对路径,包括 /host

        运行Red Hat Enterprise Linux CoreOS (RHCOS) 的OpenShift Container Platform 4.17集群节点是不可变的,并且依赖于Operators来应用集群更改。不建议使用scp从集群节点传输tcpdump捕获文件。但是,如果OpenShift Container Platform API不可用,或者kubelet在目标节点上无法正常工作,则oc操作将受到影响。在这种情况下,可以通过运行scp core@<node>.<cluster_name>.<base_domain>:<file_path> <local_path>从节点复制tcpdump捕获文件。

      2. 在 Red Hat 客户门户的客户支持页面中导航到现有的支持案例。

      3. 选择附加文件,然后按照提示上传文件。

向Red Hat支持提供诊断数据

在调查OpenShift Container Platform问题时,Red Hat支持可能会要求您将诊断数据上传到支持案例。可以通过Red Hat客户门户或直接使用redhat-support-tool命令从OpenShift Container Platform集群将文件上传到支持案例。

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

  • 您已安装OpenShift CLI (oc)。

  • 您可以SSH访问您的主机。

  • 您拥有Red Hat标准或高级订阅。

  • 您拥有Red Hat客户门户帐户。

  • 您有现有的Red Hat支持案例ID。

步骤
  • 通过Red Hat客户门户将诊断数据上传到现有的Red Hat支持案例。

    1. 使用oc debug node/<node_name>命令连接OpenShift Container Platform节点上包含的诊断文件,并将输出重定向到文件。以下示例将/host/var/tmp/my-diagnostic-data.tar.gz从调试容器复制到/var/tmp/my-diagnostic-data.tar.gz

      $ oc debug node/my-cluster-node -- bash -c 'cat /host/var/tmp/my-diagnostic-data.tar.gz' > /var/tmp/my-diagnostic-data.tar.gz (1)
      1 调试容器将主机的根目录挂载到 /host。指定要连接的目标文件时,请参考从调试容器根目录开始的绝对路径,包括 /host

      运行Red Hat Enterprise Linux CoreOS (RHCOS) 的OpenShift Container Platform 4.17集群节点是不可变的,并且依赖于Operators来应用集群更改。不建议使用scp从集群节点传输文件。但是,如果OpenShift Container Platform API不可用,或者kubelet在目标节点上无法正常工作,则oc操作将受到影响。在这种情况下,可以通过运行scp core@<node>.<cluster_name>.<base_domain>:<file_path> <local_path>从节点复制诊断文件。

    2. 在 Red Hat 客户门户的客户支持页面中导航到现有的支持案例。

    3. 选择附加文件,然后按照提示上传文件。

关于toolbox

toolbox是一个在Red Hat Enterprise Linux CoreOS (RHCOS)系统上启动容器的工具。该工具主要用于启动包含运行sosreportredhat-support-tool等命令所需的二进制文件和插件的容器。

toolbox容器的主要目的是收集诊断信息并将其提供给Red Hat支持。但是,如果需要其他诊断工具,您可以添加RPM包或运行作为标准支持工具镜像的替代方案的镜像。

将软件包安装到toolbox容器

默认情况下,运行toolbox命令会启动一个使用registry.redhat.io/rhel9/support-tools:latest镜像的容器。此镜像包含最常用的支持工具。如果您需要收集需要镜像中不包含的支持工具的节点特定数据,则可以安装其他软件包。

先决条件
  • 您已使用oc debug node/命令访问了一个节点。

  • 您可以以具有 root 权限的用户身份访问您的系统。

步骤
  1. /host设置为调试shell中的根目录。调试Pod在Pod中的/host中挂载主机的根文件系统。通过将根目录更改为/host,您可以运行包含在主机可执行路径中的二进制文件。

    # chroot /host
  2. 启动 toolbox 容器

    # toolbox
  3. 安装附加软件包,例如wget

    # dnf install -y <package_name>

使用toolbox启动替代镜像

默认情况下,运行toolbox命令会启动一个使用registry.redhat.io/rhel9/support-tools:latest镜像的容器。

您可以通过创建一个.toolboxrc文件并指定要运行的镜像来启动替代镜像。但是,在 OpenShift Container Platform 4.17 上不支持运行旧版本的support-tools镜像,例如registry.redhat.io/rhel8/support-tools:latest

先决条件
  • 您已使用oc debug node/命令访问了一个节点。

  • 您可以以具有 root 权限的用户身份访问您的系统。

步骤
  1. /host设置为调试shell中的根目录。调试Pod在Pod中的/host中挂载主机的根文件系统。通过将根目录更改为/host,您可以运行包含在主机可执行路径中的二进制文件。

    # chroot /host
  2. 可选:如果您需要使用替代镜像而不是默认镜像,请在 root 用户 ID 的主目录中创建一个.toolboxrc文件,并指定镜像元数据。

    REGISTRY=quay.io             (1)
    IMAGE=fedora/fedora:latest   (2)
    TOOLBOX_NAME=toolbox-fedora-latest  (3)
    1 可选:指定替代容器注册表。
    2 指定要启动的替代镜像。
    3 可选:为 toolbox 容器指定替代名称。
  3. 输入以下命令启动 toolbox 容器

    # toolbox

    如果已存在运行中的toolbox pod,则toolbox命令会输出'toolbox-' already exists. Trying to start…​。为避免sosreport插件出现问题,请使用podman rm toolbox-删除正在运行的 toolbox 容器,然后启动一个新的 toolbox 容器。