Kubernetes使用prometheus+grafana做一个简单的监控方案

本文介绍在k8s集群中使用node-exporter、prometheus、grafana对集群进行监控。
其实现原理有点类似ELK、EFK组合。node-exporter组件负责收集节点上的metrics监控数据,并将数据推送给prometheus, prometheus负责存储这些数据,grafana将这些数据通过网页以图形的形式展现给用户。

在开始之前有必要了解下Prometheus是什么?
Prometheus (中文名:普罗米修斯)是由 SoundCloud 开发的开源监控报警系统和时序列数据库(TSDB).自2012年起,许多公司及组织已经采用 Prometheus,并且该项目有着非常活跃的开发者和用户社区.现在已经成为一个独立的开源项目。Prometheus 在2016加入 CNCF ( Cloud Native Computing Foundation ), 作为在 kubernetes 之后的第二个由基金会主持的项目。 Prometheus 的实现参考了Google内部的监控实现,与源自Google的Kubernetes结合起来非常合适。另外相比influxdb的方案,性能更加突出,而且还内置了报警功能。它针对大规模的集群环境设计了拉取式的数据采集方式,只需要在应用里面实现一个metrics接口,然后把这个接口告诉Prometheus就可以完成数据采集了,下图为prometheus的架构图。

 

Prometheus的特点:
1、多维数据模型(时序列数据由metric名和一组key/value组成)
2、在多维度上灵活的查询语言(PromQl)
3、不依赖分布式存储,单主节点工作.
4、通过基于HTTP的pull方式采集时序数据
5、可以通过中间网关进行时序列数据推送(pushing)
6、目标服务器可以通过发现服务或者静态配置实现
7、多种可视化和仪表盘支持

prometheus 相关组件,Prometheus生态系统由多个组件组成,其中许多是可选的:
1、Prometheus 主服务,用来抓取和存储时序数据
2、client library 用来构造应用或 exporter 代码 (go,java,python,ruby)
3、push 网关可用来支持短连接任务
4、可视化的dashboard (两种选择,promdash 和 grafana.目前主流选择是 grafana.)
4、一些特殊需求的数据出口(用于HAProxy, StatsD, Graphite等服务)
5、实验性的报警管理端(alartmanager,单独进行报警汇总,分发,屏蔽等 )

promethues 的各个组件基本都是用 golang 编写,对编译和部署十分友好.并且没有特殊依赖.基本都是独立工作。
 

部署

现在我们正式开始部署工作。这里假设你已经为你的K8S集群部署过kube-dns或者coredns了。
一、环境介绍
操作系统环境:centos linux 7.5 64bit
K8S软件版本: 1.12.3
Master节点IP: 10.40.0.151/24

Node01节点IP: 10.40.0.152/24

Node02节点IP: 10.40.0.153/24

 

二、采用daemonset方式部署node-exporter组件

复制代码

cat node-exporter.yaml

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: kube-system
  labels:
    k8s-app: node-exporter
spec:
  template:
    metadata:
      labels:
        k8s-app: node-exporter
    spec:
      containers:
      - image: prom/node-exporter
        name: node-exporter
        ports:
        - containerPort: 9100
          protocol: TCP
          name: http
---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: node-exporter
  name: node-exporter
  namespace: kube-system
spec:
  ports:
  - name: http
    port: 9100
    nodePort: 31672
    protocol: TCP
  type: NodePort
  selector:
    k8s-app: node-exporter

复制代码

三、部署prometheus组件

1、rbac文件

复制代码

cat rbac-setup.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups: [""]
  resources:
  - nodes
  - nodes/proxy
  - services
  - endpoints
  - pods
  verbs: ["get", "list", "watch"]
- apiGroups:
  - extensions
  resources:
  - ingresses
  verbs: ["get", "list", "watch"]
