问题排查

编辑

我们收集了最常见的已知问题,并在此处列出。如果此处没有描述您的问题,请查看以下 GitHub 存储库中的未解决问题

存储库 查看或报告关于

elastic/kibana

Fleet 和集成 UI

elastic/elastic-agent

Elastic Agent

elastic/beats

Beats 采集器

elastic/fleet-server

Fleet Server

elastic/package-registry

Elastic Package Registry

elastic/observability-docs

文档问题

有问题吗?请阅读我们的常见问题解答,或在讨论论坛中与我们联系。您的反馈对我们非常重要。

是否正在独立运行 Elastic Agent?另请参阅调试独立的 Elastic Agent

问题排查内容

编辑

在以下文档中查找有关 Fleet、Fleet Server 和 Elastic Agent 的问题排查信息

Elastic Agent 取消注册失败

编辑

在 Fleet 中,如果您删除与一个或多个处于非活动状态的已注册 Agent 关联的 Elastic Agent 策略,当 Agent 返回到 HealthyOffline 状态时,将无法取消注册。尝试取消注册 Agent 会导致 Error unenrolling agent 消息,并且取消注册失败。

要解决此问题,您可以使用Kibana Fleet API强制取消注册 Agent。

要卸载单个 Elastic Agent

POST kbn:/api/fleet/agents/<agent_id>/unenroll
{
  "force": true,
  "revoke": true
}

要批量卸载一组 Elastic Agent

POST kbn:/api/fleet/agents/bulk_unenroll
{ "agents": ["<agent_id1>", "<agent-id2>"],
  "force": true,
  "revoke": true
}

我们还在更新 Fleet UI,以防止删除当前与任何非活动 Agent 关联的 Elastic Agent 策略。

启用 TSDB 时出现 illegal_argument_exception

编辑

当您使用启用了 TSDB(时间序列数据库)的 Elastic Agent 集成时,您可能会在 Fleet UI 中遇到 illegal_argument_exception 错误。

如果您的组件模板定义包含 _source 属性,而该属性与启用 TSDB 时使用的 _source: synthetic 设置冲突,则可能会发生这种情况。

有关该错误以及如何解决该错误的详细信息,请参阅创新中心文章为 Elastic Agent 启用 TSDB 集成中“运行时字段不能用于 TSDB 索引”部分。

托管在 Elastic Cloud 上的 Elastic Agent 卡在 UpdatingOffline 状态

编辑

在 Elastic Cloud 中,在升级 Fleet Server 及其集成策略后,在 Elastic Cloud Agent 策略中注册的 Agent 可能会在更新时遇到问题。要解决此问题

  1. 在终端窗口中,运行以下 cURL 请求,提供您的 Kibana 超级用户凭据以重置 Elastic Cloud Agent 策略。

    • 在 Kibana 版本 8.11 及更高版本上,运行

      curl -u <username>:<password> --request POST \
        --url <kibana_url>/internal/fleet/reset_preconfigured_agent_policies/policy-elastic-agent-on-cloud \
        --header 'content-type: application/json' \
        --header 'kbn-xsrf: xyz' \
        --header 'elastic-api-version: 1'
    • 在 Kibana 版本低于 8.11 的版本上,运行

      curl -u <username>:<password> --request POST \
        --url <kibana_url>/internal/fleet/reset_preconfigured_agent_policies/policy-elastic-agent-on-cloud \
        --header 'content-type: application/json' \
        --header 'kbn-xsrf: xyz'
  2. 强制取消注册卡在 Updating 状态的 Agent

    1. 要查找 Agent 的 ID,请转到Fleet > Agents 并单击 Agent 以查看其详细信息。复制 Agent ID。
    2. 在终端窗口中,运行

      curl -u <username>:<password> --request POST \
        --url <kibana_url>/api/fleet/agents/<agentID>/unenroll \
        --header 'content-type: application/json' \
        --header 'kbn-xsrf: xx' \
        --data-raw '{"force":true,"revoke":true}' \
        --compressed

      其中 <agentID> 是您在上一步中复制的 ID。

  3. 重新启动集成服务器

    在 Elastic Cloud 控制台中,在集成服务器下,单击强制重新启动

使用 Elastic Cloud 时,Kibana 中未列出 Fleet Server

编辑

如果您无法在 Kibana 中看到 Fleet Server,请确保已设置它。

