菜单
开源

发现Kubernetes

discovery.kubernetes 允许您从 Kubernetes 资源中查找 scrape 目标。它监听集群状态,并确保目标与集群中当前运行的始终保持同步。

如果您未提供连接信息,则此组件默认为集群内配置。可以通过 kubeconfig 文件或手动连接设置来覆盖默认值。

用法

alloy
discovery.kubernetes "LABEL" {
  role = DISCOVERY_ROLE
}

参数

支持以下参数

名称类型描述默认值必需
api_server字符串Kubernetes API 服务器的 URL。
role字符串要查询的 Kubernetes 资源类型。
kubeconfig_file字符串用于连接到 Kubernetes 的 kubeconfig 文件的路径。
bearer_token_file字符串包含身份验证令牌的文件。
bearer_tokensecret用于身份验证的令牌。
enable_http2布尔值是否支持请求的 HTTP2。
follow_redirects布尔值是否应跟随服务器返回的重定向。
proxy_url字符串要通过其发送请求的 HTTP 代理。
no_proxy字符串逗号分隔的 IP 地址、CIDR 规范和域名列表,要从代理中排除。
proxy_from_environment布尔值使用环境变量指示的代理 URL。false
proxy_connect_headermap(list(secret))指定在连接请求期间发送到代理的标头。

以下之一最多可以提供一次

no_proxy 可以包含 IP、CIDR 规范和域名。IP 和域名可以包含端口号。如果配置了 no_proxy,则必须配置 proxy_url

proxy_from_environment 使用环境变量 HTTP_PROXY、HTTPS_PROXY 和 NO_PROXY(或它们的小写版本)。如果请求不被 NO_PROXY 排除,则使用与其协议匹配的环境变量代理。如果配置了 proxy_from_environment,则不应配置 proxy_urlno_proxy

proxy_connect_header 仅在配置了 proxy_urlproxy_from_environment 时应配置。

role 参数是必需的,用于指定要发现的目标类型。role 必须是以下之一:nodepodserviceendpointsendpointsliceingress

节点角色

node 角色在每个集群节点上发现一个目标,地址默认为 Kubelet 守护程序的 HTTP 端口。目标地址默认为 Kubernetes 节点对象在地址类型顺序 NodeInternalIPNodeExternalIPNodeLegacyHostIPNodeHostName 的第一个现有地址。

以下标签包括发现的节点

  • __meta_kubernetes_node_name:节点对象的名称。
  • __meta_kubernetes_node_provider_id:云提供商的节点对象名称。
  • __meta_kubernetes_node_label_<labelname>:节点对象的每个标签。
  • __meta_kubernetes_node_labelpresent_<labelname>:对节点对象中的每个标签设置为 true
  • __meta_kubernetes_node_annotation_<annotationname>:节点对象中的每个注释。
  • __meta_kubernetes_node_annotationpresent_<annotationname>:对节点对象中的每个注释设置为 true
  • __meta_kubernetes_node_address_<address_type>:如果存在,则每个节点地址类型的第一个地址。

此外,节点实例标签将设置为从 API 服务器检索到的节点名称。

服务角色

service 角色为每个服务的每个服务端口发现一个目标。这通常用于对外部监控服务。地址将设置为服务的 Kubernetes DNS 名称和相应的服务端口。

以下标签包括发现的服务的标签

  • __meta_kubernetes_namespace:服务对象的命名空间。
  • __meta_kubernetes_service_annotation_<annotationname>:服务对象中的每个注释。
  • __meta_kubernetes_service_annotationpresent_<annotationname>:服务对象中的每个注释为 true
  • __meta_kubernetes_service_cluster_ip:服务的集群 IP 地址。这不适用于类型 ExternalName 的服务。
  • __meta_kubernetes_service_external_name:服务的 DNS 名称。这只适用于类型 ExternalName 的服务。
  • __meta_kubernetes_service_label_<labelname>:服务对象中的每个标签。
  • __meta_kubernetes_service_labelpresent_<labelname>:服务对象中的每个标签为 true
  • __meta_kubernetes_service_name:服务对象的名称。
  • __meta_kubernetes_service_port_name:目标的服务端口名称。
  • __meta_kubernetes_service_port_number:目标的服务端口编号。
  • __meta_kubernetes_service_port_protocol:目标的服务端口协议。
  • __meta_kubernetes_service_type:服务的类型。

