×

OpenShift Container Platform 运行在 RHCOS 上。您可以按照以下步骤来解决与操作系统相关的故障。

调查内核崩溃

kexec-tools 包中包含的 kdump 服务提供了一种崩溃转储机制。您可以使用此服务保存系统内存的内容以供以后分析。

x86_64 架构支持处于通用可用性 (GA) 状态的 kdump,而其他架构支持处于技术预览 (TP) 状态的 kdump。

下表详细介绍了不同架构的 kdump 支持级别。

表 1. RHCOS 中的 Kdump 支持
架构 支持级别

x86_64

GA

aarch64

TP

s390x

TP

ppc64le

TP

上表中前三种架构的 Kdump 支持仅为技术预览功能。技术预览功能不受 Red Hat 生产服务级别协议 (SLA) 的支持,并且功能可能不完整。Red Hat 不建议在生产环境中使用它们。这些功能可让您提前访问即将推出的产品功能,从而使客户能够在开发过程中测试功能并提供反馈。

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

启用 kdump

RHCOS 附带 kexec-tools 包,但需要手动配置才能启用 kdump 服务。

步骤

执行以下步骤以在 RHCOS 上启用 kdump。

  1. 要在第一次内核启动期间为崩溃内核保留内存,请通过输入以下命令提供内核参数

    # rpm-ostree kargs --append='crashkernel=256M'

    对于 ppc64le 平台,crashkernel 的推荐值为 crashkernel=2G-4G:384M,4G-16G:512M,16G-64G:1G,64G-128G:2G,128G-:4G

  2. 可选:要通过网络或写入其他位置(而不是默认的本地 /var/crash 位置)写入崩溃转储,请编辑 /etc/kdump.conf 配置文件。

    如果您的节点使用 LUKS 加密的设备,则必须使用网络转储,因为 kdump 不支持将崩溃转储保存到 LUKS 加密的设备。

    有关配置kdump服务的详细信息,请参阅/etc/sysconfig/kdump/etc/kdump.conf中的注释以及kdump.conf手册页。另请参考RHEL kdump文档,以获取有关配置转储目标的更多信息。

    如果您的主磁盘启用了多路径功能,则转储目标必须是NFS或SSH服务器,并且您必须从/etc/kdump.conf配置文件中排除多路径模块。

  3. 启用kdump systemd服务。

    # systemctl enable kdump.service
  4. 重新启动系统。

    # systemctl reboot
  5. 通过检查kdump.service systemd服务是否已成功启动并退出,以及命令cat /sys/kernel/kexec_crash_loaded是否打印值为1来确保kdump已加载崩溃内核。

第一天启用kdump

kdump服务旨在按节点启用以调试内核问题。由于启用kdump会产生成本,并且这些成本会随着每个额外启用kdump的节点而累积,因此建议仅在需要时才在每个节点上启用kdump服务。在每个节点上启用kdump服务的潜在成本包括:

  • 由于为崩溃内核保留内存而导致可用RAM减少。

  • 内核转储核心时节点不可用。

  • 使用更多存储空间来存储崩溃转储。

如果您了解启用kdump服务的缺点和权衡,则可以以集群范围的方式启用kdump。虽然尚不支持特定于机器的机器配置,但您可以在MachineConfig对象中使用systemd单元作为第一天定制,并在集群中的所有节点上启用kdump。您可以创建一个MachineConfig对象并将该对象注入到Ignition在集群设置期间使用的清单文件集中。

有关如何使用Ignition配置的更多信息和示例,请参阅《安装→安装配置》部分中的“自定义节点”。

步骤

创建用于集群范围配置的MachineConfig对象

  1. 创建一个Butane配置文件99-worker-kdump.bu,用于配置和启用kdump

    variant: openshift
    version: 4.17.0
    metadata:
      name: 99-worker-kdump (1)
      labels:
        machineconfiguration.openshift.io/role: worker (1)
    openshift:
      kernel_arguments: (2)
        - crashkernel=256M
    storage:
      files:
        - path: /etc/kdump.conf (3)
          mode: 0644
          overwrite: true
          contents:
            inline: |
              path /var/crash
              core_collector makedumpfile -l --message-level 7 -d 31
    
        - path: /etc/sysconfig/kdump (4)
          mode: 0644
          overwrite: true
          contents:
            inline: |
              KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swiotlb"
              KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices cgroup_disable=memory mce=off numa=off udev.children-max=2 panic=10 rootflags=nofail acpi_no_memhotplug transparent_hugepage=never nokaslr novmcoredd hest_disable" (5)
              KEXEC_ARGS="-s"
              KDUMP_IMG="vmlinuz"
    
    systemd:
      units:
        - name: kdump.service
          enabled: true
    1 为控制平面节点创建MachineConfig对象时,请将两个位置中的worker替换为master
    2 提供内核参数以保留用于崩溃内核的内存。如有必要,您可以添加其他内核参数。对于ppc64le平台,crashkernel的推荐值为crashkernel=2G-4G:384M,4G-16G:512M,16G-64G:1G,64G-128G:2G,128G-:4G
    3 如果要更改/etc/kdump.conf的内容(使其与默认值不同),请包含此部分并相应地修改inline子部分。
    4 如果要更改/etc/sysconfig/kdump的内容(使其与默认值不同),请包含此部分并相应地修改inline子部分。
    5 对于ppc64le平台,请将nr_cpus=1替换为maxcpus=1,因为该平台不支持nr_cpus=1

要将转储导出到NFS目标,必须将nfs内核模块显式添加到配置文件中。

/etc/kdump.conf文件示例
nfs server.example.com:/export/cores
core_collector makedumpfile -l --message-level 7 -d 31
extra_modules nfs
  1. 使用Butane生成一个机器配置YAML文件99-worker-kdump.yaml,其中包含要传递给节点的配置。

    $ butane 99-worker-kdump.bu -o 99-worker-kdump.yaml
  2. 在集群设置期间,将YAML文件放入<安装目录>/manifests/目录中。您也可以在集群设置之后使用YAML文件创建此MachineConfig对象。

    $ oc create -f 99-worker-kdump.yaml

测试kdump配置

请参阅RHEL kdump文档中的测试kdump配置部分。

分析核心转储

请参阅RHEL kdump文档中的分析核心转储部分。

建议在单独的RHEL系统上执行vmcore分析。

其他资源

调试Ignition故障

如果无法配置机器,Ignition将失败,RHCOS将启动到紧急shell。请使用以下步骤获取调试信息。

步骤
  1. 运行以下命令以显示哪些服务单元失败了。

    $ systemctl --failed
  2. 可选:在单个服务单元上运行以下命令以查找更多信息。

    $ journalctl -u <unit>.service