自动发现
编辑自动发现编辑
当您在容器上运行应用程序时,它们会成为监控系统的移动目标。自动发现允许您跟踪它们并根据更改调整设置。通过定义配置模板,自动发现子系统可以监控服务在启动运行时的状态。
您可以在 heartbeat.yml
配置文件中的 heartbeat.autodiscover
部分定义自动发现设置。要启用自动发现,您需要指定提供程序列表。
提供程序编辑
自动发现提供程序通过观察系统上的事件并将这些事件转换为具有通用格式的内部自动发现事件来工作。在您配置提供程序时,您可以选择使用来自自动发现事件的字段来设置条件,当满足这些条件时,将启动特定配置。
在启动时,心跳将扫描现有的容器并为其启动适当的配置。然后它将监控新的启动/停止事件。这样可以确保您无需担心状态,只需定义所需的配置即可。
Docker编辑
Docker 自动发现提供程序监控 Docker 容器的启动和停止。
它具有以下设置
-
host
- (可选) Docker 套接字(UNIX 或 TCP 套接字)。默认情况下它使用
unix:///var/run/docker.sock
。 -
ssl
- (可选) 连接到 Docker 套接字时使用的 SSL 配置。
-
cleanup_timeout
- (可选) 指定容器运行配置停止前的不活动时间,默认情况下禁用。
-
labels.dedot
- (可选) 默认值为 false。如果设置为 true,则将标签中的点替换为
_
。
这些是在配置模板中可用的字段。每个发出的事件都将提供 docker.*
字段。事件
- host
- port
- docker.container.id
- docker.container.image
- docker.container.name
- docker.container.labels
例如
{ "host": "10.4.15.9", "port": 6379, "docker": { "container": { "id": "382184ecdb385cfd5d1f1a65f78911054c8511ae009635300ac28b4fc357ce51" "name": "redis", "image": "redis:3.2.11", "labels": { "io.kubernetes.pod.namespace": "default" ... } } } }
您可以定义一组配置模板,这些模板将在条件匹配事件时应用。模板定义一个匹配自动发现事件的条件,以及当此条件发生时要启动的配置列表。
条件匹配来自提供程序的事件。提供程序使用与处理器相同的格式用于 条件。
配置模板可以包含来自自动发现事件的变量。这些变量可以在 data
命名空间下访问。例如,使用示例事件,“${data.port}
”解析为 6379
。
心跳支持模块的模板
heartbeat.autodiscover: providers: - type: docker templates: - condition: contains: docker.container.image: redis config: - type: tcp hosts: ["${data.host}:${data.port}"] schedule: "@every 1s" timeout: 1s
此配置为所有运行名称中包含 redis
的镜像的容器启动 redis
监控器。
Kubernetes编辑
Kubernetes 自动发现提供程序监控 Kubernetes 节点、Pod、服务的启动、更新和停止。
kubernetes
自动发现提供程序具有以下配置设置
-
node
- (可选) 在无法准确检测到心跳时,指定要将心跳范围限定到的节点,例如在主机网络模式下运行心跳时。
-
namespace
- (可选) 选择要从中收集元数据的命名空间。如果未设置,处理器将从所有命名空间收集元数据。默认情况下它未设置。命名空间配置仅适用于命名空间范围的 Kubernetes 资源。
-
cleanup_timeout
- (可选) 指定容器运行配置停止前的不活动时间,默认情况下禁用。
-
kube_config
- (可选) 将给定配置文件用作 Kubernetes 客户端的配置。如果未设置 kube_config,则将检查 KUBECONFIG 环境变量,如果不存在,则将回退到 InCluster。
-
kube_client_options
- (可选) 可以为 Kubernetes 客户端配置其他选项。目前支持客户端 QPS 和突发,如果未设置,将使用 Kubernetes 客户端的 默认 QPS 和突发。示例
kube_client_options: qps: 5 burst: 10
-
resource
- (可选) 选择要对其进行发现的资源。目前支持的 Kubernetes 资源为
pod
、service
和node
。如果未配置,resource
默认设置为pod
。 -
scope
- (可选) 指定需要在哪个级别进行自动发现。
scope
可以取node
或cluster
作为值。node
范围允许发现指定节点中的资源。cluster
范围允许集群范围的发现。只有pod
和node
资源可以在节点范围内被发现。 -
add_resource_metadata
-
(可选) 指定要添加到事件的额外元数据的过滤器和配置。配置参数
-
node
或namespace
: 指定来自节点和命名空间的额外元数据的标签和注释过滤器。默认情况下,所有标签都包含在内,而注释则不包含。要更改默认行为,可以定义include_labels
、exclude_labels
和include_annotations
。这些设置在存储需要特殊处理以避免过载存储输出的标签和注释时很有用。注意:这些设置不支持通配符。可以通过设置enabled: false
来单独禁用node
或namespace
元数据的丰富。 -
deployment
: 如果资源是pod
并且它是从deployment
创建的,默认情况下不会添加部署名称,可以通过设置deployment: true
来启用此功能。 -
cronjob
: 如果资源是pod
并且它是从cronjob
创建的,默认情况下不会添加 cronjob 名称,可以通过设置cronjob: true
来启用此功能。示例
-
add_resource_metadata: namespace: include_labels: ["namespacelabel1"] node: include_labels: ["nodelabel2"] include_annotations: ["nodeannotation1"] # deployment: false # cronjob: false
-
unique
- (可选) 默认值为
false
。将自动发现提供程序标记为唯一会使提供程序仅在获得领导者租约时启用提供的模板。此设置只能与cluster
范围结合使用。当启用unique
时,resource
和add_resource_metadata
设置将不会被考虑。 -
leader_lease
- (可选) 默认值为
heartbeat-cluster-leader
。这将是锁定租约的名称。可以使用kubectl describe lease beats-cluster-leader
监控租约的状态。引用相同领导者租约的不同 Beats 将争夺租约,每次只有一个将被选为领导者。 -
leader_leaseduration
- (可选) 非领导者候选者强制获取领导者租约之前将等待的持续时间。默认值为
15s
。 -
leader_renewdeadline
- (可选) 领导者在放弃之前重试刷新其领导身份的持续时间。默认值为
10s
。 -
leader_retryperiod
- (可选) 运行以获取租约的 metricbeat 实例在操作尝试之间应等待的持续时间。默认值为
2s
。
配置模板可以包含来自自动发现事件的变量。这些变量可以在 data
命名空间下访问,例如要访问 Pod IP:${data.kubernetes.pod.ip}
。
这些是在配置模板中可用的字段。每个发出的事件都将提供 kubernetes.*
字段
通用字段:编辑
- host
Pod 特定字段:编辑
键 | 类型 | 描述 |
---|---|---|
|
|
Pod 端口。如果 Pod 公开了多个端口,应使用 |
|
|
Pod 运行所在的命名空间 |
|
|
Pod 运行所在的命名空间的 UUID |
|
|
Pod 运行所在的命名空间的注释。注释应使用非去点的格式,例如 |
|
|
Pod 的名称 |
|
|
Pod 的 UID |
|
|
Pod 的 IP |
|
|
Pod 标签的对象。标签应使用非去点的格式,例如 |
|
|
Pod 注释的对象。注释应使用非去点的格式,例如 |
|
|
容器的名称 |
|
|
容器的运行时 |
|
|
容器的 ID |
|
|
容器的镜像 |
|
|
节点的名称 |
|
|
节点的 UID |
|
|
节点的主机名 |
节点特定字段:编辑
键 | 类型 | 描述 |
---|---|---|
|
|
节点的标签对象 |
|
|
节点的注释对象 |
|
|
节点的名称 |
|
|
节点的 UID |
|
|
节点的主机名 |
服务特定字段:编辑
键 | 类型 | 描述 |
---|---|---|
|
|
服务端口 |
|
|
服务的命名空间 |
|
|
服务的命名空间的 UUID |
|
|
服务的命名空间的注释。注释应使用非去点的格式,例如 |
|
|
服务的标签对象 |
|
|
服务的注释对象 |
|
|
服务的名称 |
|
|
服务的 UID |
如果在提供程序配置中添加了 include_annotations
配置,则配置中存在的注释列表将被添加到事件中。
如果在提供程序配置中添加了 include_labels
配置,则配置中存在的标签列表将被添加到事件中。
如果在提供程序配置中添加了 exclude_labels
配置,则配置中存在的标签列表将从事件中排除。
如果在提供程序配置中将 labels.dedot
配置设置为 true
,则标签中的 .
将被替换为 _
。默认情况下它为 true
。
如果在提供程序配置中将 annotations.dedot
配置设置为 true
,则注释中的 .
将被替换为 _
。默认情况下它为 true
。
从 8.6 版本开始,无论 labels.dedot
值如何,配置模板中使用的 kubernetes.labels.*
都不去点。此配置参数仅影响最终 Elasticsearch 文档中添加的字段。例如,对于标签为 app.kubernetes.io/name=ingress-nginx
的 Pod,匹配条件应为 condition.equals: kubernetes.labels.app.kubernetes.io/name: "ingress-nginx"
。如果 labels.dedot
设置为 true
(默认值),则该标签将存储在 Elasticsearch 中,格式为 kubernetes.labels.app_kubernetes_io/name
。Kubernetes 注释也适用相同的规则。
例如
{ "host": "172.17.0.21", "port": 9090, "kubernetes": { "container": { "id": "bb3a50625c01b16a88aa224779c39262a9ad14264c3034669a50cd9a90af1527", "image": "prom/prometheus", "name": "prometheus" }, "labels": { "project": "prometheus", ... }, "namespace": "default", "node": { "name": "minikube" }, "pod": { "name": "prometheus-2657348378-k1pnh" } }, }
心跳支持模块的模板
heartbeat.autodiscover: providers: - type: kubernetes include_annotations: ["prometheus.io.scrape"] templates: - condition: contains: kubernetes.annotations.prometheus.io/scrape: "true" config: - type: http hosts: ["${data.host}:${data.port}"] schedule: "@every 1s" timeout: 1s
此配置为所有带有 prometheus.io/scrape=true
注释的 Pod 中的容器启动一个 http
模块。
Amazon ELBs(已弃用)edit
注意:此提供程序现在已弃用,将在将来的版本中删除。
Amazon ELB 自动发现提供程序会发现 ELBs 及其监听器。当您不想直接连接到服务,而是连接到为一组服务提供前端的 ELB 时,这很有用。
此提供程序将为每个 ELB 监听器生成一个配置块。因此,如果您有一个在端口 80 和 443 上都公开的 ELB,它将生成两个配置,每个端口一个。请记住,beat 将对配置进行重复数据删除。因此,如果生成的配置相同,则实际上只运行一个配置。
此提供程序将使用标准的 AWS 环境变量和共享凭据文件加载 AWS 凭据,有关更多信息,请参阅 管理 AWS 访问密钥的最佳做法。如果您不想使用这些凭据,可以明确设置 access_key_id
和 secret_access_key
变量。
以下是配置模板化期间可用的字段。 aws.elb.*
字段将在每个发出的事件中可用。
- host
- port
- cloud.availability_zone
- cloud.provider
- cloud.region
- aws.elb.listener_arn
- aws.elb.load_balancer_arn
- aws.elb.protocol
- aws.elb.type
- aws.elb.scheme
- aws.elb.availability_zones
- aws.elb.created
- aws.elb.state.code
- aws.elb.state.reason
- aws.elb.ip_address_type
- aws.elb.security_groups
- aws.elb.vpc_id
- aws.elb.ssl_policy
心跳支持模块的模板
heartbeat.autodiscover: providers: - type: aws_elb period: 1m regions: ["us-east-1", "us-east-2"] access_key_id: my-access-key secret_access_key: my-secret-access-key templates: - condition: equals.port: 8080 config: - type: tcp hosts: ["${data.host}:${data.port}"] schedule: "@every 5s" timeout: 1s
此配置为所有具有已声明端口的 ELB 启动一个 tcp
监控器。
此自动发现提供程序采用我们的标准 AWS 凭据选项。
AWS 凭据配置edit
要配置 AWS 凭据,请将凭据放入 Heartbeat 配置中,或使用共享凭据文件,如下例所示。
配置参数edit
- access_key_id:访问密钥的第一部分。
- secret_access_key:访问密钥的第二部分。
- session_token:使用临时安全凭据时需要。
- credential_profile_name:共享凭据文件中的配置文件名称。
- shared_credential_file:共享凭据文件的目录。
- role_arn:要假定的 AWS IAM 角色。
- external_id:在另一个帐户中假定角色时要使用的外部 ID,有关外部 ID 的使用,请参阅 AWS 文档。
-
proxy_url:用于连接到 AWS Web 服务的代理的 URL。语法为
http(s)://<IP/Hostname>:<port>
-
fips_enabled:启用此选项指示 Heartbeat 使用服务的 FIPS 端点。Heartbeat 使用的所有服务都与 FIPS 兼容,但
tagging
除外,但只有某些区域与 FIPS 兼容。有关 FIPS 端点和区域的完整列表,请参阅 https://aws.amazon.com/compliance/fips/ 或相应的服务页面,https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html。 - ssl:这指定了 SSL/TLS 配置。如果缺少 ssl 部分,则主机 CA 用于 HTTPS 连接。有关更多信息,请参阅 SSL。
- default_region:如果没有设置其他区域,则查询的默认区域。大多数 AWS 服务都提供一个区域端点,可用于发出请求。某些服务(如 IAM)不支持区域。如果没有通过任何其他方式(环境变量、凭据或实例配置文件)提供区域,则将使用此处设置的值。
- assume_role.duration:请求的假定角色会话的持续时间。如果没有设置,则默认为 15m。AWS 允许的最大会话持续时间在 1h 到 12h 之间,具体取决于您的最大会话持续时间策略。
- assume_role.expiry_window:expiry_window 允许在会话到期之前刷新会话。这有利于防止到期的令牌导致请求因 ExpiredTokenException 而失败。
支持的格式edit
本节中的示例指的是 Metricbeat,但无论使用哪种 Beat,用于对 AWS 进行身份验证的凭据选项都是相同的。
- 使用
access_key_id
、secret_access_key
和/或session_token
用户可以将凭据放入 Metricbeat 模块配置中,也可以使用环境变量 AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
和/或 AWS_SESSION_TOKEN
。
如果在 Docker 上运行,则应将这些环境变量作为 docker 命令的一部分添加。例如,使用 Metricbeat
$ docker run -e AWS_ACCESS_KEY_ID=abcd -e AWS_SECRET_ACCESS_KEY=abcd -d --name=metricbeat --user=root --volume="$(pwd)/metricbeat.aws.yml:/usr/share/metricbeat/metricbeat.yml:ro" docker.elastic.co/beats/metricbeat:7.11.1 metricbeat -e -E cloud.auth=elastic:1234 -E cloud.id=test-aws:1234
示例 metricbeat.aws.yml
如下所示
metricbeat.modules: - module: aws period: 5m access_key_id: ${AWS_ACCESS_KEY_ID} secret_access_key: ${AWS_SECRET_ACCESS_KEY} session_token: ${AWS_SESSION_TOKEN} metricsets: - ec2
也可以通过文件添加环境变量。例如
$ cat env.list AWS_ACCESS_KEY_ID=abcd AWS_SECRET_ACCESS_KEY=abcd $ docker run --env-file env.list -d --name=metricbeat --user=root --volume="$(pwd)/metricbeat.aws.yml:/usr/share/metricbeat/metricbeat.yml:ro" docker.elastic.co/beats/metricbeat:7.11.1 metricbeat -e -E cloud.auth=elastic:1234 -E cloud.id=test-aws:1234
- 使用
credential_profile_name
和/或shared_credential_file
如果没有给出 access_key_id
、secret_access_key
和 role_arn
,则 heartbeat 将检查 credential_profile_name
。如果您对不同的工具或应用程序使用不同的凭据,则可以使用配置文件在同一个配置文件中配置多个访问密钥。如果没有给出 credential_profile_name
,则将使用默认配置文件。
shared_credential_file
是可选的,用于指定共享凭据文件的目录。如果它为空,则将使用默认目录。在 Windows 中,共享凭据文件位于 C:\Users\<yourUserName>\.aws\credentials
。对于 Linux、macOS 或 Unix,该文件位于 ~/.aws/credentials
。当作为服务运行时,主目录取决于管理服务的用户的,因此可以使用 shared_credential_file
参数来避免歧义。有关更多详细信息,请参阅 创建共享凭据文件。
- 使用
role_arn
role_arn
用于指定要假定的 AWS IAM 角色,以便生成临时凭据。如果给出了 role_arn
,heartbeat 将检查是否给出了访问密钥。如果没有,heartbeat 将检查凭据配置文件名称。如果两者都没有给出,则将使用默认凭据配置文件。请确保凭据在凭据配置文件或访问密钥下给出。
如果在 Docker 上运行,则需要通过卷挂载提供凭据文件。例如,使用 Metricbeat
docker run -d --name=metricbeat --user=root --volume="$(pwd)/metricbeat.aws.yml:/usr/share/metricbeat/metricbeat.yml:ro" --volume="/Users/foo/.aws/credentials:/usr/share/metricbeat/credentials:ro" docker.elastic.co/beats/metricbeat:7.11.1 metricbeat -e -E cloud.auth=elastic:1234 -E cloud.id=test-aws:1234
示例 metricbeat.aws.yml
如下所示
metricbeat.modules: - module: aws period: 5m credential_profile_name: elastic-beats shared_credential_file: /usr/share/metricbeat/credentials metricsets: - ec2
heartbeat.autodiscover: providers: - type: aws_elb period: 1m regions: ["us-east-1", "us-east-2"] access_key_id: '<access_key_id>' secret_access_key: '<secret_access_key>' session_token: '<session_token>' templates: - type: tcp hosts: ["${data.host}:${data.port}"] schedule: "@every 5s" timeout: 1s
或者
heartbeat.autodiscover: providers: - type: aws_elb period: 1m regions: ["us-east-1", "us-east-2"] access_key_id: '${AWS_ACCESS_KEY_ID:""}' secret_access_key: '${AWS_SECRET_ACCESS_KEY:""}' session_token: '${AWS_SESSION_TOKEN:""}' templates: - type: tcp hosts: ["${data.host}:${data.port}"] schedule: "@every 5s" timeout: 1s
- 使用共享 AWS 凭据文件
heartbeat.autodiscover: providers: - type: aws_elb period: 1m regions: ["us-east-1", "us-east-2"] credential_profile_name: test-hb templates: - type: tcp hosts: ["${data.host}:${data.port}"] schedule: "@every 5s" timeout: 1s
AWS 凭据类型edit
可以使用两种类型的 AWS 凭据:访问密钥和临时安全凭据。
- 访问密钥
AWS_ACCESS_KEY_ID
和 AWS_SECRET_ACCESS_KEY
是访问密钥的两个部分。它们是 IAM 用户或 AWS 帐户根用户的长期凭据。有关更多详细信息,请参阅 AWS 访问密钥和秘密访问密钥。
- IAM 角色 ARN
IAM 角色是您可以在您的帐户中创建的 IAM 身份,它具有特定权限,这些权限决定了身份可以在 AWS 中做什么和不能做什么。角色没有与之关联的标准长期凭据,例如密码或访问密钥。相反,当您假定角色时,它会为您提供角色会话的临时安全凭据。可以使用 IAM 角色 Amazon 资源名称 (ARN) 来指定要假定的 AWS IAM 角色,以生成临时凭据。有关更多详细信息,请参阅 AssumeRole API 文档。
以下是在使用 AWS CLI 为 Metricbeat 设置 IAM 角色的步骤。请将 123456789012
替换为您自己的帐户 ID。
步骤 1. 创建 example-policy.json
文件以包含所有权限
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:GetObject", "sqs:ReceiveMessage" ], "Resource": "*" }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "sqs:ChangeMessageVisibility", "Resource": "arn:aws:sqs:us-east-1:123456789012:test-fb-ks" }, { "Sid": "VisualEditor2", "Effect": "Allow", "Action": "sqs:DeleteMessage", "Resource": "arn:aws:sqs:us-east-1:123456789012:test-fb-ks" }, { "Sid": "VisualEditor3", "Effect": "Allow", "Action": [ "sts:AssumeRole", "sqs:ListQueues", "tag:GetResources", "ec2:DescribeInstances", "cloudwatch:GetMetricData", "ec2:DescribeRegions", "iam:ListAccountAliases", "sts:GetCallerIdentity", "cloudwatch:ListMetrics" ], "Resource": "*" } ] }
步骤 2. 使用 aws iam create-policy
命令创建 IAM 策略
$ aws iam create-policy --policy-name example-policy --policy-document file://example-policy.json
步骤 3. 创建定义 IAM 角色信任关系的 JSON 文件 example-role-trust-policy.json
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": "sts:AssumeRole" } }
步骤 4. 创建 IAM 角色并附加策略
$ aws iam create-role --role-name example-role --assume-role-policy-document file://example-role-trust-policy.json $ aws iam attach-role-policy --role-name example-role --policy-arn "arn:aws:iam::123456789012:policy/example-policy"
完成这些步骤后,可以使用 IAM 角色 ARN 在 Metricbeat aws
模块中进行身份验证。
- 临时安全凭据
临时安全凭据具有有限的生存期,并且包含一个访问密钥 ID、一个秘密访问密钥和一个安全令牌,这些令牌通常从 GetSessionToken
返回。启用 MFA 的 IAM 用户需要在调用 GetSessionToken
时提交 MFA 代码。有关更多详细信息,请参阅 临时安全凭据。可以使用 sts get-session-token
AWS CLI 生成临时凭据。例如,使用启用 MFA 的
aws> sts get-session-token --serial-number arn:aws:iam::1234:mfa/[email protected] --token-code 456789 --duration-seconds 129600
由于临时安全凭据是短期凭据,因此在它们到期后,用户需要生成新的凭据并使用新凭据修改 aws.yml 配置文件。除非为 Metricbeat 启用了 实时重新加载 功能,否则用户需要在更新配置文件后手动重新启动 Metricbeat 才能继续收集 Cloudwatch 指标。如果在旧凭据到期之前没有使用新凭据更新配置文件,这会导致数据丢失。对于 Metricbeat,我们建议用户在配置文件中使用访问密钥,以使 aws 模块能够在不生成新的临时凭据并频繁更新配置的情况下进行 AWS api 调用。
IAM 策略是在您的 AWS 环境中定义对象权限的实体。需要在 IAM 用户的策略中添加特定权限,以授权 Metricbeat 收集 AWS 监控指标。有关所需权限,请参阅每个指标集下的文档。