在容器中运行 Elastic Agent
编辑在容器中运行 Elastic Agent
编辑您可以在容器内运行 Elastic Agent —— 无论是使用 Fleet Server 还是独立运行。所有版本的 Elastic Agent 的 Docker 镜像都可从 Elastic Docker 注册表 获取。如果您在 Kubernetes 中运行,请参考 在 ECK 上运行 Elastic Agent。
请注意,仅在 Linux 环境中支持在容器中运行 Elastic Agent。因此,我们目前不提供 Windows 的 Elastic Agent 容器镜像。
注意事项
- 当 Elastic Agent 在容器内运行时,由于它期望容器本身进行升级,因此无法通过 Fleet 进行升级。
- 注册和运行 Elastic Agent 通常是一个两步过程。但是,这在容器中不起作用,因此会调用一个特殊的子命令
container
。此命令允许使用环境变量配置所有属性,并将enroll
和run
命令作为单个命令运行。
您需要什么
编辑- 已安装 Docker.
-
Elasticsearch 用于存储和搜索您的数据,Kibana 用于可视化和管理数据。
要快速入门,请启动我们 托管的 Elasticsearch 服务 的部署。Elasticsearch 服务可在 AWS、GCP 和 Azure 上使用。 免费试用。
要安装和运行 Elasticsearch 和 Kibana,请参阅 安装 Elastic Stack。
步骤 1:拉取镜像
编辑Elastic Agent 有两个镜像,elastic-agent 和 elastic-agent-complete。elastic-agent 镜像包含运行 Beats 的所有二进制文件,而 elastic-agent-complete 镜像包含这些二进制文件以及通过 Elastic Synthetics 运行浏览器监控器的其他依赖项。有关更多信息,请参阅 通过 Elastic Agent 和 Fleet 进行合成监控。
针对 Elastic Docker 注册表运行 docker pull
命令
docker pull docker.elastic.co/elastic-agent/elastic-agent:8.16.0
如果您想运行 Synthetics 测试,请运行 docker pull
命令来获取 elastic-agent-complete 镜像
docker pull docker.elastic.co/elastic-agent/elastic-agent-complete:8.16.0
步骤 2:可选:验证镜像
编辑虽然这是可选的,但我们强烈建议您验证下载的 Docker 镜像中包含的签名,以确保镜像有效。
Elastic 镜像使用 Cosign 签名,它是 Sigstore 项目的一部分。Cosign 支持在 OCI 注册表中进行容器签名、验证和存储。为您的操作系统安装相应的 Cosign 应用程序。
运行以下命令以验证 Elastic Agent v8.16.0 的 elastic-agent 容器镜像签名
wget https://artifacts.elastic.co/cosign.pub cosign verify --key cosign.pub docker.elastic.co/elastic-agent/elastic-agent:8.16.0
如果您使用的是 elastic-agent-complete 镜像,请按如下所示运行命令
wget https://artifacts.elastic.co/cosign.pub cosign verify --key cosign.pub docker.elastic.co/elastic-agent/elastic-agent-complete:8.16.0
该命令将以 JSON 格式打印检查结果和签名有效负载,例如
Verification for docker.elastic.co/elastic-agent/elastic-agent-complete:8.16.0 -- The following checks were performed on each of these signatures: - The cosign claims were validated - Existence of the claims in the transparency log was verified offline - The signatures were verified against the specified public key
步骤 3:了解 Elastic Agent 容器命令
编辑Elastic Agent 容器命令提供了各种各样的选项。要查看完整列表,请运行
docker run --rm docker.elastic.co/elastic-agent/elastic-agent:8.16.0 elastic-agent container -h
步骤 4:运行 Elastic Agent 镜像
编辑docker run \ --env FLEET_ENROLL=1 \ --env FLEET_URL=<fleet-server-host-url> \ --env FLEET_ENROLLMENT_TOKEN=<enrollment-token> \ --rm docker.elastic.co/elastic-agent/elastic-agent:8.16.0
设置为 1 以将 Elastic Agent 注册到 Fleet Server。 |
|
注册 Fleet Server 的 URL。您可以在 Kibana 中找到它。选择 管理 → Fleet → Fleet 设置,然后复制 Fleet Server 主机 URL。 |
|
用于注册的令牌。关闭浮动面板并选择 注册令牌。找到要将 Elastic Agent 注册到的 Agent 策略,然后显示并复制密钥令牌。要了解如何创建策略,请参考 创建不使用 UI 的代理策略。 |
|
如果您想运行 elastic-agent-complete 镜像,请将 |
有关所有可用选项,请参阅 环境变量。
如果您正在运行自管理集群并想要运行您自己的 Fleet Server,请运行以下命令,该命令将在容器中启动 Elastic Agent 和 Fleet Server
docker run \ --env FLEET_SERVER_ENABLE=true \ --env FLEET_SERVER_ELASTICSEARCH_HOST=<elasticsearch-host> \ --env FLEET_SERVER_SERVICE_TOKEN=<service-token> \ --env FLEET_SERVER_POLICY_ID=<fleet-server-policy> \ -p 8220:8220 \ --rm docker.elastic.co/elastic-agent/elastic-agent:8.16.0
设置为 1 以在此 Elastic Agent 上引导 Fleet Server。 |
|
集群的 Elasticsearch 主机 URL。 |
|
Fleet 服务令牌。在 Fleet UI 中生成一个,如果您还没有的话。 |
|
Fleet Server 策略的 ID。我们建议只拥有一个 fleet-server 策略。要了解如何创建策略,请参考 创建不使用 UI 的代理策略。 |
|
将容器端口 8220 发布到主机。 |
|
如果您想运行 elastic-agent-complete 镜像,请将 |
有关所有可用选项,请参阅 环境变量。
如果您还需要运行 Fleet Server,请通过添加以下环境变量来调整上面的 docker run
命令
--env FLEET_SERVER_ENABLE=true \ --env FLEET_SERVER_ELASTICSEARCH_HOST=<elasticsearch-host> \ --env FLEET_SERVER_SERVICE_TOKEN=<service-token>
设置为 |
|
Fleet Server 用于与之通信的 Elasticsearch 主机,例如 |
|
用于与 Elasticsearch 和 Kibana 通信的服务令牌。 |
在只读文件系统上运行 Elastic Agent
如果您想在只读文件系统上的 Docker 容器中运行 Elastic Agent,您可以通过指定 --read-only
选项来实现。Elastic Agent 需要一个有状态目录来存储应用程序数据,因此使用 --read-only
选项时,您还需要使用 --mount
选项指定可以存储该数据的路径。
例如
docker run --rm --mount source=$(pwd)/state,destination=/state -e {STATE_PATH}=/state --read-only docker.elastic.co/elastic-agent/elastic-agent:8.16.0 <1>
其中 {STATE_PATH} 是要挂载的有状态目录的路径,Elastic Agent 应用程序数据可以存储在此处。
您还可以将 type=tmpfs
添加到挂载参数中(--mount type=tmpfs,destination=/state...
)以指定临时文件存储位置。这应该谨慎操作,因为它可能会导致数据重复,尤其是在容器重启时日志数据重复,因为没有持久化状态数据。
步骤 5:在 Kibana 中查看您的数据
编辑-
启动 Kibana
-
要检查您的 Elastic Agent 是否已注册到 Fleet,请转到 管理 → Fleet → Agent。
- 要查看流入的数据,请转到 分析 → 发现 并选择索引
metrics-*
,甚至更具体的metrics-kubernetes.*
。如果您看不到这些索引,请 为其创建一个数据视图。 - 要查看预定义的仪表板,请选择 分析 → 仪表板 或 通过集成安装资源。
Docker compose
编辑您可以在 docker-compose 中运行 Elastic Agent。以下示例显示了如何注册 Elastic Agent
version: "3" services: elastic-agent: image: docker.elastic.co/elastic-agent/elastic-agent:8.16.0 container_name: elastic-agent restart: always user: root # note, synthetic browser monitors require this set to `elastic-agent` environment: - FLEET_ENROLLMENT_TOKEN=<enrollment-token> - FLEET_ENROLL=1 - FLEET_URL=<fleet-server-url>
如果您打算使用完整版本,请将 |
如果您还需要运行 Fleet Server,请通过添加以下环境变量来调整上面的 docker-compose 文件
- FLEET_SERVER_ENABLE=true - FLEET_SERVER_ELASTICSEARCH_HOST=<elasticsearch-host> - FLEET_SERVER_SERVICE_TOKEN=<service-token>
有关所有可用选项,请参阅 环境变量。
日志
编辑由于容器仅支持单个版本的 Elastic Agent,因此日志和状态的存储方式与在容器外部运行 Elastic Agent 时略有不同。日志位于:/usr/share/elastic-agent/state/data/logs/*
。
重要的是要注意,只有来自 Elastic Agent 进程本身的日志才会记录到 stdout
。子进程日志不会。每个子进程都会将其自己的日志写入日志目录内的 default
目录
/usr/share/elastic-agent/state/data/logs/default/*
遇到 Fleet Server 错误?检查 fleet-server 子进程日志以获取更多信息。
调试
编辑可以启用监控端点以公开资源使用情况和事件处理数据。该端点与在 Fleet 模式和独立模式下运行的 Elastic Agent 兼容。
在安装 Elastic Agent 的主机上的 elastic-agent.yml
中启用监控端点。示例配置如下所示
agent.monitoring: enabled: true logs: true metrics: true http: enabled: true host: localhost port: 6791
启用正在运行的进程的监控。 |
|
启用日志监控。 |
|
启用指标监控。 |
|
通过 HTTP 公开 Elastic Agent 指标。默认情况下,使用套接字和命名管道。 |
|
HTTP 端点将绑定到的主机名、IP 地址、Unix 套接字或命名管道。使用 IP 地址时,我们建议仅使用 |
|
HTTP 端点将绑定到的端口。 |
上述配置在 https://127.0.0.1:6791/processes
公开监控端点。
https://127.0.0.1:6791/processes
输出
{ "processes":[ { "id":"metricbeat-default", "pid":"36923", "binary":"metricbeat", "source":{ "kind":"configured", "outputs":[ "default" ] } }, { "id":"filebeat-default-monitoring", "pid":"36924", "binary":"filebeat", "source":{ "kind":"internal", "outputs":[ "default" ] } }, { "id":"metricbeat-default-monitoring", "pid":"36925", "binary":"metricbeat", "source":{ "kind":"internal", "outputs":[ "default" ] } } ] }
可以访问 /processes
输出中的每个进程 ID 以获取更多详细信息。
https://127.0.0.1:6791/processes/{process-name}
输出
{ "beat":{ "cpu":{ "system":{ "ticks":537, "time":{ "ms":537 } }, "total":{ "ticks":795, "time":{ "ms":796 }, "value":795 }, "user":{ "ticks":258, "time":{ "ms":259 } } }, "info":{ "ephemeral_id":"eb7e8025-7496-403f-9f9a-42b20439c737", "uptime":{ "ms":75332 }, "version":"7.14.0" }, "memstats":{ "gc_next":23920624, "memory_alloc":20046048, "memory_sys":76104712, "memory_total":60823368, "rss":83165184 }, "runtime":{ "goroutines":58 } }, "libbeat":{ "config":{ "module":{ "running":4, "starts":4, "stops":0 }, "reloads":1, "scans":1 }, "output":{ "events":{ "acked":0, "active":0, "batches":0, "dropped":0, "duplicates":0, "failed":0, "toomany":0, "total":0 }, "read":{ "bytes":0, "errors":0 }, "type":"elasticsearch", "write":{ "bytes":0, "errors":0 } }, "pipeline":{ "clients":4, "events":{ "active":231, "dropped":0, "failed":0, "filtered":0, "published":231, "retry":112, "total":231 }, "queue":{ "acked":0, "max_events":4096 } } }, "metricbeat":{ "system":{ "cpu":{ "events":8, "failures":0, "success":8 }, "filesystem":{ "events":80, "failures":0, "success":80 }, "memory":{ "events":8, "failures":0, "success":8 }, "network":{ "events":135, "failures":0, "success":135 } } }, "system":{ "cpu":{ "cores":8 }, "load":{ "1":2.5957, "15":5.415, "5":3.5815, "norm":{ "1":0.3245, "15":0.6769, "5":0.4477 } } } }