容器角色

pod 角色发现所有容器并将它们的容器作为目标。对于容器声明的每个端口,生成一个目标。

如果容器未指定端口,则创建一个不带端口的容器目标。在使用 discovery.relabel 组件 手动注入端口之前,必须对这些目标进行收集指标。

以下标签包括发现的 容器

  • __meta_kubernetes_namespace:pod 对象的命名空间。
  • __meta_kubernetes_pod_name:pod 对象的名称。
  • __meta_kubernetes_pod_ip:pod 对象的 pod IP。
  • __meta_kubernetes_pod_label_$<labelname>:每个 Pod 对象的标签。
  • __meta_kubernetes_pod_labelpresent_$<labelname>true 表示每个 Pod 对象的标签。
  • __meta_kubernetes_pod_annotation_$<annotationname>:每个 Pod 对象的注解。
  • __meta_kubernetes_pod_annotationpresent_$<annotationname>true 表示每个 Pod 对象的注解。
  • __meta_kubernetes_pod_container_inittrue 如果容器是 InitContainer
  • __meta_kubernetes_pod_container_name:指向容器目标地址的容器名称。
  • __meta_kubernetes_pod_container_id:指向容器目标地址的容器的 ID。ID 的形式为 <type>://<container_id>
  • __meta_kubernetes_pod_container_image:容器使用的镜像。
  • __meta_kubernetes_pod_container_port_name:容器端口的名称。
  • __meta_kubernetes_pod_container_port_number:容器端口号。
  • __meta_kubernetes_pod_container_port_protocol:容器端口的协议。
  • __meta_kubernetes_pod_ready:对于 Pod 的就绪状态设置为 truefalse
  • __meta_kubernetes_pod_phase:在生命周期中设置为 PendingRunningSucceededFailedUnknown
  • __meta_kubernetes_pod_node_name:Pod 调度的节点名称。
  • __meta_kubernetes_pod_host_ip:Pod 对象的当前主机 IP。
  • __meta_kubernetes_pod_uid:Pod 对象的 UID。
  • __meta_kubernetes_pod_controller_kind:Pod 控制器的对象类型。
  • __meta_kubernetes_pod_controller_name:Pod 控制器的名称。

端点角色

端点角色从服务的列表端点中发现目标。对于每个端点地址,每个端点发现一个目标。如果端点由 Pod 支持,则即使这些端口未绑定到端点端口,也会将 Pod 的所有容器端口发现为目标。

以下标签包含在发现端点中

  • __meta_kubernetes_namespace: 端点对象的命名空间。
  • __meta_kubernetes_endpoints_name: 端点对象的名称。
  • __meta_kubernetes_endpoints_label_$<labelname>:端点对象的每个标签。
  • __meta_kubernetes_endpoints_labelpresent_$<labelname>:对于端点对象的每个标签设置为 true
  • 以下标签附加在所有直接从端点列表发现的目标上
    • __meta_kubernetes_endpoint_hostname:端点的主机名。
    • __meta_kubernetes_endpoint_node_name:托管端点的节点名称。
    • __meta_kubernetes_endpoint_ready:对于端点的就绪状态设置为 truefalse
    • __meta_kubernetes_endpoint_port_name:端点端口的名称。
    • __meta_kubernetes_endpoint_port_protocol:端点端口的协议。
    • __meta_kubernetes_endpoint_address_target_kind:引用对象的类型。
    • __meta_kubernetes_endpoint_address_target_name:引用端点地址目标的名称。
  • 如果端点属于服务,则附加 service 角色发现的所有标签。
  • 对于所有由 Pod 支持的目标,附加所有 pod 角色发现的标签。

端点片段角色

端点片段角色从现有的 Kubernetes 端点片段发现目标。对于 EndpointSlice 对象中引用的每个端点地址,发现一个目标。如果端点由 Pod 支持,则即使它们未绑定到端点端口,也会将 Pod 的所有容器端口发现为目标。