要在 Elastic Cloud 上设置 Fleet Server

  1. 转到 Elastic Cloud 上的部署。
  2. 按照 Elastic Cloud 提示设置集成服务器。完成后,Fleet Server Elastic Agent 将显示在 Fleet 中。

要在自托管集群上启用 Fleet 并设置 Fleet Server

  1. 在 Elasticsearch 配置文件 config/elasticsearch.yml 中,设置以下安全设置以启用安全性和 API 密钥

    xpack.security.enabled: true
    xpack.security.authc.api_key.enabled: true
  2. 在 Kibana 配置文件 config/kibana.yml 中,启用 Fleet 并指定您的用户凭据

    xpack.encryptedSavedObjects.encryptionKey: "something_at_least_32_characters"
    elasticsearch.username: "my_username" 
    elasticsearch.password: "my_password"

    指定有权使用 Fleet 的用户。

    要设置密码,您可以使用记录的 Elasticsearch API 或 elasticsearch-setup-passwords 命令。例如,./bin/elasticsearch-setup-passwords auto

    运行命令后

    1. 将 Elastic 用户名复制到 Kibana 配置文件。
    2. 重新启动 Kibana。
    3. 按照记录的步骤设置自托管的 Fleet Server。有关更多信息,请参阅什么是 Fleet Server?

/api/fleet/setup 端点无法连接到程序包注册表

编辑

要安装集成,Fleet 应用程序需要连接到名为 Elastic Package Registry 的外部服务。

要使其正常工作,Kibana 服务器必须连接到端口 443 上的 https://epr.elastic.co

在气隙环境中,Kibana 无法连接到 Elastic Package Registry

编辑

在气隙环境中,如果您使用的是 Kibana 不可用的自定义证书颁发机构 (CA),则可能会遇到以下错误

{"type":"log","@timestamp":"2022-03-02T09:58:36-05:00","tags":["error","plugins","fleet"],"pid":58716,"message":"Error connecting to package registry: request to https://customer.server.name:8443/categories?experimental=true&include_policy_templates=true&kibana.version=7.17.0 failed, reason: self signed certificate in certificate chain"}

要解决此问题,请通过定义 NODE_EXTRA_CA_CERTS 环境变量,将 CA 证书文件路径添加到 Kibana 启动文件。有关此方面的更多信息,请参见Elastic Package Registry 的 TLS 配置部分。

Kibana 中的 Fleet 崩溃

编辑
  1. 要调查该错误,请打开浏览器的开发控制台。
  2. 选择网络选项卡,然后刷新页面。

    对 Fleet API 的请求之一很可能返回了错误。如果错误消息没有提供足够的信息来解决问题,请在讨论论坛中与我们联系。

主机上的 Elastic Agent 注册失败,并显示 x509: certificate signed by unknown authority 消息

编辑

为确保与 Fleet Server 的通信已加密,Fleet Server 要求 Elastic Agent 提供签名证书。在自托管集群中,如果您在设置 Fleet Server 时未指定证书,则会自动生成自签名证书。

如果您尝试在带有自签名证书的 Fleet Server 中注册 Elastic Agent,则会遇到以下错误

Error: fail to enroll: fail to execute request to fleet-server: x509: certificate signed by unknown authority
Error: enroll command failed with exit code: 1

要解决此问题,请在 enrollinstall 命令中传递 --insecure 标志。例如

sudo ./elastic-agent install --url=https://<fleet-server-ip>:8220 --enrollment-token=<token> --insecure

Elastic Agent 和 Fleet Server 之间通过 HTTPS 传输的流量将被加密;您只是在承认您了解无法验证证书链。

允许 Fleet Server 生成自签名证书对于启动开发工作很有用,但不建议在生产环境中使用。

有关更多信息,请参阅为自托管的 Fleet Server 配置 SSL/TLS

主机上的 Elastic Agent 注册失败,并显示 x509: cannot validate certificate for x.x.x.x because it doesn't contain any IP SANs 消息

编辑

为确保与 Elasticsearch 的通信已加密,Fleet Server 要求 Elasticsearch 提供签名证书。

当您使用以 IP 作为通用名称 (CN) 的 Elasticsearch 自签名证书时,会发生此错误。当 IP 作为 CN 时,Fleet Server 会查看主体备用名称 (SAN),该名称为空。要解决此问题,请使用 --fleet-server-es-insecure 标志禁用证书验证。

