惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
H
Hacker News: Front Page
Stack Overflow Blog
Stack Overflow Blog
B
Blog
I
InfoQ
GbyAI
GbyAI
T
The Blog of Author Tim Ferriss
F
Fortinet All Blogs
Y
Y Combinator Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
月光博客
月光博客
Hugging Face - Blog
Hugging Face - Blog
爱范儿
爱范儿
F
Full Disclosure
Hacker News - Newest:
Hacker News - Newest: "LLM"
Recent Announcements
Recent Announcements
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Jina AI
Jina AI
T
Tailwind CSS Blog
S
Secure Thoughts
P
Privacy International News Feed
美团技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LINUX DO - 最新话题
H
Hackread – Cybersecurity News, Data Breaches, AI and More
C
Cybersecurity and Infrastructure Security Agency CISA
Last Week in AI
Last Week in AI
W
WeLiveSecurity
Google Online Security Blog
Google Online Security Blog
P
Privacy & Cybersecurity Law Blog
D
DataBreaches.Net
Engineering at Meta
Engineering at Meta
Know Your Adversary
Know Your Adversary
P
Palo Alto Networks Blog
I
Intezer
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Project Zero
Project Zero
V2EX - 技术
V2EX - 技术
H
Heimdal Security Blog
博客园 - Franky
阮一峰的网络日志
阮一峰的网络日志
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Troy Hunt's Blog
V
Vulnerabilities – Threatpost
H
Help Net Security
Martin Fowler
Martin Fowler
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
G
GRAHAM CLULEY
博客园 - 【当耐特】

lvbibir's Blog

shell | 磁盘空间分析脚本 Linux cat 和 tee 命令写入文件 python | 使用 uv 管理你的 python 环境 Claude Code 完整配置指南 windows | mihomo 内核独立部署指南 linux | 磁盘扩容 wsl | 释放长久运行占用的磁盘空间 mysql | 线程上限问题处理 麒麟 7.6 安装谷歌 OTP 认证模块 suse 12sp5 升级 openssh 及 openssl suse 12sp5 部署 mysql 5.7 《谁的青春不迷茫》 docker | centos7 部署 docker vim | 基础配置和使用 windows | rime 输入法 & 雾凇方案 shell | sshpass 批量传输文件及执行命令 wsl | 原生 linux 方式安装 docker nodejs | fnm + pnpm 开发环境配置 wsl | 安装配置 miniconda 虚拟环境 wsl | 自动更新系统代理 wsl | bashrc 环境变量不正确加载的处理方法 wsl | win10 安装 wsl2 troubleshooting | ssh 成功但是 scp 失败 linux | 常用命令总结 docker 部署 piclist shell | 检测网站存活并自动钉钉告警 Zabbix | 监控端口连通性并自动追踪 TCP 路由 windows | 自定义开机快速启动项 windows | miniconda 配置 python 虚拟环境 Zabbix | 监控主机到指定 ip 的流量大小 shell | centos 初始化 loki (二) 部署 loki (一) 简介 prometheus (六) Alertmanager prometheus (五) 记录规则与告警规则 prometheus (三) 服务发现 prometheus (二) 静态配置 prometheus (一) 简介及部署 traefik (四) TraefikService 服务 traefik (三) Middleware 中间件 traefik (二) ingressRoute 路由 traefik (一) 简介、部署和配置 kubernetes | Gateway API 简介及部署 linux | dns 配置文件中 search 和 options ndots 详解 kubernetes | command args 和 dockerfile 中的 ENTRYPOINT CMD kubernetes | statefulset 控制器详解 docker | dockerfile 最佳实践 docker | dockerfile 指令详解 linux | kill 命令详解以及 linux 中的信号 troubleshooting | elasticsearch 安装插件报错 shell | if 条件判断 docker | 下载外网镜像的几种方式 python | 鬼谷子数学问题 steam挂刀教程 linux | history 命令的格式化输出 shell | 将本地镜像批量推送到 harbor windows | hosts 文件修复 kubernetes | configmap & secret kubernetes | RBAC 鉴权和 NetworkPolicy kubernetes | service & ingress kubernetes | 存储 kubernetes | 滚动升级和自动伸缩 kubernetes | 控制器 kubernetes | 日志 kubernetes | 调度 kubernetes | pod kubernetes | 杂记 linux | set 命令详解 ceph | openeuler 部署 ceph-v16 ceph | ceph-v16 离线安装解决方案 pxe 如何应对复杂的服务器硬件环境 python | 批量修改目录下文件名 《微习惯》 ceph | openeuler (aarch64) 部署 ceph-v16 troubleshooting | glibc 误升级后修复 pxe 安装配置大全 《人间失格》 跑步日常 [置顶] Hello, hugo! shell | 检索某 url 中所有文件的内容 shell | 不同执行方式的区别 shell | 开启 debug 模式 vscode | 常见问题 windows & linux 多网卡时设置默认路由以及添加静态路由 mysql (二) 主从复制原理 GTID 并行复制 mysql (一) 部署 mysql | 杂记 cicd | jenkins 部署 mall-swarm 项目 httpd 源码打包编译成 rpm 包 openssl 源码打包编译成 rpm 包 centos7 | 修改网卡名称 ceph | pool pg_num 配置 docker | 脚本方式批量导出/导入镜像 centos 密码尝试次数过多问题处理 centos7 | 升级内核至 5.10 CVE-1999-0526 ceph | centos7 部署 ceph-v12 python | 修改 pip 源 troubleshooting | 安装 cloud-init 后导致 ssh 连接失败 windows | autohotkey 常用脚本
prometheus (四) 黑盒监控
lvbibir · 2023-04-27 · via lvbibir's Blog

