发现Kubernetes
discovery.kubernetes
允许您从 Kubernetes 资源中查找 scrape 目标。它监听集群状态,并确保目标与集群中当前运行的始终保持同步。
如果您未提供连接信息,则此组件默认为集群内配置。可以通过 kubeconfig 文件或手动连接设置来覆盖默认值。
用法
discovery.kubernetes "LABEL" {
role = DISCOVERY_ROLE
}
参数
支持以下参数
名称 | 类型 | 描述 | 默认值 | 必需 |
---|---|---|---|---|
api_server | 字符串 | Kubernetes API 服务器的 URL。 | 否 | |
role | 字符串 | 要查询的 Kubernetes 资源类型。 | 是 | |
kubeconfig_file | 字符串 | 用于连接到 Kubernetes 的 kubeconfig 文件的路径。 | 否 | |
bearer_token_file | 字符串 | 包含身份验证令牌的文件。 | 否 | |
bearer_token | secret | 用于身份验证的令牌。 | 否 | |
enable_http2 | 布尔值 | 是否支持请求的 HTTP2。 | 是 | 否 |
follow_redirects | 布尔值 | 是否应跟随服务器返回的重定向。 | 是 | 否 |
proxy_url | 字符串 | 要通过其发送请求的 HTTP 代理。 | 否 | |
no_proxy | 字符串 | 逗号分隔的 IP 地址、CIDR 规范和域名列表,要从代理中排除。 | 否 | |
proxy_from_environment | 布尔值 | 使用环境变量指示的代理 URL。 | false | 否 |
proxy_connect_header | map(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_url
和 no_proxy
。
proxy_connect_header
仅在配置了 proxy_url
或 proxy_from_environment
时应配置。
role
参数是必需的,用于指定要发现的目标类型。role
必须是以下之一:node
、pod
、service
、endpoints
、endpointslice
或 ingress
。
节点角色
node
角色在每个集群节点上发现一个目标,地址默认为 Kubelet 守护程序的 HTTP 端口。目标地址默认为 Kubernetes 节点对象在地址类型顺序 NodeInternalIP
、NodeExternalIP
、NodeLegacyHostIP
和 NodeHostName
的第一个现有地址。
以下标签包括发现的节点
__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_init
:true
如果容器是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 的就绪状态设置为true
或false
。__meta_kubernetes_pod_phase
:在生命周期中设置为Pending
、Running
、Succeeded
、Failed
或Unknown
。__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
:对于端点的就绪状态设置为true
或false
。__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
: 对于被引用端点的就绪状态,设置为true
或false
。__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 Ingress
的spec
块中指定的主机。
以下标签包括用于发现的入口对象
__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_metadata | attach_metadata | 可选元数据以附加到发现的资源。 | 否 |
基本认证 | 基本认证 | 为端点配置基本认证。 | 否 |
认证 | 认证 | 为端点配置通用的认证。 | 否 |
OAuth2 | OAuth2 | 为端点配置OAuth2以进行认证。 | 否 |
OAuth2 > tls_config | tls_config | 配置连接到端点的TLS设置。 | 否 |
tls_config | tls_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 | 字符串 | 包含基本认证密码的文件。 | 否 | |
password | secret | 基本认证密码。 | 否 | |
username | 字符串 | 基本认证用户名。 | 否 |
password
和password_file
是相互排斥的,在basic_auth
块内部只能提供其中之一。
authorization块
名称 | 类型 | 描述 | 默认值 | 必需 |
---|---|---|---|---|
credentials_file | 字符串 | 包含密钥值的文件。 | 否 | |
credentials | secret | 密钥值。 | 否 | |
type | 字符串 | 授权类型,例如,“Bearer”。 | 否 |
credential
和credentials_file
是相互排斥的,在authorization
块内部只能提供其中之一。
oauth2块
名称 | 类型 | 描述 | 默认值 | 必需 |
---|---|---|---|---|
client_id | 字符串 | OAuth2客户端ID。 | 否 | |
client_secret_file | 字符串 | 包含OAuth2客户端密钥的文件。 | 否 | |
client_secret | secret | OAuth2客户端密钥。 | 否 | |
endpoint_params | map(string) | 要附加到令牌URL的可选参数。 | 否 | |
proxy_url | 字符串 | 要通过其发送请求的 HTTP 代理。 | 否 | |
no_proxy | 字符串 | 逗号分隔的 IP 地址、CIDR 规范和域名列表,要从代理中排除。 | 否 | |
proxy_from_environment | 布尔值 | 使用环境变量指示的代理 URL。 | false | 否 |
proxy_connect_header | map(list(secret)) | 指定在连接请求期间发送到代理的标头。 | 否 | |
scopes | 列表(字符串) | 用于认证的权限列表。 | 否 | |
token_url | 字符串 | 获取令牌的URL。 | 否 |
client_secret
和client_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_url
和 no_proxy
。
proxy_connect_header
仅在配置了 proxy_url
或 proxy_from_environment
时应配置。
tls_config块
名称 | 类型 | 描述 | 默认值 | 必需 |
---|---|---|---|---|
ca_pem | 字符串 | 用于验证服务器的CA PEM编码文本。 | 否 | |
ca_file | 字符串 | 用于验证服务器的CA证书。 | 否 | |
cert_pem | 字符串 | 用于客户端认证的证书PEM编码文本。 | 否 | |
cert_file | 字符串 | 用于客户端认证的证书文件。 | 否 | |
insecure_skip_verify | 布尔值 | 禁用服务器证书的验证。 | 否 | |
key_file | 字符串 | 用于客户端认证的密钥文件。 | 否 | |
key_pem | secret | 用于客户端认证的密钥PEM编码文本。 | 否 | |
min_version | 字符串 | 最小的可接受TLS版本。 | 否 | |
server_name | 字符串 | 用于指示服务器名称的ServerName扩展。 | 否 |
以下参数对是相互排斥的,不能同时设置
ca_pem
和ca_file
cert_pem
和cert_file
key_pem
和key_file
在配置客户端认证时,必须同时提供客户端证书(使用cert_pem
或cert_file
)和客户端密钥(使用key_pem
或key_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)
导出字段
以下字段被导出,并可以被其他组件引用
名称 | 类型 | 描述 |
---|---|---|
targets | list(map(string)) | 从Kubernetes API中发现的资源组。 |
组件健康
如果给定无效配置,则报告discovery.kubernetes
不健康。在这些情况下,导出字段保留其最后的健康值。
调试信息
discovery.kubernetes
不公开任何特定组件的调试信息。
调试指标
discovery.kubernetes
不公开任何特定组件的调试指标。
示例
集群内发现
此示例使用集群内身份验证来发现所有 pods
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认证
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
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部署,您必须根据您的配置修改此示例。
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
可以由以下组件消耗导出
- 消耗目标的组件
注意
连接某些组件可能不合理,或者组件可能需要进一步的配置才能正确连接。请参阅链接的文档以获取更多详细信息。