您还需要在 Fleet 和集成 UI 的输出设置中设置 ssl.verification_mode: none

主机上的 Elastic Agent 注册失败,并显示 Client.Timeout exceeded 消息

编辑

要在 Fleet 中注册,Elastic Agent 必须连接到 Fleet Server 实例。如果 Agent 无法连接,您将看到以下故障

fail to enroll: fail to execute request to {fleet-server}:Post http://fleet-server:8220/api/fleet/agents/enroll?: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

以下是帮助您排查问题的几个步骤。

  1. 检查网络问题。从主机运行 ping 命令以确认它可以访问 Fleet Server 实例。
  2. 此外,curl Fleet Server 的 /status API

    curl -f http://<fleet-server-url>:8220/api/status
  3. 验证您是否为您的环境指定了正确的 Kibana Fleet 设置 URL 和端口。

    默认情况下,Fleet Server 需要使用 HTTPS 协议和端口 8220 与 Elasticsearch 通信,除非您已明确设置。

  4. 检查您在注册期间是否指定了有效的注册密钥。为此,请执行以下操作

    1. 在 Fleet 中,选择注册令牌
    2. 要查看密钥,请单击眼球图标。密钥应与您用于在主机上注册 Elastic Agent 的字符串匹配。
    3. 如果密钥不匹配,请创建一个新的注册令牌,并在运行 elastic-agent enroll 命令时使用此令牌。

许多 Fleet Server 问题可以通过以下技巧进行分类和修复

编辑

在创建问题或发送支持论坛沟通时,本节可以帮助您确定所需的内容。

Fleet Server 允许 Elastic Agent 连接到 Elasticsearch,这与之前版本中连接到 Kibana 的方式相同。但是,由于 Fleet Server 位于边缘主机上,因此可能会导致额外的网络设置和故障排除。

检索 Elastic Agent 版本
编辑
  1. 如果您已安装 Elastic Agent,请运行以下命令(示例适用于基于 POSIX 的系统)

    elastic-agent version
  2. 如果您尚未安装 Elastic Agent,并且正在将其作为临时进程运行,则可以运行

    ./elastic-agent version

    上述两个命令都可以通过 Windows 或 macOS 访问,它们在调用方式上略有不同,具体取决于操作系统。如果需要,请参阅安装 Elastic Agent,了解如何调整它们的示例。

检查 Elastic Agent 状态
编辑

运行以下命令以查看 Elastic Agent 的当前状态。

elastic-agent status

根据返回的信息,您可以采取进一步的操作。

如果 Elastic Agent 正在运行,但您没有看到期望的结果,请查看以下事项

  1. 在 Fleet 中,单击 代理。检查哪个策略与正在运行的 Elastic Agent 相关联。如果它不是您期望的策略,您可以更改它。
  2. 在 Fleet 中,单击 代理,然后选择 Elastic Agent 策略。检查应包含的集成。

    例如,如果您想包含系统数据,请确保该策略中包含 系统 集成。

  3. 确认是否选择了 收集代理日志收集代理指标 选项。

    1. 在 Fleet 中,单击 代理,然后选择 Elastic Agent 策略。
    2. 选择 设置 选项卡。如果要收集代理日志或指标,请选择这些选项。

      Elastic Cloud 代理策略仅在 Elastic Cloud 部署中创建,并且默认情况下不包括日志或指标的收集。

收集 Elastic Agent 诊断包
编辑

Elastic Agent 诊断包收集以下信息

  1. Elastic Agent 版本号
  2. Beats(和其他进程)版本号和进程元数据
  3. 本地配置、elastic-agent 策略以及呈现并传递给 Beats 和其他进程的配置
  4. Elastic Agent 的本地日志文件
  5. Elastic Agent 和 Beats pprof 配置文件

请注意,诊断包仅用于调试目的,其结构可能在不同版本之间发生变化。

Elastic Agent 在创建诊断时会尝试自动编辑凭据和 API 密钥。请在共享之前检查存档的内容,以确保没有纯文本的凭据。

包含诊断信息的 ZIP 存档将包含发送到 Elastic Agent 输出的文档的原始事件。默认情况下,它只会将失败的事件记录为 warn。启用 debug 日志级别时,将记录所有事件。请在共享之前检查存档的内容,以确保不包含任何敏感信息。

使用 CLI 获取诊断包