0 前言

基于 centos7.9 docker-ce-20.10.18 kubelet-1.22.3-0 kube-prometheus-0.10 prometheus-v2.32.1

1 简介

Probe 的 API 文档

1.1 白盒监控 vs 黑盒监控

白盒监控: 我们监控主机的资源用量、容器的运行状态、数据库中间件的运行数据等等,这些都是支持业务和服务的基础设施,通过白盒能够了解其内部的实际运行状态,通过对监控指标的观察能够预判可能出现的问题,从而对潜在的不确定因素进行优化

黑盒监控: 以用户的身份测试服务的外部可见性,常见的黑盒监控包括 HTTP 探针 TCP 探针 等用于检测站点或者服务的可访问性,以及访问效率等。

黑盒监控相较于白盒监控最大的不同在于黑盒监控是以故障为导向的. 当故障发生时,黑盒监控能快速发现故障,而白盒监控则侧重于主动发现或者预测潜在的问题。一个完善的监控目标是要能够从白盒的角度发现潜在问题,能够在黑盒的角度快速发现已经发生的问题。

1.2 blackbox exporter

Blackbox Exporter 是 Prometheus 社区提供的官方黑盒监控解决方案,其允许用户通过 HTTP HTTPS DNS TCP ICMP 以及 gPRC 的方式对 endpoints 端点进行探测。

在 kube-prometheus 的默认配置中已经部署了 Blackbox Exporter 以供用户使用

[root@k8s-node1 kube-prometheus]# ls manifests/blackboxExporter-* | cat
manifests/blackboxExporter-clusterRoleBinding.yaml
manifests/blackboxExporter-clusterRole.yaml
manifests/blackboxExporter-configuration.yaml
manifests/blackboxExporter-deployment.yaml
manifests/blackboxExporter-serviceAccount.yaml
manifests/blackboxExporter-serviceMonitor.yaml
manifests/blackboxExporter-service.yaml

1.3 Probe CRD

prometheus-operator 提供了一个 Probe CRD 对象,可以用来进行黑盒监控,具体的探测功能由 Blackbox-exporter 实现。

Probe 支持 staticConfigingress 两种配置方式, 使用 ingress 时可以自动发现 ingress 代理的 url 并进行探测

大概步骤:

  • 首先,用户创建一个 Probe CRD 对象,对象中指定探测方式、探测目标等参数;
  • 然后,prometheus-operator watch 到 Probe 对象创建,然后生成对应的 prometheus 拉取配置,reload 到 prometheus 中;
  • 最后,prometheus 使用 url=/probe?target={探测目标}&module={探测方式},拉取 blackbox-exporter ,此时 blackbox-exporter 会对目标进行探测,并以 metrics 格式返回探测结果;