- nonResourceURLs: ["/metrics"]
  verbs: ["get"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus
  namespace: kube-system

复制代码

 

2、以configmap的形式管理prometheus组件的配置文件

复制代码

cat configmap.yaml 

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: kube-system
data:
  prometheus.yml: |
    global:
      scrape_interval:     15s
      evaluation_interval: 15s
    scrape_configs:

    - job_name: 'kubernetes-apiservers'
      kubernetes_sd_configs:
      - role: endpoints
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: default;kubernetes;https

    - job_name: 'kubernetes-nodes'
      kubernetes_sd_configs:
      - role: node
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - target_label: __address__
        replacement: kubernetes.default.svc:443
      - source_labels: [__meta_kubernetes_node_name]
        regex: (.+)
        target_label: __metrics_path__
        replacement: /api/v1/nodes/${1}/proxy/metrics

    - job_name: 'kubernetes-cadvisor'
      kubernetes_sd_configs:
      - role: node
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - target_label: __address__
        replacement: kubernetes.default.svc:443
      - source_labels: [__meta_kubernetes_node_name]
        regex: (.+)
        target_label: __metrics_path__
        replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor

    - job_name: 'kubernetes-service-endpoints'
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
        action: replace
        target_label: __scheme__
        regex: (https?)
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
        action: replace
        target_label: __address__
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
      - action: labelmap
        regex: __meta_kubernetes_service_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_service_name]
        action: replace
        target_label: kubernetes_name

    - job_name: 'kubernetes-services'
      kubernetes_sd_configs:
      - role: service
      metrics_path: /probe
      params:
        module: [http_2xx]
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_probe]
        action: keep
        regex: true
      - source_labels: [__address__]
        target_label: __param_target
      - target_label: __address__
        replacement: blackbox-exporter.example.com:9115
      - 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

    - job_name: 'kubernetes-ingresses'
      kubernetes_sd_configs:
      - role: ingress
      relabel_configs:
      - source_labels: [__meta_kubernetes_ingress_annotation_prometheus_io_probe]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_ingress_scheme,__address__,__meta_kubernetes_ingress_path]
        regex: (.+);(.+);(.+)
        replacement: ${1}://${2}${3}
        target_label: __param_target
      - target_label: __address__
        replacement: blackbox-exporter.example.com:9115
      - source_labels: [__param_target]
        target_label: instance
      - action: labelmap
        regex: __meta_kubernetes_ingress_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_ingress_name]
        target_label: kubernetes_name

    - job_name: 'kubernetes-pods'
      kubernetes_sd_configs:
      - role: pod
      relabel_configs:
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
        action: replace
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
        target_label: __address__
      - action: labelmap
        regex: __meta_kubernetes_pod_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_pod_name]
        action: replace
        target_label: kubernetes_pod_name

复制代码

 

3、Prometheus deployment 文件

复制代码

cat prometheus.yaml 

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  labels:
    name: prometheus-deployment
  name: prometheus
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      containers:
      - image: prom/prometheus:v2.0.0
        name: prometheus
        command:
        - "/bin/prometheus"
        args:
        - "--config.file=/etc/prometheus/prometheus.yml"
        - "--storage.tsdb.path=/prometheus"
        - "--storage.tsdb.retention=24h"
        ports:
        - containerPort: 9090
          protocol: TCP
        volumeMounts:
        - mountPath: "/prometheus"
          name: data
        - mountPath: "/etc/prometheus"
          name: config-volume
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            cpu: 500m
            memory: 2500Mi
      serviceAccountName: prometheus    
      volumes:
      - name: data
        emptyDir: {}
      - name: config-volume
        configMap:
          name: prometheus-config      
---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: prometheus
  name: prometheus
  namespace: kube-system
spec:
  type: NodePort
  ports:
  - port: 9090
    targetPort: 9090
    nodePort: 30003
  selector:
    app: prometheus

复制代码

 

4、通过上述yaml文件创建相应的对象

kubectl create -f node-exporter.yaml
kubectl create -f rbac-setup.yaml
kubectl create -f configmap.yaml
kubectl create -f promethues.yaml

 

5、查看相关pod和service

复制代码

# kubectl get pods -n kube-system
NAME                                   READY   STATUS    RESTARTS   AGE
coredns-779dfc4d59-rtpmk               1/1     Running   0          48s
kubernetes-dashboard-b54f75c69-tnn4h   1/1     Running   0          90m
node-exporter-sflqg                    1/1     Running   0          9m44s
node-exporter-xfsf8                    1/1     Running   0          9m44s
prometheus-58dc44f44c-z86rv            1/1     Running   0          8m44s

复制代码

