菜单
文档breadcrumb arrow Grafana Alloybreadcrumb arrow 参考breadcrumb arrow 组件breadcrumb arrow 发现breadcrumb arrow discovery.kubernetes
开源

发现 kubernetes

discovery.kubernetes 允许您从 Kubernetes 资源中找到抓取目标。它监视集群状态,并确保目标与集群中当前运行的内容持续同步。

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

用法

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

参数

以下参数被支持

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

以下之一最多只能提供一项

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角色

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角色

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 角色

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

如果容器没有指定端口,则每个容器创建一个无端口的目标。在使用 discovery.relabel 组件 手动注入端口之前,无法从这些目标收集指标。

以下标签包含在发现的 Pod 中

  • __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>:对于 Pod 对象的每个标签,值为 true
  • __meta_kubernetes_pod_annotation_<annotationname>:Pod 对象的每个注解。
  • __meta_kubernetes_pod_annotationpresent_<annotationname>:对于 Pod 对象的每个注解,值为 true
  • __meta_kubernetes_pod_container_init:如果容器是 InitContainer,则值为 true
  • __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:端点地址目标的名称。
  • 如果端点属于服务,则会附加服务角色发现的全部标签。
  • 对于由Pod支持的全部目标,会附加Pod角色发现的全部标签。

endpointslice 角色名

endpointslice 角色从现有的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:引用端点的协议。
  • 如果端点属于服务,则会附加服务角色发现的全部标签。
  • 对于由Pod支持的全部目标,会附加Pod角色发现的全部标签。

ingress 角色名

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

以下标签包括在发现的Ingress对象中

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

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

层次结构描述必需
namespacesnamespaces有关要搜索的Kubernetes命名空间的信息。
selectorsselectors用于过滤发现的Kubernetes资源的选择器。
attach_metadataattach_metadata附加到发现的目标的可选元数据。
basic_authbasic_auth配置基本认证以验证端点。
授权授权配置通用的端点授权。
oauth2oauth2配置 OAuth2 以验证端点。
oauth2 > tls_configtls_config配置连接到端点的 TLS 设置。
tls_configtls_config配置连接到端点的 TLS 设置。

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

namespaces 块

namespaces 块限制了发现资源时要搜索的命名空间。如果省略,则搜索所有命名空间。

名称类型描述默认必需
own_namespace布尔型包含 Alloy 运行的命名空间。
nameslist(string)要搜索的命名空间列表。

selectors 块

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

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

有关可以使用哪些过滤器的更多信息,请参阅 Kubernetes 的文档:字段选择器标签和选择器

端点角色支持 Pod、服务和端点选择器。Pod 角色在配置了 attach_metadata: {node: true} 时支持节点选择器。其他角色仅支持与自身匹配的选择器(例如,节点角色只能包含节点选择器)。

注意

使用具有不同选择器的多个 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。
proxy_connect_headermap(list(secret))指定在CONNECT请求期间发送到代理的标头。
scopeslist(string)用于验证的权限列表。
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 不公开任何组件特定的调试指标。

示例

集群内发现

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

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 远程_write 兼容服务器的 URL。
  • USERNAME:用于远程_write API 身份验证的用户名。
  • PASSWORD:用于远程_write 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 远程_write 兼容服务器的 URL。
  • USERNAME:用于远程_write API 身份验证的用户名。
  • PASSWORD:用于远程_write 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 远程_write 兼容服务器的 URL。
  • USERNAME:用于远程_write API 身份验证的用户名。
  • PASSWORD:用于远程_write API 身份验证的密码。

仅限于同一节点上的 pod

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

注意

此示例假设您已使用 Helm 图表在 Kubernetes 中部署了 Alloy,并将 HOSTNAME 设置为 Kubernetes 主机名。如果您有自定义 Kubernetes Deployment,您必须根据您的配置修改此示例。
alloy
discovery.kubernetes "k8s_pods" {
  role = "pod"
  selectors {
    role = "pod"
    field = "spec.nodeName=" + coalesce(sys.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 远程_write 兼容服务器的 URL。
  • USERNAME:用于远程_write API 身份验证的用户名。
  • PASSWORD:用于远程_write API 身份验证的密码。

兼容组件

discovery.kubernetes 导出可以被以下组件消费的字段

注意

连接某些组件可能没有意义,或者组件可能需要进一步配置才能正确连接。有关更多详细信息,请参阅链接的文档。