3526046601-63e4a22006154_fix732

2 probe 示例

2.1 staticConfig

2.1.1 kube-dns

使用黑盒监控监测 kube-dns 的可用性

默认配置下的 blackbox exporter 未开启 dns 模块, 我们手动开启一下

修改 blackboxExporter-configuration.yaml 文件, 添加 dns 模块

apiVersion: v1
data:
  config.yml: |-
    "modules":
      "dns":  # DNS 检测模块
        "prober": "dns"
        "dns":
          "transport_protocol": "tcp"  # 默认是 udp
          "preferred_ip_protocol": "ip4"  # 默认是 ip6
          "query_name": "kubernetes.default.svc.cluster.local"    

更新 configmap 配置文件, prometheus-opertor 会 watch 到更新然后通过 pod 中的 module-configmap-reloader 容器通知 blackbox-exporter 重载配置

# 每个 blackbox-exporter POD 中有三个 container
[root@k8s-node1 manifests]# kubectl get pods -n monitoring -l app.kubernetes.io/name=blackbox-exporter \
-o jsonpath='{.items[*].spec.containers[*].name}{"\n"}'
blackbox-exporter module-configmap-reloader kube-rbac-proxy

[root@k8s-node1 manifests]# kubectl apply -f  blackboxExporter-configuration.yaml
configmap/blackbox-exporter-configuration configured
[root@k8s-node1 manifests]# kubectl logs -n monitoring -l app.kubernetes.io/name=blackbox-exporter | tail -2
level=info ts=2023-04-23T02:23:49.614Z caller=tls_config.go:191 msg="TLS is disabled." http2=false
level=info ts=2023-04-28T06:40:48.168Z caller=main.go:278 msg="Reloaded config file"

创建 Probe CRD 资源

apiVersion: monitoring.coreos.com/v1
kind: Probe
metadata:
  name: blackbox-kube-dns
  namespace: monitoring
spec:
  jobName: blackbox-kube-dns
  interval: 10s
  module: dns
  prober:                        # 指定blackbox的地址
    url: blackbox-exporter:19115 # blackbox-exporter 的 地址 和 端口
    path: /probe                 # 路径
  targets:
    staticConfig:
      static:
      - kube-dns.kube-system:53   # 要检测的 url

查看生成的 target

image-20230428151921527

现在可以通过:

  • probe_success{job="blackbox-kube-dns"} 查看服务状态是否可用
  • probe_dns_lookup_time_seconds{job='blackbox-kube-dns'} DNS 解析耗时

查看 blackbox exporter 一次 dns 探测生成的 metrics 指标

image-20230428160521908

2.2.1 http

http 探测一般使用 http_2xx 模块, 虽然默认有这个模块, 但是默认的配置不太合理, 我们修改一下

apiVersion: v1
data:
  config.yml: |-
    "modules":
      "dns":  # DNS 检测模块
        "prober": "dns"
        "dns":
          "transport_protocol": "tcp"  # 默认是 udp
          "preferred_ip_protocol": "ip4"  # 默认是 ip6
          "query_name": "kubernetes.default.svc.cluster.local"
      "http_2xx":
        "http":
          "preferred_ip_protocol": "ip4"
          "valid_status_codes": "[200]"    # 最好加上状态码, 方便 grafana 展示数据
          "valid_http_versions": ["HTTP/1.1", "HTTP/2"]
          "method": "GET"
        "prober": "http"    

更新配置

[root@k8s-node1 manifests]# kubectl apply -f  blackboxExporter-configuration.yaml
configmap/blackbox-exporter-configuration configured

快速创建一个 nginx 应用

kubectl create deployment nginx --image=nginx:1.22.1 --port=80
kubectl expose deployment nginx --name=nginx --port=80 --target-port=80

创建 Probe 资源

apiVersion: monitoring.coreos.com/v1
kind: Probe
metadata:
  name: blackbox-http-nginx
  namespace: monitoring
spec:
  jobName: blackbox-http-nginx 
  prober:
    url: blackbox-exporter:19115
    path: /probe
  module: http_2xx # 配置文件中的检测模块
  targets: 
    staticConfig:
      static:
        - nginx.default