以下标签包含在发现的端点片段中

  • __meta_kubernetes_namespace:端点对象的命名空间。
  • __meta_kubernetes_endpointslice_name:端点片段对象的名称。
  • 以下标签附加在所有直接从端点片段列表发现的目标上
    • __meta_kubernetes_endpointslice_address_target_kind:引用对象的类型。
    • __meta_kubernetes_endpointslice_address_target_name: 被引用对象的名称。
    • __meta_kubernetes_endpointslice_address_type: 目标地址的IP协议族。
    • __meta_kubernetes_endpointslice_endpoint_conditions_ready: 对于被引用端点的就绪状态,设置为truefalse
    • __meta_kubernetes_endpointslice_endpoint_topology_kubernetes_io_hostname: 托载被引用端点的节点的名称。
    • __meta_kubernetes_endpointslice_endpoint_topology_present_kubernetes_io.hostname: 如果被引用对象具有kubernetes.io/hostname注解,则为true
    • __meta_kubernetes_endpointslice_port: 被引用端点的端口。
    • __meta_kubernetes_endpointslice_port_name: 被引用端点的命名端口。
    • __meta_kubernetes_endpointslice_port_protocol: 被引用端点的协议。
  • 如果端点属于服务,则附加 service 角色发现的所有标签。
  • 对于所有由 Pod 支持的目标,附加所有 pod 角色发现的标签。

入口角色

ingress角色为每个入口的每个路径发现一个目标。这对于外部监控入口通常是很有用的。地址将被设置为Kubernetes Ingressspec块中指定的主机。

以下标签包括用于发现的入口对象

  • __meta_kubernetes_namespace: 入口对象的命名空间。
  • __meta_kubernetes_ingress_name: 入口对象的名称。
  • __meta_kubernetes_ingress_label_<labelname>: 来自入口对象的每个标签。
  • __meta_kubernetes_ingress_labelpresent_<labelname>: 来自入口对象的每个标签为true
  • __meta_kubernetes_ingress_annotation_<annotationname>: 来自入口对象的每个注释。
  • __meta_kubernetes_ingress_annotationpresent_<annotationname>: 来自入口对象的每个注释为true
  • __meta_kubernetes_ingress_class_name: 如果存在,则为入口规范中的类名称。
  • __meta_kubernetes_ingress_scheme: 入口的协议方案,如果TLS配置设置,则为https。默认为http
  • __meta_kubernetes_ingress_path: 来自入口规范的路径。默认为/。

以下块在discovery.kubernetes的定义内受到支持

层次结构描述必需
命名空间命名空间有关搜索哪些Kubernetes命名空间的信息。
选择器选择器选择器用于过滤发现的Kubernetes资源。
attach_metadataattach_metadata可选元数据以附加到发现的资源。
基本认证基本认证为端点配置基本认证。
认证认证为端点配置通用的认证。
OAuth2OAuth2为端点配置OAuth2以进行认证。
OAuth2 > tls_configtls_config配置连接到端点的TLS设置。
tls_configtls_config配置连接到端点的TLS设置。

《》符号表示更深的嵌套层级。例如,oauth2 > tls_config指的是在oauth2块内定义的tls_config块。

namespaces 块

namespaces块限制了在具有一定命名空间中资源发现。如果没有省略,则搜索所有命名空间。

名称类型描述默认值必需
own_namespace布尔值包括Alloy运行的命名空间。
names列表(字符串)要搜索的命名空间列表。

选择器块

selectors块包含可选的标签和字段选择器,以将发现过程限制为一组资源的子集。

名称类型描述默认值必需
role字符串选择器的角色。
标签字符串标签选择器字符串。
字段字符串字段选择器字符串。

有关可用的过滤器,请参阅Kubernetes的文档:字段选择器和标签和选择器了解详细信息。

端点角色支持Pod、服务和端点选择器。如果使用attach_metadata: {node: true}配置,Pod角色支持节点选择器。其他角色仅支持与自身匹配的选择器(例如,节点角色可以仅包含节点选择器)。

