Myluzh Blog

Prometheus 自动发现 K8S Ingress 实现黑盒监控

发布时间: 2024-11-21 文章作者: myluzh 分类名称: Kubernetes 朗读文章


0x01 在prometheus配置中添加自动发现
修改prometheus配置文件prometheus-additional.yaml,我这边只自动发现namespace为dev-test的ingress,其他要求可以按需配置。
# 黑盒监控自定义地址
- job_name: 'blackbox_http'
  metrics_path: /probe  # 指定用于探测的 HTTP 路径
  params:
    module: [http_2xx]  # 指定模块,配置在 Blackbox Exporter 的配置文件中
  static_configs:
    - targets:  # 定义需要监控的目标地址
        - https://www.baidu.com
  relabel_configs:
    - source_labels: [__address__]  # 使用默认的目标地址
      target_label: __param_target  # 将目标地址设置为 `target` 参数,供 Blackbox Exporter 使用
    - source_labels: [__param_target]  # 从参数中提取目标地址
      target_label: instance  # 将目标地址映射为 `instance` 标签,便于 Prometheus 显示
    - target_label: __address__  # 指定 Blackbox Exporter 的实际服务地址
      replacement: blackbox-exporter:19115  # 替换目标地址为 Blackbox Exporter 服务地址
    - source_labels: [instance]  # 目标地址保存在 `instance` 标签中
      target_label: target  # 将目标地址映射为 `target` 标签,供 Blackbox Exporter 配置使用

# 监控Blackbox Exporter自身
- job_name: 'blackbox_exporter'
  static_configs:
    - targets: ['blackbox-exporter:19115']  # 定义Blackbox Exporter自身的监控目标

# ingress自动发现
- job_name: 'kubernetes_ingress'
  metrics_path: /probe
  params:
    module: [http_2xx]
  kubernetes_sd_configs:
    - role: ingress  # 从 Kubernetes 集群中获取 Ingress 资源
  relabel_configs:
    # 仅保留 dev-test 命名空间的 Ingress
    - source_labels: [__meta_kubernetes_namespace]
      regex: dev-test  # 匹配 dev-test 命名空间
      action: keep  # 仅保留匹配的资源

    # 设置 Blackbox Exporter 的地址
    - target_label: __address__
      replacement: blackbox-exporter:19115  # 使用 Blackbox Exporter 的服务地址

    # 构建 _param_target 标签,用于 Blackbox Exporter
    - source_labels: [__meta_kubernetes_ingress_scheme, __meta_kubernetes_ingress_host, __meta_kubernetes_ingress_path]
      regex: (.+);(.+);(.+)  # 提取协议、地址和路径
      replacement: ${1}://${2}${3}  # 生成完整的 URL
      target_label: __param_target # 将完整 URL 保存为 `_param_target`

    # 设置 target 标签,保留完整的 URL
    - source_labels: [__meta_kubernetes_ingress_scheme, __meta_kubernetes_ingress_host, __meta_kubernetes_ingress_path]
      regex: (.+);(.+);(.+)  # 提取协议、地址和路径
      replacement: ${1}://${2}${3}  # 生成完整的 URL
      target_label: target  # 将完整 URL 保存为 `target`

    # 将 _param_target 转为 instance 标签
    - source_labels: [_param_target]
      target_label: instance  # 将目标地址映射为 `instance` 标签

    # 映射所有 Kubernetes Ingress 的标签
    - action: labelmap
      regex: __meta_kubernetes_ingress_label_(.+)  # 提取所有以 `__meta_kubernetes_ingress_label_` 开头的标签

    # 添加命名空间和 Ingress 名称标签
    - source_labels: [__meta_kubernetes_namespace]
      target_label: kubernetes_namespace  # 添加 `kubernetes_namespace` 标签
    - source_labels: [__meta_kubernetes_ingress_name]
      target_label: kubernetes_name  # 添加 `kubernetes_name` 标签
0x02 给prometheus访问ingress资源的权限
在添加完配置,使用 curl -X POST http://172.30.233.87:30926/-/reload重载后,可以发现prometheus的config里面已经加载成功,但是自动发现并没有,查看prometheus的容器报错如下:
Failed to watch *v1beta1.Ingress: failed to list *v1beta1.Ingress: ingresses.networking.k8s.io is forbidden: User "system:serviceaccount:monitoring:prometheus-k8s" cannot list resource "ingresses" in API group "networking.k8s.io" at the cluster scope
可以看到,Prometheus 的 system:serviceaccount:monitoring:prometheus-k8s 服务账户缺少对 Kubernetes API 中 ingresses 资源的访问权限。因此,Prometheus 无法列出或监控这些 Ingress 资源。
需要为 Prometheus 的服务账户 prometheus-k8s 分配足够的权限,以便能够列出和监控 Ingress 资源。可以通过创建一个 ClusterRole 和 ClusterRoleBinding 来授予相应权限。
1、创建 ClusterRole: 创建一个 ClusterRole,允许 Prometheus 列出和访问 Ingress 资源。
prometheus-ingress-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus-ingress-reader
rules:
- apiGroups: ["networking.k8s.io"]
 resources: ["ingresses"]
 verbs: ["get", "list", "watch"]
2、创建 ClusterRoleBinding: 将刚才创建的 ClusterRole 绑定到 Prometheus 的服务账户。
prometheus-ingress-role-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
# 绑定名称可以设置为 prometheus-ingress-reader-binding
name: prometheus-ingress-reader-binding
subjects:
- kind: ServiceAccount
 name: prometheus-k8s
 namespace: monitoring  # 确保与 Prometheus 安装的命名空间一致
roleRef:
kind: ClusterRole
name: prometheus-ingress-reader
apiGroup: rbac.authorization.k8s.io
3、应用
kubectl apply -f prometheus-ingress-role.yaml
kubectl apply -f prometheus-ingress-role-binding.yaml

标签: k8s Ingress rbac 黑盒监控 自动发现 权限 prometheu

发表评论