查看生成的 target

image-20230428162821972

查看一次 http 探测生成的 metrics 指标

image-20230428163153649

2.2 ingress 自动发现

接下来使用 ingrss 自动发现实现集群内的 ingress 并进行黑盒探测

先创建两个 web 应用

kubectl create deployment web-1 --image=nginx:1.22.1 --port=80
kubectl expose deployment web-1 --name=web-1 --port=80 --target-port=80

kubectl create deployment web-2 --image=nginx:1.22.1 --port=80
kubectl expose deployment web-2 --name=web-2 --port=80 --target-port=80

2.2.1 创建 ingress

包含三个路径: http://web1.test.com http://web1.test.com/test http://web2.test.com

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-web
  namespace: default
  labels:
    prometheus.io/http-probe: "true" # 用于监测
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
  rules:
  - host: web1.test.com
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: web-1
            port:
              number: 80
      - pathType: Prefix
        path: /test
        backend:
          service:
            name: web-1
            port:
              number: 80
  - host: web2.test.com
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: web-2
            port:
              number: 80

部署并访问测试

[root@k8s-node1 manifests]# echo "1.1.1.1 web1.test.com web2.test.com" >> /etc/hosts
[root@k8s-node1 manifests]# curl -sI web1.test.com | head -1
HTTP/1.1 200 OK
[root@k8s-node1 manifests]# curl -sI web1.test.com/test | head -1
HTTP/1.1 404 Not Found
[root@k8s-node1 manifests]# curl -sI web2.test.com | head -1
HTTP/1.1 200 OK

2.2.2 创建 probe

可以使用 label 或者 annotation 两种方式筛选监测的 ingress, 不配置监测所有 ingress

apiVersion: monitoring.coreos.com/v1
kind: Probe
metadata:
  name: blackbox-ingress
  namespace: monitoring
spec:
  jobName: blackbox-ingress
  prober:
    url: blackbox-exporter:19115
    path: /probe
  module: http_2xx
  targets:
    ingress:      
      namespaceSelector:
        # 监测所有 namespace
        # any: true      
        # 只监测指定 namespace 的 ingress
        matchNames:
        - default  
        - monitoring
      # 只监测配置了标签 prometheus.io/http-probe: true 的 ingress
      selector:
        matchLabels:
          prometheus.io/http-probe: "true"
      # 只监测配置了注解 prometheus.io/http_probe: true 的 ingress
      # relabelingConfigs: 
      # - action: keep
      #   sourceLabels:
      #   - __meta_kubernetes_ingress_annotation_prometheus_io_http_probe
      #   regex: "true"

查看 targets

image-20230429131759421

不过由于 ingress 配置的域名无法解析, 所以监测到的状态是失败的:

image-20230429141436766

2.2.3 配置 coredns

我们为 coredns 添加自定义 hosts, 实现 blackbox 可以解析到我们的自定义域名

# kubectl edit cm coredns -n kube-system
apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf {
           max_concurrent 1000
        }
        hosts {    # 添加 hosts 配置
          1.1.1.1 web1.test.com 
          1.1.1.1 web2.test.com
          fallthrough
        }
        cache 30
        loop
        reload
        loadbalance
    }    
kind: ConfigMap

等待 coredns 的配置生效后, 我们重新再看一下 target 状态

image-20230429150029851

3 additionalScrapeConfigs

目前 prometheus operator 只支持 ingress 方式的自动发现, 而且自定义配置其实不是很多, 更推荐使用 additionalScrapeConfigs 静态配置的方式实现

3.2 service 自动发现

沿用 2.2 章节中创建的两个 service

修改 service web-1, 添加 annotation

# kubectl edit svc web-1
metadata:
  annotations:
    prometheus.io/http-probe: "true"    # 控制是否监测
    prometheus.io/http-probe-path: /    # 控制监测路径
    prometheus.io/http-probe-port: "80" # 控制监测端口

修改静态配置

