102 lines
3.3 KiB
Markdown
102 lines
3.3 KiB
Markdown
# 基于 Pod 和 Service 注解的服务发现
|
||
|
||
## 背景
|
||
|
||
很多应用会为 Pod 或 Service 打上一些注解用于 Prometheus 的服务发现,如 `prometheus.io/scrape: "true"`,这种注解并不是 Prometheus 官方支持的,而是社区的习惯性用法,要使这种注解生效,还需结合 Prometheus 的采集配置,本文介绍具体的配置方法。
|
||
|
||
:::warning
|
||
|
||
如果你使用 `kube-prometheus-stack` 部署的监控系统,默认就会对自身的一些组件创建采集规则,比如会给 `kube-state-metrics` 创建 `ServiceMonitor`,并且 `kube-state-metrics` 的 `Service` 上也有 `prometheus.io/scrape: "true"` 的注解,如果配置了基于 Service 注解的服务发现,就会导致重复采集。
|
||
|
||
:::
|
||
|
||
## 真实案例
|
||
|
||
### istio 指标采集
|
||
|
||
[istio](https://istio.io/) 使用了这种 Pod 注解,当 Pod 被自动注入 sidecar 的同时也会被自动注入以下注解:
|
||
|
||
```yaml
|
||
prometheus.io/path: /stats/prometheus
|
||
prometheus.io/port: "15020"
|
||
prometheus.io/scrape: "true"
|
||
```
|
||
|
||
表示声明让 Prometheus 采集 Envoy Sidecar 暴露的 metrics,端口是 15020,路径是 `/stats/prometheus`。
|
||
|
||
除此之外,控制面组件 istiod 的 Pod 也会有类似注解:
|
||
|
||
```yaml
|
||
prometheus.io/port: "15014"
|
||
prometheus.io/scrape: "true"
|
||
```
|
||
|
||
### Kubernetes Addon 指标采集
|
||
|
||
Kubenretes 源码仓库中的一些 addon 组件也使用了这种注解,有的是 Pod 注解,有的是 Service 注解。
|
||
* [coredns](https://github.com/kubernetes/kubernetes/blob/release-1.30/cluster/addons/dns/coredns/coredns.yaml.base#L196-L197) 使用 Service 注解:
|
||
```yaml showLineNumbers
|
||
apiVersion: v1
|
||
kind: Service
|
||
metadata:
|
||
name: kube-dns
|
||
namespace: kube-system
|
||
annotations:
|
||
# highlight-start
|
||
prometheus.io/port: "9153"
|
||
prometheus.io/scrape: "true"
|
||
# highlight-end
|
||
```
|
||
* [nodelocaldns](https://github.com/kubernetes/kubernetes/blob/release-1.30/cluster/addons/dns/nodelocaldns/nodelocaldns.yaml#L125-L126) 使用 Pod 注解:
|
||
```yaml showLineNumbers
|
||
apiVersion: apps/v1
|
||
kind: DaemonSet
|
||
metadata:
|
||
name: node-local-dns
|
||
namespace: kube-system
|
||
labels:
|
||
k8s-app: node-local-dns
|
||
kubernetes.io/cluster-service: "true"
|
||
addonmanager.kubernetes.io/mode: Reconcile
|
||
spec:
|
||
updateStrategy:
|
||
rollingUpdate:
|
||
maxUnavailable: 10%
|
||
selector:
|
||
matchLabels:
|
||
k8s-app: node-local-dns
|
||
template:
|
||
metadata:
|
||
labels:
|
||
k8s-app: node-local-dns
|
||
annotations:
|
||
# highlight-start
|
||
prometheus.io/port: "9253"
|
||
prometheus.io/scrape: "true"
|
||
# highlight-end
|
||
```
|
||
|
||
## Prometheus 采集配置
|
||
|
||
### 根据 Pod 注解动态采集
|
||
|
||
<FileBlock file="prometheus/kubernetes-pods.yaml" />
|
||
|
||
### 根据 Service 注解动态采集
|
||
|
||
<FileBlock file="prometheus/kubernetes-service-endpoints.yaml" />
|
||
|
||
## kube-prometheus-stack 采集配置方法
|
||
|
||
如果你使用 [kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack) 来安装 Prometheus,需要在 `additionalScrapeConfigs` 里加上采集配置,示例:
|
||
|
||
```yaml
|
||
prometheus:
|
||
prometheusSpec:
|
||
additionalScrapeConfigs:
|
||
- job_name: "kubernetes-service-endpoints"
|
||
...
|
||
- job_name: "kubernetes-pods"
|
||
...
|
||
```
|