注意

使用具有不同选择器的多个discovery.kubernetes组件可能会导致对Kubernetes API的负载更大。

在选择器推荐用于检索非常大型集群中的少量资源。对于较小的集群,建议避免使用选择器,而使用一个discovery.relabel组件进行过滤。

attach_metadata块

attach_metadata块允许将节点元数据附加到已发现的目标。有效的角色:pod、endpoints、endpointslice。

名称类型描述默认值必需
node布尔值附加节点元数据。

basic_auth块

名称类型描述默认值必需
password_file字符串包含基本认证密码的文件。
passwordsecret基本认证密码。
username字符串基本认证用户名。

passwordpassword_file是相互排斥的,在basic_auth块内部只能提供其中之一。

authorization块

名称类型描述默认值必需
credentials_file字符串包含密钥值的文件。
credentialssecret密钥值。
type字符串授权类型,例如,“Bearer”。

credentialcredentials_file是相互排斥的,在authorization块内部只能提供其中之一。

oauth2块

名称类型描述默认值必需
client_id字符串OAuth2客户端ID。
client_secret_file字符串包含OAuth2客户端密钥的文件。
client_secretsecretOAuth2客户端密钥。
endpoint_paramsmap(string)要附加到令牌URL的可选参数。
proxy_url字符串要通过其发送请求的 HTTP 代理。
no_proxy字符串逗号分隔的 IP 地址、CIDR 规范和域名列表,要从代理中排除。
proxy_from_environment布尔值使用环境变量指示的代理 URL。false
proxy_connect_headermap(list(secret))指定在连接请求期间发送到代理的标头。
scopes列表(字符串)用于认证的权限列表。
token_url字符串获取令牌的URL。

client_secretclient_secret_file是相互排斥的,在oauth2块内部只能提供其中之一。

oauth2块还可以包含一个单独的tls_config子块。

no_proxy 可以包含 IP、CIDR 规范和域名。IP 和域名可以包含端口号。如果配置了 no_proxy,则必须配置 proxy_url

proxy_from_environment 使用环境变量 HTTP_PROXY、HTTPS_PROXY 和 NO_PROXY(或它们的小写版本)。如果请求不被 NO_PROXY 排除,则使用与其协议匹配的环境变量代理。如果配置了 proxy_from_environment,则不应配置 proxy_urlno_proxy

proxy_connect_header 仅在配置了 proxy_urlproxy_from_environment 时应配置。

tls_config块

名称类型描述默认值必需
ca_pem字符串用于验证服务器的CA PEM编码文本。
ca_file字符串用于验证服务器的CA证书。
cert_pem字符串用于客户端认证的证书PEM编码文本。
cert_file字符串用于客户端认证的证书文件。
insecure_skip_verify布尔值禁用服务器证书的验证。
key_file字符串用于客户端认证的密钥文件。
key_pemsecret用于客户端认证的密钥PEM编码文本。
min_version字符串最小的可接受TLS版本。
server_name字符串用于指示服务器名称的ServerName扩展。

以下参数对是相互排斥的,不能同时设置

  • ca_pemca_file
  • cert_pemcert_file
  • key_pemkey_file

在配置客户端认证时,必须同时提供客户端证书(使用cert_pemcert_file)和客户端密钥(使用key_pemkey_file)。

如果未提供min_version,则最小的可接受TLS版本将继承自Go的默认最小版本,即TLS 1.2。如果提供了min_version,则必须将其设置为以下字符串之一

  • "TLS10" (TLS 1.0)
  • "TLS11" (TLS 1.1)
  • "TLS12" (TLS 1.2)
  • "TLS13" (TLS 1.3)

导出字段

以下字段被导出,并可以被其他组件引用

名称类型描述
targetslist(map(string))从Kubernetes API中发现的资源组。

组件健康

如果给定无效配置,则报告discovery.kubernetes不健康。在这些情况下,导出字段保留其最后的健康值。

调试信息

discovery.kubernetes不公开任何特定组件的调试信息。

调试指标

discovery.kubernetes不公开任何特定组件的调试指标。

示例

集群内发现