运行以下命令生成包含诊断信息的 zip 存档,Elastic 团队可以使用这些信息来调试案例。

elastic-agent diagnostics

如果要从诊断中省略原始事件,请添加标志 --exclude-events

通过 Fleet 获取诊断包

Fleet 提供了远程生成和收集 Elastic Agent 诊断包的功能。如果代理在线且处于 健康不健康 状态,则可以收集并上传诊断信息。诊断信息将发送到 Fleet Server,然后将其添加到 Elasticsearch 中。因此,即使对于未使用 Elasticsearch 输出的 Elastic Agent,此功能也有效。要下载诊断包以供本地查看

  1. 在 Fleet 中,打开 代理 选项卡。
  2. 主机 列中,单击代理的名称。
  3. 单击 诊断 选项卡。
  4. 单击 请求诊断 .zip 按钮。

    Collect agent diagnostics under agent details

此页面上将列出 Elastic Agent 的任何正在进行或以前收集的捆绑包。

请注意,捆绑包存储在 Elasticsearch 中,并在 7 天后自动删除。您还可以通过单击 垃圾桶 图标来删除任何先前创建的捆绑包。

某些问题发生得太早,以至于没有足够的日志可用

编辑

如果某些问题发生得很早,并且没有足够的日志可用,请运行以下命令

./elastic-agent install -f

独立的安装命令会安装 Elastic Agent,并且会设置所有服务配置。现在您可以运行 _注册_ 命令。例如

elastic-agent enroll --fleet-server-es=https://<es-url>:443 --fleet-server-service-token=<token> --fleet-server-policy=<policy-id>

注意:端口 443 通常在 Elastic Cloud 中使用。但是,对于自管理部署,您的 Elasticsearch 可能在端口 9200 或完全不同的端口上运行。

有关在何处查找代理日志的信息,请参阅我们的 FAQ

Elastic Agent 被标记为 健康,但仍然存在向 Elasticsearch 发送数据的问题

编辑
  1. 要确认 Elastic Agent 正在运行且其状态为 健康,请选择 代理 选项卡。

    如果您之前选择了 收集代理日志 选项,您现在可以查看代理日志。

  2. 单击代理名称,然后选择 日志 选项卡。

    如果没有显示任何日志,则表明您的主机和 Elasticsearch 之间存在通信问题。可能的原因是端口已被占用。

  3. 您可以使用 Wireshark 或 netstat 等工具检查端口使用情况。在 POSIX 系统上,您可以运行以下命令

    netstat -nat | grep :8220

    任何响应数据都表明该端口正在使用中。如果您打算卸载 Fleet Server,这可能是正确的,也可能不正确。在这种情况下,请重新检查并继续。

Elastic Agent 的状态停留在 正在更新

编辑

从 Elastic Stack 8.11 版本开始,应该会自动检测到卡住的 Elastic Agent 升级,您可以从 Fleet 重新启动升级

Fleet Server 正在运行且数据正常,但其他代理无法使用它连接到 Elasticsearch

编辑

某些设置仅在您有多个 Elastic Agent 时使用。如果是这种情况,检查主机是否可以与 Fleet Server 通信可能会有所帮助。

从非 Fleet Server 主机运行以下命令

curl -f http://<fleet-server-ip>:8220/api/status

响应可能会产生您可以进一步调试的错误,或者它可能有效并表明通信端口和网络不是问题。

一个常见的问题是,Fleet Server 的默认端口 8220 未在 Fleet Server 主机上打开以进行通信。您可以使用常用工具根据您可能存在的任何网络和安全问题来查看和纠正此问题。

Elasticsearch 身份验证服务失败,并显示 使用 apikey 的身份验证失败 消息

编辑

为了保存 API 密钥并在 Elasticsearch 中对其进行加密,Fleet 需要一个加密密钥。

要提供 API 密钥,请在 kibana.yml 配置文件中,设置 xpack.encryptedSavedObjects.encryptionKey 属性。

xpack.encryptedSavedObjects.encryptionKey: "something_at_least_32_characters"

Elastic Agent 失败,并显示 代理进程不是 root/管理员或验证失败 消息

编辑

确保运行 Elastic Agent 的用户具有 root 权限,因为某些集成需要 root 权限才能收集敏感数据。

如果您在 Linux 或 macOS 上在前台(而不是作为服务)运行 Elastic Agent,请在 root 用户下运行代理:sudosu

