使用 Servicemonitor 通过外部主机名检查服务
Use Servicemonitor to check services via external hostname
我们有一个带有外部 DNS 的设置,可以根据服务注释创建和绑定 DNS 条目。
例如,我们有这样的 alertmanager 服务:
apiVersion: v1
kind: Service
metadata:
name: prometheus-kube-prometheus-alertmanager
namespace: prometheus
labels:
...
heritage: Helm
prometheus-monitor-https: 'true'
release: prometheus
self-monitor: 'true'
annotations:
external-dns.alpha.kubernetes.io/hostname: alertmanager.ourdomain.com
external-dns.alpha.kubernetes.io/ttl: '60'
spec:
ports:
- name: web
protocol: TCP
port: 80
targetPort: 9093
nodePort: 31126
selector:
alertmanager: prometheus-kube-prometheus-alertmanager
app.kubernetes.io/name: alertmanager
type: LoadBalancer
sessionAffinity: None
externalTrafficPolicy: Cluster
(缩写)
我想使用blackbox exporter和注解中的数据,所以我们不必在这里手动添加监控,而是依靠kubernetes提供监控内容的信息。
为此我写了一个 servicemonitor,但它与服务不匹配并调用了黑盒导出器。
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: blackbox-exporter-monitor-https-external
namespace: prometheus
spec:
namespaceSelector:
any: true
selector:
matchLabels:
prometheus-monitor-https: any
targetLabels:
- environment
- instance
endpoints:
- metricRelabelings:
- sourceLabels: [__meta_kubernetes_service_annotation_external_dns_alpha_kubernetes_io_hostname]
targetLabel: __param_target
replacement: "https://"
- sourceLabels: [__param_target]
targetLabel: instance
- targetLabel: __param_scheme
replacement: https
- targetLabel: __address__
replacement: prometheus-blackbox-exporter:9115
path: /probe
params:
debug:
- "true"
module:
- "http_2xx"
我不明白为什么它不匹配该服务。你有什么提示吗?
服务有标签 prometheus-monitor-https: 'true'
,而 ServiceMonitor 有 selector.matchLabels
的 prometheus-monitor-https: any
。
如果您将其更改为 ServiceMonitor 的 selector.matchLabels
等于 prometheus-monitor-https: 'true'
,那么我认为它应该可以工作。 matchLabels 查找标签键值对的预期匹配项。
我还看到你写的 namespaceSelector
是 any: true
。很高兴知道 namespaceSelector 以不同的方式工作。它需要它应该在其中找到资源的名称空间的标签。在您的情况下,它将查找具有标签 any: true
的名称空间。但我认为你实际上想要 select 所有命名空间,这等于根本不指定 namespaceSelector。
我们有一个带有外部 DNS 的设置,可以根据服务注释创建和绑定 DNS 条目。
例如,我们有这样的 alertmanager 服务:
apiVersion: v1
kind: Service
metadata:
name: prometheus-kube-prometheus-alertmanager
namespace: prometheus
labels:
...
heritage: Helm
prometheus-monitor-https: 'true'
release: prometheus
self-monitor: 'true'
annotations:
external-dns.alpha.kubernetes.io/hostname: alertmanager.ourdomain.com
external-dns.alpha.kubernetes.io/ttl: '60'
spec:
ports:
- name: web
protocol: TCP
port: 80
targetPort: 9093
nodePort: 31126
selector:
alertmanager: prometheus-kube-prometheus-alertmanager
app.kubernetes.io/name: alertmanager
type: LoadBalancer
sessionAffinity: None
externalTrafficPolicy: Cluster
(缩写)
我想使用blackbox exporter和注解中的数据,所以我们不必在这里手动添加监控,而是依靠kubernetes提供监控内容的信息。
为此我写了一个 servicemonitor,但它与服务不匹配并调用了黑盒导出器。
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: blackbox-exporter-monitor-https-external
namespace: prometheus
spec:
namespaceSelector:
any: true
selector:
matchLabels:
prometheus-monitor-https: any
targetLabels:
- environment
- instance
endpoints:
- metricRelabelings:
- sourceLabels: [__meta_kubernetes_service_annotation_external_dns_alpha_kubernetes_io_hostname]
targetLabel: __param_target
replacement: "https://"
- sourceLabels: [__param_target]
targetLabel: instance
- targetLabel: __param_scheme
replacement: https
- targetLabel: __address__
replacement: prometheus-blackbox-exporter:9115
path: /probe
params:
debug:
- "true"
module:
- "http_2xx"
我不明白为什么它不匹配该服务。你有什么提示吗?
服务有标签 prometheus-monitor-https: 'true'
,而 ServiceMonitor 有 selector.matchLabels
的 prometheus-monitor-https: any
。
如果您将其更改为 ServiceMonitor 的 selector.matchLabels
等于 prometheus-monitor-https: 'true'
,那么我认为它应该可以工作。 matchLabels 查找标签键值对的预期匹配项。
我还看到你写的 namespaceSelector
是 any: true
。很高兴知道 namespaceSelector 以不同的方式工作。它需要它应该在其中找到资源的名称空间的标签。在您的情况下,它将查找具有标签 any: true
的名称空间。但我认为你实际上想要 select 所有命名空间,这等于根本不指定 namespaceSelector。