此示例使用集群内身份验证来发现所有 pods

alloy
discovery.kubernetes "k8s_pods" {
  role = "pod"
}

prometheus.scrape "demo" {
  targets    = discovery.kubernetes.k8s_pods.targets
  forward_to = [prometheus.remote_write.demo.receiver]
}

prometheus.remote_write "demo" {
  endpoint {
    url = PROMETHEUS_REMOTE_WRITE_URL

    basic_auth {
      username = USERNAME
      password = PASSWORD
    }
  }
}

替换以下

  • PROMETHEUS_REMOTE_WRITE_URL:将指标发送到兼容Prometheus remote_write的服务器的URL。
  • USERNAME:用于远程_write API认证的用户名。
  • 密码:用于远程写入API认证的密码。

Kubeconfig认证

该示例使用Kubeconfig文件进行Kubernetes API认证

alloy
discovery.kubernetes "k8s_pods" {
  role = "pod"
  kubeconfig_file = "/etc/k8s/kubeconfig.yaml"
}

prometheus.scrape "demo" {
  targets    = discovery.kubernetes.k8s_pods.targets
  forward_to = [prometheus.remote_write.demo.receiver]
}

prometheus.remote_write "demo" {
  endpoint {
    url = PROMETHEUS_REMOTE_WRITE_URL

    basic_auth {
      username = USERNAME
      password = PASSWORD
    }
  }
}

替换以下

  • PROMETHEUS_REMOTE_WRITE_URL:将指标发送到兼容Prometheus remote_write的服务器的URL。
  • USERNAME:用于远程_write API认证的用户名。
  • 密码:用于远程写入API认证的密码。

限制搜索命名空间并按标签值过滤

该示例限制了搜索的命名空间,并且只选择有特定标签值附加的Pod

alloy
discovery.kubernetes "k8s_pods" {
  role = "pod"

  selectors {
    role = "pod"
    label = "app.kubernetes.io/name=prometheus-node-exporter"
  }

  namespaces {
    names = ["myapp"]
  }
}

prometheus.scrape "demo" {
  targets    = discovery.kubernetes.k8s_pods.targets
  forward_to = [prometheus.remote_write.demo.receiver]
}

prometheus.remote_write "demo" {
  endpoint {
    url = PROMETHEUS_REMOTE_WRITE_URL

    basic_auth {
      username = USERNAME
      password = PASSWORD
    }
  }
}

替换以下

  • PROMETHEUS_REMOTE_WRITE_URL:将指标发送到兼容Prometheus remote_write的服务器的URL。
  • USERNAME:用于远程_write API认证的用户名。
  • 密码:用于远程写入API认证的密码。

仅限制在相同节点上的Pod

该示例将搜索限制在与此Alloy相同的节点上的Pod。如果您将Alloy作为DaemonSet运行,则此配置可能很有用。

注意

该示例假设您已使用Helm图表在Kubernetes中部署Alloy,并将HOSTNAME设置为 Kubernetes主机名。如果您有自定义Kubernetes部署,您必须根据您的配置修改此示例。
alloy
discovery.kubernetes "k8s_pods" {
  role = "pod"
  selectors {
    role = "pod"
    field = "spec.nodeName=" + coalesce(env("HOSTNAME"), constants.hostname)
  }
}

prometheus.scrape "demo" {
  targets    = discovery.kubernetes.k8s_pods.targets
  forward_to = [prometheus.remote_write.demo.receiver]
}

prometheus.remote_write "demo" {
  endpoint {
    url = PROMETHEUS_REMOTE_WRITE_URL

    basic_auth {
      username = USERNAME
      password = PASSWORD
    }
  }
}

替换以下

  • PROMETHEUS_REMOTE_WRITE_URL:将指标发送到兼容Prometheus remote_write的服务器的URL。
  • USERNAME:用于远程_write API认证的用户名。
  • 密码:用于远程写入API认证的密码。

兼容组件

discovery.kubernetes可以由以下组件消耗导出

注意

连接某些组件可能不合理,或者组件可能需要进一步的配置才能正确连接。请参阅链接的文档以获取更多详细信息。