如果您正在使用 Elastic Defend 集成,请确保在 SYSTEM 帐户下运行 Elastic Agent。

如果您按照安装 Elastic Agent中所述将 Elastic Agent 作为服务安装,则 Elastic Agent 默认在 SYSTEM 帐户下运行。

要在 SYSTEM 帐户下运行 Elastic Agent,您可以执行以下操作

  1. 下载 PsExec 并将内容提取到文件夹中。例如,d:\tools
  2. 以管理员身份打开命令提示符(右键单击命令提示符图标,然后选择 以管理员身份运行)。
  3. 从命令提示符,在 SYSTEM 帐户下运行 Elastic Agent

    d:\tools\psexec.exe -sid "C:\Program Files\Elastic-Agent\elastic-agent.exe" run

集成策略升级存在太多冲突

编辑

如果您尝试升级一个版本过旧的集成策略,则可能会出现大量的冲突或配置问题。与其尝试解决这些问题,不如创建一个新的策略,对其进行测试,并将集成升级推广到其他主机可能会更快。

升级集成之后

  1. 创建一个新的策略.
  2. 将集成添加到策略。将自动使用较新的版本。
  3. 将策略应用于 Elastic Agent。

    在较大的部署中,您应该在推广更大的升级计划之前,在示例 Elastic Agent 上测试集成升级。只有在小型试用被认为是成功之后,才应将更新的策略推广到所有主机。

  4. 将集成更新推广到其他主机

    1. 在 Fleet 中,单击 代理策略。单击要编辑的策略的名称。
    2. 搜索或滚动到特定的集成。打开 操作 菜单,然后选择 删除集成
    3. 单击 添加集成,然后重新添加刚删除的集成。将使用更新的版本并将其应用于所有 Elastic Agent。
    4. 为每个具有过时集成的策略重复此过程。

      在某些情况下,例如,当需要更新成百上千个不同的 Elastic Agent 和策略时,此升级路径不可行。在这种情况下,请更新一个策略,并使用 复制策略 操作将更新的策略版本应用于其他策略。此方法的缺点是失去了单独评估跨策略的各个集成版本更改的粒度。

Elastic Agent 在取消注册时挂起

编辑

取消注册 Elastic Agent 时,Fleet 会等待代理的确认,然后才会完成取消注册过程。如果 Fleet 没有收到确认,则状态会停留在 unenrolling

您可以取消注册代理,以使所有与该代理相关的 API 密钥失效,并将状态更改为 inactive,这样该代理将不再出现在 Fleet 中。

  1. 在 Fleet 中,选择 Agents
  2. 在“Agents”下,从要取消注册的代理旁边的 Actions 菜单中选择 Unenroll agent
  3. 单击 Force unenroll

在 Fleet Server 启动时,出现错误 State changed to CRASHED: exited with code: 1

编辑

您可能会由于多种不同的原因看到此错误消息。一个常见原因是,在尝试类似生产环境的使用时,找不到传入的 ca.crt 文件。要验证是否是此问题,请在不传入 ca.crt 文件的情况下引导 Fleet Server。这意味着您将临时使用 {fleet-sever} 自己的自签名证书来测试任何后续的 Elastic Agent 安装。

确保传入 ca.crt 文件的完整路径。相对路径不可行。

当您在 Elastic Agent 安装过程中看到以下错误时,您就知道您的 Fleet Server 已设置为使用其面向测试的自签名证书:

Error: fail to enroll: fail to execute request to fleet-server: x509: certificate signed by unknown authority
Error: enroll command failed with exit code: 1

要针对自签名证书 Fleet Server Elastic Agent 进行安装或注册,请将 --insecure 选项添加到命令中。

sudo ./elastic-agent install --url=https://<fleet-server-ip>:8220 --enrollment-token=<token> --insecure

有关更多信息,请参阅主机上 Elastic Agent 注册失败,并显示 x509: certificate signed by unknown authority 消息

卸载 Elastic Agent 时 Elastic Endpoint 失败

编辑

当您卸载 Elastic Agent 时,由 Elastic Agent 管理的所有程序(如 Elastic Endpoint)也会被删除。如果卸载失败,Elastic Endpoint 可能会保留在您的系统中。

要删除 Elastic Endpoint,请运行以下命令

cd /tmp
cp /Library/Elastic/Endpoint/elastic-endpoint elastic-endpoint
sudo ./elastic-endpoint uninstall
rm elastic-endpoint