# kubectl get svc -n kube-system
NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kube-dns               ClusterIP   10.250.0.2     <none>        53/UDP,53/TCP    117s
kubernetes-dashboard   NodePort    10.250.1.89    <none>        443:38443/TCP    102m
node-exporter          NodePort    10.250.0.165   <none>        9100:31672/TCP   10m
prometheus             NodePort    10.250.0.53    <none>        9090:30003/TCP   9m53s

 

6、Node-exporter对应的nodeport端口为31672,通过访问http://10.40.0.152:31672/metrics 可以看到对应的metrics

 

7、prometheus对应的nodeport端口为30003,通过访问http://10.40.0.152:30003/targets 可以看到prometheus已经成功连接上了k8s的apiserver

 

8、在prometheus的WEB界面上提供了基本的查询K8S集群中每个POD的CPU使用情况,可以使用如下查询条件查询:

sum by (pod_name)( rate(container_cpu_usage_seconds_total{image!="", pod_name!=""}[1m] ) )

 

上述的查询有出现数据,说明node-exporter往prometheus中写入数据正常,接下来我们就可以部署grafana组件,实现更友好的webui展示数据了。

 

五、部署grafana组件
1、grafana deployment配置文件

cat grafana.yaml

复制代码

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: grafana-core
  namespace: kube-system
  labels:
    app: grafana
    component: core
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: grafana
        component: core
    spec:
      containers:
      - image: grafana/grafana:5.0.0
        name: grafana-core
        imagePullPolicy: IfNotPresent
        resources:
          limits:
            cpu: 100m
            memory: 100Mi
          requests:
            cpu: 100m
            memory: 100Mi
        env:
          - name: GF_AUTH_BASIC_ENABLED
            value: "true"
          - name: GF_AUTH_ANONYMOUS_ENABLED
            value: "false"
        readinessProbe:
          httpGet:
            path: /login
            port: 3000
        volumeMounts:
        - name: grafana-persistent-storage
          mountPath: /var
      volumes:
      - name: grafana-persistent-storage
        emptyDir: {}

---
apiVersion: v1
kind: Service
metadata:
  name: grafana
  namespace: kube-system
  labels:
    app: grafana
    component: core
spec:
  type: NodePort
  ports:
    - port: 3000
      nodePort: 31000
  selector:
    app: grafana

复制代码

部署grafana

kubectl create -f grafana.yaml

 

查看grafana pod和service

复制代码

# kubectl get pod -n kube-system
NAME                                   READY   STATUS    RESTARTS   AGE
coredns-779dfc4d59-rtpmk               1/1     Running   0          101m
grafana-core-6759c8945-5f4sv           1/1     Running   0          91m
kubernetes-dashboard-b54f75c69-tnn4h   1/1     Running   0          3h11m
node-exporter-sflqg                    1/1     Running   0          110m
node-exporter-xfsf8                    1/1     Running   0          110m
prometheus-58dc44f44c-z86rv            1/1     Running   0          109m

复制代码

复制代码

# kubectl get svc -n kube-system
NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
grafana                NodePort    10.250.1.230   <none>        3000:31000/TCP   93m
kube-dns               ClusterIP   10.250.0.2     <none>        53/UDP,53/TCP    103m
kubernetes-dashboard   NodePort    10.250.1.89    <none>        443:38443/TCP    3h23m
node-exporter          NodePort    10.250.0.165   <none>        9100:31672/TCP   112m
prometheus             NodePort    10.250.0.53    <none>        9090:30003/TCP   111m

复制代码

 

可以看到grafana nodeport端口为31000,可使用nodeip+nodeport的方式访问grafana  http://10.40.0.152:31000

 

默认用户名和密码都是admin

配置数据库源为prometheus,导入面板

 

 

可以直接输入模板编号315在线导入,或者下载好对应的json模板文件本地导入,面板模板下载地址https://grafana.com/dashboards/315

 

在线加载模板OK,选择prometheus数据库实例

 

 大功告成,可以看到炫酷的监控页面了。

 

 

https://grafana.com/dashboards/315
https://grafana.com/dashboards/8919