# vim prometheus-additional.yaml
- job_name: "kubernetes-services"
  metrics_path: /probe
  params:
    module:
    - "http_2xx"
  ## 使用 Kubernetes 动态服务发现,且使用 Service 类型的发现
  kubernetes_sd_configs:
  - role: service
  relabel_configs:
    ## 设置只监测 Annotation 里配置了 prometheus.io/http_probe: true 的 service
  - action: keep
    source_labels: [__meta_kubernetes_service_annotation_prometheus_io_http_probe]
    regex: "true"
  - action: replace
    source_labels:
    - "__meta_kubernetes_service_name"
    - "__meta_kubernetes_namespace"
    - "__meta_kubernetes_service_annotation_prometheus_io_http_probe_port"
    - "__meta_kubernetes_service_annotation_prometheus_io_http_probe_path"
    target_label: __param_target
    regex: (.+);(.+);(.+);(.+)
    replacement: $1.$2:$3$4
  - target_label: __address__
    replacement: blackbox-exporter:19115
  - source_labels: [__param_target]
    target_label: instance
  - action: labelmap
    regex: __meta_kubernetes_service_label_(.+)
  - source_labels: [__meta_kubernetes_namespace]
    target_label: kubernetes_namespace
  - source_labels: [__meta_kubernetes_service_name]
    target_label: kubernetes_name

更新 secret

kubectl create secret generic additional-scrape-configs -n monitoring --from-file=prometheus-additional.yaml  > additional-scrape-configs.yaml
kubectl apply -f additional-scrape-configs.yaml 

确保 prometheus CRD 实例配置了 secret

[root@k8s-node1 manifests]# grep -A2 additionalScrapeConfigs prometheus-prometheus.yaml
  additionalScrapeConfigs:
    name: additional-scrape-configs  # secret name
    key: prometheus-additional.yaml  # secret key

查看 target, 可以看到只有 web-1 发现成功, 因为 web-2 没有配置 annotation

image-20230429142923440

查看一下监测状态, 直接使用 <service-name>.<namespace> 访问, 在集群内是可以正常解析的, 所以这里 http 状态码为正常的 200

image-20230429143126584

3.1 ingress 自动发现

依旧使用 2.2 章节中创建的 ingress

为 ingress 添加 annotation 注解

# kubectl edit ingress demo-web
  annotations:
    # 添加如下项 
    prometheus.io/http-probe: "true"     # 用于控制是否监测
    prometheus.io/http-probe-port: "80"  # 用于控制监测端口

修改静态配置

# cat prometheus-additional.yaml
- job_name: "kubernetes-ingresses"
  metrics_path: /probe
  params:
    module:
    - "http_2xx"
  ## 使用 Kubernetes 动态服务发现,且使用 ingress 类型的发现
  kubernetes_sd_configs:
  - role: ingress
  relabel_configs:
    ## 设置只监测 Annotation 里配置了 prometheus.io/http_probe: true 的 ingress
  - action: keep
    source_labels: [__meta_kubernetes_ingress_annotation_prometheus_io_http_probe]
    regex: "true"
  - action: replace
    source_labels:
    - "__meta_kubernetes_ingress_scheme"
    - "__meta_kubernetes_ingress_host"
    - "__meta_kubernetes_ingress_annotation_prometheus_io_http_probe_port"
    - "__meta_kubernetes_ingress_path"
    target_label: __param_target
    regex: (.+);(.+);(.+);(.+)
    replacement: ${1}://${2}:${3}${4}
  - target_label: __address__
    replacement: blackbox-exporter:19115
  - source_labels: [__param_target]
    target_label: instance
  - action: labelmap
    regex: __meta_kubernetes_ingress_label_(.+)
  - source_labels: [__meta_kubernetes_namespace]
    target_label: namespace
  - source_labels: [__meta_kubernetes_ingress_name]
    target_label: ingress_name

更新 secret

kubectl create secret generic additional-scrape-configs -n monitoring --from-file=prometheus-additional.yaml  > additional-scrape-configs.yaml
kubectl apply -f additional-scrape-configs.yaml 

确保 prometheus CRD 实例配置了 secret

[root@k8s-node1 manifests]# grep -A2 additionalScrapeConfigs prometheus-prometheus.yaml
  additionalScrapeConfigs:
    name: additional-scrape-configs  # secret name
    key: prometheus-additional.yaml  # secret key

查看 target

image-20230429145138845

查看监测状态, 与预期配置一样

image-20230429150518709

以上