API 密钥未被授权向 .logs-endpoint.diagnostic.collection-* 索引发送遥测数据

编辑

默认情况下,Elastic Stack 中启用了遥测功能,以帮助我们了解用户最感兴趣的功能。这有助于我们将精力集中在改进功能上。

如果您最近从 7.10 版本升级到 7.11 版本,则在查看 Elastic Defend 日志时可能会看到以下消息:

action [indices:admin/auto_create] is unauthorized for API key id [KbvCi3YB96EBa6C9k2Cm]
of user [fleet_enroll] on indices [.logs-endpoint.diagnostic.collection-default]

以上消息表明 Elastic Endpoint 没有发送遥测数据的正确权限。这是 7.11 中的已知问题,将在即将发布的补丁版本中修复。

要从日志中删除此消息,您可以关闭 Elastic Defend 集成的遥测功能,直到下一个补丁版本可用。

  1. 在 Kibana 中,单击 Integrations,然后选择 Manage 选项卡。
  2. 单击 Elastic Defend,然后选择 Policies 选项卡以查看所有已安装的集成。
  3. 单击集成以进行编辑。
  4. 在高级设置下,将 windows.advanced.diagnostic.enabled 设置为 false,然后保存集成。

托管的 Elastic Agent 处于脱机状态

编辑

为了扩展 Fleet Server 部署,当需要或不再需要托管的 Elastic Agent 时,Elastic Cloud 会启动新容器或关闭旧容器。旧的 Elastic Agent 将在 Agent 列表中显示 24 小时,然后自动消失。

Elastic Agent 无法注册在 localhost 上运行的 Fleet Server。

编辑