<think>我们正在配置Kubernetes集群中的Prometheus、Alertmanager和Grafana,以实现将监控报警发送到QQ邮箱的功能。根据引用内容,特别是引用[3]中提供了Alertmanager的配置示例(使用163邮箱),我们可以参考并修改为QQ邮箱的配置。###步骤1:配置Alertmanager使用QQ邮箱发送报警QQ邮箱的SMTP服务器地址为`smtp.qq.com`,端口为465(SSL)或587(TLS)。在配置中,我们通常使用SSL端口465,并设置`smtp_require_tls`为`true`(尽管QQ邮箱可能要求使用STARTTLS,但使用端口465是隐式SSL,所以可能不需要设置`require_tls`,但为了安全,我们使用SSL并设置`smtp_require_tls:true`)。同,QQ邮箱需要使用授权码作为密码(不是QQ密码)。####创建Alertmanager的ConfigMap配置文件创建一个YAML文件,例如`alertmanager-configmap.yaml`,内容如下:```yamlapiVersion:v1kind:ConfigMapmetadata:name:alertmanager-confignamespace:monitoring#假设Alertmanager部署在monitoring命名空间data:alertmanager.yml:|-global:resolve_timeout:5msmtp_smarthost:'smtp.qq.com:465'smtp_from:'your_qq_email@qq.com'#你的QQ邮箱地址smtp_auth_username:'your_qq_email@qq.com'#你的QQ邮箱地址smtp_auth_password:'your_authorization_code'#QQ邮箱的授权码smtp_require_tls:true#使用SSL/TLSroute:group_by:['alertname']group_wait:30sgroup_interval:5mrepeat_interval:1hreceiver:'email'receivers:-name:'email'email_configs:-to:'recipient@example.com'#接收报警的邮箱地址,可以是任意邮箱(比如你的QQ邮箱或其他邮箱)send_resolved:true```注意:-将`your_qq_email@qq.com`替换为你的QQ邮箱地址。-将`your_authorization_code`替换为你的QQ邮箱授权码(在QQ邮箱设置中生成)。-将`recipient@example.com`替换为实际接收报警的邮箱地址(可以是同一个QQ邮箱,也可以是其他邮箱)。-命名空间`monitoring`需要根据你的实际部署命名空间调整。####应用ConfigMap```bashkubectlapply-falertmanager-configmap.yaml```###步骤2:部署或更新Alertmanager确保Alertmanager的Deployment或StatefulSet挂载了这个ConfigMap。通常在Alertmanager的部署文件中,会有类似如下的卷挂载配置:```yaml...volumeMounts:-name:config-volumemountPath:/etc/alertmanagervolumes:-name:config-volumeconfigMap:name:alertmanager-config...```如果你已经部署了Alertmanager,更新ConfigMap后,需要重启AlertmanagerPod以使配置生效。###步骤3:配置Prometheus与Alertmanager通信在Prometheus的配置中,需要指定Alertmanager的地址。例如,在Prometheus的ConfigMap中,添加以下内容:```yamlalerting:alertmanagers:-static_configs:-targets:-alertmanager:9093#假设Alertmanager在同一个命名空间,服务名为alertmanager,端口9093```然后应用Prometheus的配置并重启Prometheus。###步骤4:在Prometheus中配置报警规则创建或更新报警规则文件(通常也是一个ConfigMap),例如:```yamlapiVersion:v1kind:ConfigMapmetadata:name:prometheus-rulesnamespace:monitoringdata:node-alert.rules.yml:|-groups:-name:node-alertsrules:-alert:NodeDownexpr:up{job="node-exporter"}==0for:1mlabels:severity:criticalannotations:summary:"Nodedown:{{$labels.instance}}"description:"{{$labels.instance}}hasbeendownformorethan1minute."```然后,在Prometheus配置中加载这个规则文件。###步骤5:配置Grafana(可选)Grafana本身也可以设置报警,但这里我们主要使用Prometheus+Alertmanager。如果你需要在Grafana中设置报警并发送到QQ邮箱,可以在Grafana的报警通道中配置:1.登录Grafana,进入`Alerting`->`Notificationchannels`。2.添加一个通知通道,类型选择`Email`。3.填写邮箱配置,包括发件邮箱(需要和Alertmanager配置的邮箱一致或使用相同SMTP配置)、收件人地址等。但注意,Grafana的报警通道配置独立于Alertmanager。通常,我们建议统一使用Alertmanager管理报警,因此Grafana的报警也可以转发到Alertmanager,然后由Alertmanager统一发送。###步骤6:测试触发一个报警(例如,使某个节点宕机),检查QQ邮箱是否收到报警邮件。###注意事项-QQ邮箱需要开启SMTP服务,并生成授权码(在QQ邮箱设置->账户->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务中开启,并生成授权码)。-确保Kubernetes集群中的Pod可以访问QQ邮箱的SMTP服务器(网络策略允许)。###引用说明以上配置参考了引用[3]中关于Alertmanager配置的示例,并针对QQ邮箱进行了调整[^3]。§§相关问题§§1.如何获取QQ邮箱的授权码?2.如何验证Alertmanager的配置是否正确?3.如果收不到报警邮件,应该如何排查?</think>### 配置 Kubernetes + Prometheus + Alertmanager + Grafana 发送报警到 QQ 邮箱 #### 步骤 1:配置 Alertmanager 邮箱设置 创建 `alertmanager-config.yaml` 文件,配置 QQ 邮箱参数: ```yaml apiVersion: v1 kind: ConfigMap metadata: name: alertmanager-config namespace: monitoring # 替换为实际命名空间 data: alertmanager.yml: |- global: resolve_timeout: 5m smtp_smarthost: 'smtp.qq.com:465' # QQ邮箱SMTP服务器 smtp_from: 'your_email@qq.com' # 发件邮箱 smtp_auth_username: 'your_email@qq.com' smtp_auth_password: 'your_auth_code' # QQ邮箱授权码 smtp_require_tls: true route: group_by: ['alertname'] group_wait: 30s group_interval: 5m repeat_interval: 1h receiver: 'qq-email' receivers: - name: 'qq-email' email_configs: - to: 'receiver@example.com' # 收件邮箱 send_resolved: true ``` > **关键参数说明**: > - `smtp_auth_password`:需在 [QQ邮箱设置](https://mail.qq.com) → 账户 → 生成授权码 > - `smtp_require_tls`:必须启用 SSL/TLS > - 命名空间需与 Prometheus 部署环境一致 #### 步骤 2:部署/更新 Alertmanager ```bash kubectl apply -f alertmanager-config.yaml # 应用配置 kubectl rollout restart deployment/alertmanager -n monitoring # 重启生效 ``` #### 步骤 3:配置 Prometheus 报警规则 在 `prometheus-rules.yaml` 中添加示例规则: ```yaml apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: node-alerts namespace: monitoring spec: groups: - name: node-alerts rules: - alert: NodeDown expr: up{job="node-exporter"} == 0 for: 1m labels: severity: critical annotations: summary: "节点宕机: {{ $labels.instance }}" description: "实例 {{ $labels.instance }} 已宕机超过1分钟" ``` #### 步骤 4:验证配置 1. **检查 Alertmanager 日志**: ```bash kubectl logs deployment/alertmanager -n monitoring | grep config ``` 应输出:`level=info msg="Loading configuration file" file=/etc/alertmanager/alertmanager.yml` 2. **测试邮件发送**: ```bash kubectl exec -it deployment/alertmanager -n monitoring -- \ amtool test notify /etc/alertmanager/alertmanager.yml ``` #### 步骤 5:Grafana 报警集成(可选) 在 Grafana 中将报警转发到 Alertmanager: 1. 登录 Grafana → Alerting → Contact points 2. 添加新联系点: - **Name**: Alertmanager - **Contact point type**: Prometheus Alertmanager - **URL**: `http://alertmanager.monitoring.svc:9093` (根据实际服务地址) #### 常见问题排查 - **收不到邮件**: 1. 检查 QQ 邮箱授权码是否有效 2. 验证网络策略是否允许访问 `smtp.qq.com:465` 3. 检查 Alertmanager 日志:`kubectl logs -f alertmanager-pod_name` - **SSL 错误**: ```yaml global: smtp_hello: "qq.com" # 添加此参数解决证书问题 ``` ### 技术原理示意图 ```mermaid graph LR A[Prometheus] -->|报警规则| B(Alertmanager) B -->|SMTP协议| C[QQ邮箱服务器] C --> D{用户邮箱} G[Grafana] -->|转发报警| B ``` > **注**:QQ 邮箱 SMTP 要求加密连接,必须使用端口 465(SSL)或 587(TLS)[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值