如果您在 macOS 系统上使用 localhost (https://127.0.0.1:8220) 作为主机 URL 在本地测试 Fleet Server,则可能会遇到此错误:

Error: fail to enroll: fail to execute request to fleet-server:
lookup My-MacBook-Pro.local: no such host

这可能发生在较新的 macOS 软件上。要解决此问题,请确保在本地系统上启用了文件共享

APM 和 Fleet 无法在 Elastic Cloud 上升级到 8.x

编辑

在某些情况下,如果手动修改了 Elastic Cloud 代理策略,则将 APM 和 Fleet 升级到 8.x 可能会失败。Kibana 中的 Fleet 应用程序可能会显示如下消息:

Unable to create package policy. Package 'apm' already exists on this agent policy

要解决此问题,您可以使用 API 调用重置 Elastic Cloud 代理策略。请注意,这将删除您添加到策略中的任何自定义集成策略,例如 Synthetics 监视器。

curl -u elastic:<password> --request POST \
  --url <kibana_url>/internal/fleet/reset_preconfigured_agent_policies/policy-elastic-agent-on-cloud \
  --header 'Content-Type: application/json' \
  --header 'kbn-xsrf: xyz'

由于无法访问 PGP 密钥,空载 Elastic Agent 升级可能会失败

编辑

在 8.9 及更高版本中,当升级程序无法访问验证二进制签名所需的 PGP 密钥时,Elastic Agent 升级可能会失败。有关详细信息和解决方法,请参阅 8.9.0 版本发行说明中的空载环境中 PGP 密钥下载失败已知问题,或参阅 elastic-agent GitHub 存储库中的解决方法文档

删除 Fleet Server 集成后,Elastic Agent 无法连接

编辑

当您使用 Fleet 管理的 Elastic Agent 时,至少需要一个 Elastic Agent 运行Fleet Server 集成。如果包含此集成的策略意外地从 Elastic Agent 中删除,则将无法管理所有其他代理。但是,Elastic Agent 将继续向其配置的输出发送数据。

有两种方法可以解决此问题,具体取决于运行 Fleet Server 集成的 Elastic Agent 是否仍已安装并运行正常(但现在正在运行另一个策略)。

要恢复 Elastic Agent:

  1. 在 Fleet 中,打开 Agents 选项卡,然后单击 Add agent
  2. Add agent 弹出窗口中,选择一个包含 Fleet Server 集成的代理策略。在 Elastic Cloud 上,您可以使用包含该集成的 Elastic Cloud 代理策略
  3. 按照弹出窗口中的说明操作,并在运行 CLI 命令之前停止。
  4. 根据原始 Fleet Server Elastic Agent 的状态,执行以下操作之一:

    • 原始 Fleet Server Elastic Agent 仍在运行且运行正常

      在这种情况下,您只需使用 Fleet 重新注册代理即可。

      1. 从 Kibana UI 复制 elastic-agent install 命令。
      2. 在命令中,将 install 替换为 enroll
      3. 在 Elastic Agent 正在运行的目录中(例如,在 Linux 上为 /opt/Elastic/Agent/),以 root 身份运行该命令。

        例如,如果 Kibana 为您提供了以下命令:

        sudo ./elastic-agent install --url=https://fleet-server:8220 --enrollment-token=bXktc3VwZXItc2VjcmV0LWVucm9sbWVudC10b2tlbg==

        请改为运行:

        sudo ./elastic-agent enroll --url=https://fleet-server:8220 --enrollment-token=bXktc3VwZXItc2VjcmV0LWVucm9sbWVudC10b2tlbg==
    • 原始 Fleet Server Elastic Agent 不再安装

      在这种情况下,您需要再次安装代理。

      1. 从 Kibana UI 复制命令。无需更改命令。
      2. 按顺序运行命令。前三个命令将下载新的 Elastic Agent 安装包、解压存档并更改目录。

        最后一个命令将安装 Elastic Agent。例如:

        sudo ./elastic-agent install --url=https://fleet-server:8220 --enrollment-token=bXktc3VwZXItc2VjcmV0LWVucm9sbWVudC10b2tlbg==

运行这些步骤后,您的 Elastic Agent 应能够再次连接到 Fleet。

Kubernetes 上的 Elastic Agent 内存不足错误

编辑

在 Kubernetes 环境中,由于可用内存不足,Elastic Agent 可能会因 OOMKilled 原因被终止。

要检测问题,请运行 kubectl describe pod 命令,并检查结果中是否包含以下内容:

       Last State:   Terminated
       Reason:       OOMKilled
       Exit Code:    137

要解决此问题,请为代理分配更多内存,然后重新启动它。

使用 sudo 运行 Elastic Agent 命令时出错

编辑

在 Linux 系统上,当您在没有管理权限的情况下安装 Elastic Agent 时(即使用 --unprivileged 标志),不应使用 sudo 运行 Elastic Agent 命令。这样做可能会导致错误,因为代理没有所需的权限。

例如,当您使用 --unprivileged 标志运行 Elastic Agent 时,运行 elastic-agent inspect 命令将导致如下错误:

Error: error loading agent config: error loading raw config: fail to read configuration /Library/Elastic/Agent/fleet.enc for the elastic-agent: fail to decode bytes: cipher: message authentication failed

要解决此问题,请在不使用 --unprivileged 标志的情况下安装 Elastic Agent,以便它具有管理访问权限,或者在不使用 sudo 前缀的情况下运行 Elastic Agent 命令。

使用 Kustomize 解决 Kubernetes 上 Elastic Agent 安装问题

编辑

Kubernetes 上 Elastic Agent 安装期间的潜在问题可以分为两个主要领域:

与清单中对象的创建相关的问题
编辑

在使用 Kustomize 进行故障排除安装时,最好检查渲染清单的输出。为此,请使用 Kibana Onboarding 提供的安装命令,并将最后一部分 | kubectl apply -f- 替换为重定向到本地文件。这有助于更轻松地分析渲染的输出。

例如,以下命令最初由 Kibana 为 Elastic Agent Standalone 安装提供,并已修改为将输出重定向以进行故障排除:

kubectl kustomize https://github.com/elastic/elastic-agent/deploy/kubernetes/elastic-agent-kustomize/default/elastic-agent-standalone\?ref\=v8.15.3 | sed -e 's/JUFQSV9LRVkl/ZDAyNnZaSUJ3eWIwSUlCT0duRGs6Q1JfYmJoVFRUQktoN2dXTkd0FNMtdw==/g' -e "s/%ES_HOST%/https:\/\/7a912e8674a34086eacd0e3d615e6048.us-west2.gcp.elastic-cloud.com:443/g" -e "s/%ONBOARDING_ID%/db687358-2c1f-4ec9-86e0-8f1baa4912ed/g" -e "s/\(docker.elastic.co\/beats\/elastic-agent:\).*$/\18.15.3/g" -e "/{CA_TRUSTED}/c\ " > elastic_agent_installation_complete_manifest.yaml

前面的命令生成一个名为 elastic_agent_installation_complete_manifest.yaml 的本地文件,您可以将其用于进一步分析。它包含 Elastic Agent 安装所需的全套资源,包括:

  • RBAC 对象 (ServiceAccountsRoles 等)
  • 用于 Elastic Agent 配置的 ConfigMapsSecrets
  • 部署为 DaemonSet 的 Elastic Agent Standalone
  • 部署为 DeploymentKube-state-metrics

此文件的内容等效于您按照在 Kubernetes 上运行 Elastic Agent Standalone 步骤获得的内容,但 kube-state-metrics 不包含在独立方法中。

可能的问题:

  • 如果您的用户没有 cluster-admin 权限,则 RBAC 资源的创建可能会失败。
  • 某些 Kubernetes 安全机制(如Pod 安全标准)可能会导致部分清单被拒绝,因为需要 hostNetwork 访问和 hostPath 卷。
  • 如果已安装了 kube-state-metrics,可能会导致清单安装失败,或者在没有通知的情况下更新您现有的资源。
安装后特定组件中出现的故障
编辑

如果安装正确且所有资源都已部署,但数据未按预期流动(例如,您在 [指标 Kubernetes] 集群概览 仪表板上看不到任何数据),请检查以下项目

  1. 检查资源状态,确保它们都处于 Running 状态

    kubectl get pods -n kube-system | grep elastic
    kubectl get pods -n kube-system | grep kube-state-metrics

    默认配置假设 kube-state-metrics 和 Elastic Agent DaemonSet 为了通信目的部署在 同一命名空间 中。如果您更改任何组件的命名空间,则代理配置将需要进一步的策略更新。

  2. 如果 Pod 处于 Pending 状态,请描述 Pod

    kubectl describe -n kube-system <name_of_elastic_agent_pod>
  3. 检查 elastic-agents 和 kube-state-metrics 的日志,并查找错误或警告

    kubectl logs -n kube-system <name_of_elastic_agent_pod>
    kubectl logs -n kube-system <name_of_elastic_agent_pod> | grep -i error
    kubectl logs -n kube-system <name_of_elastic_agent_pod> | grep -i warn
    kubectl logs -n kube-system <name_of_kube-state-metrics_pod>

可能的问题:

  • 连接到 Elasticsearch 时出现连接、授权或身份验证问题

    确保安装期间使用的 API 密钥和 Elasticsearch 目标端点正确,并且可以从 Pod 内部访问。

    在已安装的系统中,API 密钥存储在名为 elastic-agent-creds-<hash>Secret 中,端点在 ConfigMap elastic-agent-configs-<hash> 中配置。

  • 缺少集群级指标(由 kube-state-metrics 提供)

    在 Kubernetes 上独立运行 Elastic Agent 中所述,充当 leader 的 Elastic Agent Pod 负责从 kube-state-metrics 检索集群级指标,并将它们传递到前缀为 metrics-kubernetes.state_<resource>数据流。为了排除这些指标未出现的情况,请执行以下操作

    1. 使用以下命令确定集群中哪个 Pod 拥有 领导权 租约

      kubectl get lease -n kube-system elastic-agent-cluster-leader
    2. 检查该 Pod 的日志,查看在连接到 kube-state-metrics 时是否有错误,以及 state_* 指标是否正在发送到 Elasticsearch。

      检查 state_* 指标是否正在传递到 Elasticsearch 的一种方法是,检查带有 "Non-zero metrics in the last 30s" 消息的日志行,并检查该行中 state_* 指标的值,例如

      kubectl logs -n kube-system elastic-agent-xxxx | grep "Non-zero metrics" | grep "state_"

      如果之前的命令返回 "state_pod":{"events":213,"success":213} 或所有 state_* 指标的类似结果,则表示指标正在传递。

    3. 作为最后的手段,如果您认为没有 Pod 充当领导者,您可以尝试删除 lease 来生成新的一个

      kubectl delete lease -n kube-system elastic-agent-cluster-leader
      # wait a few seconds and check for the lease again
      kubectl get lease -n kube-system elastic-agent-cluster-leader
  • 性能问题

    监控代理 Pod 的 CPU 和内存使用情况,并根据需要调整清单请求和限制。有关所需资源的更多详细信息,请参阅 在 Kubernetes 上扩展 Elastic Agent

有关 Kubernetes 上 Elastic Agent 故障排除和信息的其他资源