采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台

这篇具有很好参考价值的文章主要介绍了采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

采用 "Prometheus+Grafana"的开源监控系统,安装部署K8S集群监控平台。
并使用Altermanager告警插件,配合使用企业微信,实现系统集群监控报警机制。

1. 实验节点规划表

主机名称 IP地址 安装组件
m1 192.168.200.61 Prometheus+Grafana+Alertmanager+node_exporter
m2 192.168.200.62 node_exporter
m3 192.168.200.63 node_exporter
n1 192.168.200.64 node_exporter
n2 192.168.200.65 node_exporter
n3 192.168.200.66 node_exporter

2. 安装Prometheus

在master01节点上执行操作。

  • 安装Prometheus
# 下载
wget https://github.com/prometheus/prometheus/releases/download/v2.34.0/prometheus-2.34.0.linux-amd64.tar.gz

# 解压
tar -zxvf prometheus-2.34.0.linux-amd64.tar.gz -C /usr/local/

# 更名
cd /usr/local/  &&  mv prometheus-2.34.0.linux-amd64 prometheus  &&  cd prometheus
  • 创建prometheus.service配置文件
cat > /usr/lib/systemd/system/prometheus.service << EOF
[Unit]
Description=prometheus
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --storage.tsdb.path=/data/prometheus --storage.tsdb.retention=15d --log.level=info            
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
  • 启动prometheus服务
systemctl daemon-reload && systemctl start prometheus && systemctl enable prometheus && systemctl status prometheus
  • 查看prometheus服务进程
netstat -lntp | grep prometheus

3. 安装node_exporter

1 Node Exporter for Prometheus Dashboard CN 0413 ConsulManager自动同步版 dashboard for Grafana | Grafana Labs

其余节点安装操作相同。

  • 安装node_exporter
# 下载
wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz

# 解压
tar -zxvf node_exporter-1.3.1.linux-amd64.tar.gz -C /usr/local/

# 更名
cd /usr/local && mv node_exporter-1.3.1.linux-amd64 node_exporter && cd node_exporter
  • 启动node_exproter
cat > /usr/lib/systemd/system/node_exporter.service << EOF
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/node_exporter/node_exporter
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF
  • 启动node_exproter服务
systemctl daemon-reload && systemctl start node_exporter && systemctl enable node_exporter && systemctl status node_exporter
  • 查看node_exproter服务进程
ps -ef | grep node_exporter

4. 配置prometheus.yml文件

  • 修改prometheus.yml配置文件
[root@m1 prometheus]# cat prometheus.yml
# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
       - 127.0.0.1:9093
      # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - "rules/*.yml"
# - "first_rules.yml"
# - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9090']  # 如果对本机node_exporter监控,加入,'localhost:9100'
  
  - job_name: 'K8S-Masters'
  #重写了全局抓取间隔时间,由15秒重写成5秒。
    scrape_interval: 5s
    static_configs:
    - targets: ['192.168.200.61:9100']
    - targets: ['192.168.200.62:9100']
    - targets: ['192.168.200.63:9100']

  - job_name: 'K8S-Nodes'
    scrape_interval: 5s
    static_configs:
    - targets: ['192.168.200.64:9100']
    - targets: ['192.168.200.65:9100']
    - targets: ['192.168.200.66:9100']
  • 检验prometheus.yml配置是否有效
./promtool check config prometheus.yml
  • 重启prometheus服务
systemctl daemon-reload && systemctl restart prometheus && systemctl status prometheus
  • 重启node_exporter服务
systemctl daemon-reload && systemctl restart node_exporter && systemctl status node_exporter
  • 访问Prometheus网站http://192.168.200.61:9090/targets
    采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台

5. 安装Grafana

在master01节点上执行操作。

  • 下载安装Grafana

下载链接:Download Grafana | Grafana Labs

# 下载
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-8.4.5-1.x86_64.rpm

# 安装
yum install -y grafana-enterprise-8.4.5-1.x86_64.rpm

采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台

  • 启动grafana服务
systemctl start grafana-server.service && systemctl enable grafana-server.service && systemctl status grafana-server.service
  • 查看grafana进程
netstat -lntp | grep grafana-serve
  • 访问Grafana网页,即访问http://192.168.200.61:3000

采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台

  • 修改密码

采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台

  • 登录访问Grafana网页

采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台

  • 添加data sources

采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台
采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台

  • 选择"Prometheus"

采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台

  • 添加URL

采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台

  • 保存测试,点击“Save&Test”提示绿色成功。

采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台

  • 配置grafana-node_exporter仪表版

采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台
采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台
采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台
采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台
采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台
采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台
采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台

6. 安装Altermanager监控告警

下载地址

Releases · prometheus/alertmanager (github.com)

Download | Prometheus

  • 安装Altermanager
# 下载
wget https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz

# 解压
tar xvf alertmanager-0.24.0.linux-amd64.tar.gz -C  /usr/local/

# 更名
cd /usr/local/ && mv alertmanager-0.24.0.linux-amd64  alertmanager && cd alertmanager/
  • 登录企业微信
  • 获取企业ID:ww9fxxxxxx03000
  • 获取部门ID:2
  • AgentId:1000003
  • Secret:8FZ_LnlwuFKNf6xxxxxxxxxxxxWwVPH8R3ExJvIs
  • 获取应用ID

采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台
采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台
采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台
采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台
采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台

以上步骤完成后,我们就得到了配置Alertmanager的所有信息,包括:企业ID,AgentId,Secret和接收告警的部门id

  • 创建wechat.tmpl文件
[root@m1 template]# cat /usr/local/alertmanager/template/wechat.tmpl
{{ define "wechat.default.message" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 -}}
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
=====================
{{- end }}
===告警详情===
告警详情: {{ $alert.Annotations.message }}
故障时间: {{ $alert.StartsAt.Format "2006-01-02 15:04:05" }}
===参考信息===
{{ if gt (len $alert.Labels.instance) 0 -}}故障实例ip: {{ $alert.Labels.instance }};{{- end -}}
{{- if gt (len $alert.Labels.namespace) 0 -}}故障实例所在namespace: {{ $alert.Labels.namespace }};{{- end -}}
{{- if gt (len $alert.Labels.node) 0 -}}故障物理机ip: {{ $alert.Labels.node }};{{- end -}}
{{- if gt (len $alert.Labels.pod_name) 0 -}}故障pod名称: {{ $alert.Labels.pod_name }}{{- end }}
=====================
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 -}}
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
=====================
{{- end }}
===告警详情===
告警详情: {{ $alert.Annotations.message }}
故障时间: {{ $alert.StartsAt.Format "2006-01-02 15:04:05" }}
恢复时间: {{ $alert.EndsAt.Format "2006-01-02 15:04:05" }}
===参考信息===
{{ if gt (len $alert.Labels.instance) 0 -}}故障实例ip: {{ $alert.Labels.instance }};{{- end -}}
{{- if gt (len $alert.Labels.namespace) 0 -}}故障实例所在namespace: {{ $alert.Labels.namespace }};{{- end -}}
{{- if gt (len $alert.Labels.node) 0 -}}故障物理机ip: {{ $alert.Labels.node }};{{- end -}}
{{- if gt (len $alert.Labels.pod_name) 0 -}}故障pod名称: {{ $alert.Labels.pod_name }};{{- end }}
=====================
{{- end }}
{{- end }}
{{- end }}
  • 编辑alertmanager.yml配置文件
global:
  resolve_timeout: 1m   									# 每1分钟检测一次是否恢复
  wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/' 	# 请勿修改!!!
  wechat_api_corp_id: '*************'      					# 企业微信中企业ID
  wechat_api_secret: '************************'     		# 企业微信中创建应用的Secret
templates:
  - '/usr/local/alertmanager/template/*.tmpl'
route:
  receiver: 'wechat'
  group_by: ['env','instance','type','group','job','alertname']
  group_wait: 10s       # 初次发送告警延时
  group_interval: 10s   # 距离第一次发送告警,等待多久再次发送告警
  repeat_interval: 1h   # 告警重发时间
#  receiver: 'email'
receivers:
- name: 'wechat'
  wechat_configs:
  - send_resolved: true
    message: '{{ template "wechat.default.message" . }}'
    to_party: '2'          # 企业微信中创建的接收告警的部门【K8S告警组】的部门ID
    agent_id: '1000003'    # 企业微信中创建的应用的ID
    api_secret: '************************************'    # 企业微信中创建应用的Secret
global:
  resolve_timeout: 1m                                                   # 每1分钟检测一次是否恢复
  wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'                # 请勿修改!!!
  wechat_api_corp_id: 'ww9ff288a7d3903000'                              # 企业微信中企业ID
  wechat_api_secret: '8FZ_LnlwuFKNf6yR8A8svWO0arYYrWwVPH8R3ExJvIs'      # 企业微信中创建应用的Secret
templates:
  - '/usr/local/alertmanager/template/*.tmpl'
route:
  receiver: 'wechat'
  group_by: ['env','instance','type','group','job','alertname']
  group_wait: 10s                  # 初次发送告警延时
  group_interval: 3m               # 距离第一次发送告警,等待多久再次发送告警
  repeat_interval: 3m              # 告警重发时间
#  receiver: 'email'
receivers:
- name: 'wechat'
  wechat_configs:
  - send_resolved: true    # 是否发出已解决消息
    to_user: '@all'        # 所有用户
    message: '{{ template "wechat.default.message" . }}'
    to_party: '2'          # 企业微信中创建的接收告警的部门【K8S告警组】的部门ID
    agent_id: '1000003'    # 企业微信中创建的应用的ID
    api_secret: '8FZ_LnlwuFKNf6yR8A8svWO0arYYrWwVPH8R3ExJvIs'    # 企业微信中创建应用的Secret
  • 创建alertmanager.service配置文件。
cat > /usr/lib/systemd/system/alertmanager.service << EOF
[Unit]
Description=alertmanager
Documentation=https://github.com/prometheus/alertmanager
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml --storage.path=/data/alertmanager
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF
  • 启动alertmanager.service
systemctl daemon-reload && systemctl start alertmanager.service && systemctl enable alertmanager.service
  • 修改prometheus.yml配置文件

采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台

  • 在prometheus/rules路径下创建node_status.yml
# 创建rules目录并进入
mkdir /usr/local/prometheus/rules &&  cd rules/  

# 创建node_status.yml配置文件
cat node_status.yml
groups:
- name: 实例存活告警规则
  rules:
  - alert: 实例存活告警
    expr: up{job="prometheus"} == 0 or up{job="K8S-Nodes"} == 0
    for: 1m
    labels:
      user: root
      severity: Disaster
    annotations:
      summary: "Instance {{ $labels.instance }} is down"
      description: "Instance {{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes."
      value: "{{ $value }}"

- name: 内存告警规则
  rules:
  - alert: "内存使用率告警"
    expr: (node_memory_MemTotal_bytes - (node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes )) / node_memory_MemTotal_bytes * 100 > 75
    for: 1m
    labels:
      user: root
      severity: warning
    annotations:
      summary: "服务器: {{$labels.alertname}} 内存报警"
      description: "{{ $labels.alertname }} 内存资源利用率大于75%!(当前值: {{ $value }}%)"
      value: "{{ $value }}"

- name: CPU报警规则
  rules:
  - alert: CPU使用率告警
    expr: 100 - (avg by (instance)(irate(node_cpu_seconds_total{mode="idle"}[1m]) )) * 100 > 70
    for: 1m
    labels:
      user: root
      severity: warning
    annotations:
      summary: "服务器: {{$labels.alertname}} CPU报警"
      description: "服务器: CPU使用超过70%!(当前值: {{ $value }}%)"
      value: "{{ $value }}"

- name: 磁盘报警规则
  rules:
  - alert: 磁盘使用率告警
    expr: (node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes * 100 > 80
    for: 1m
    labels:
      user: root
      severity: warning
    annotations:
      summary: "服务器: {{$labels.alertname}} 磁盘报警"
      description: "服务器:{{$labels.alertname}},磁盘设备: 使用超过80%!(挂载点: {{ $labels.mountpoint }} 当前值: {{ $value }}%)"
      value: "{{ $value }}"
  • 检验alertmanager.yml文件是否配置正确
./amtool check-config alertmanager.yml

输出结果

[root@m1 alertmanager]# pwd
/usr/local/alertmanager
[root@m1 alertmanager]# ./amtool check-config alertmanager.yml
Checking 'alertmanager.yml'  SUCCESS
Found:
 - global config
 - route
 - 0 inhibit rules
 - 1 receivers
 - 1 templates
  SUCCESS
  • 启动alertmanager服务
systemctl daemon-reload && systemctl start alertmanager && systemctl enable alertmanager && systemctl status alertmanager
  • 查看alertmanager服务进程是否启动
ps -ef | grep alertmanager
  • 重启prometheus服务
systemctl daemon-reload && systemctl restart prometheus && systemctl status prometheus
  • 访问http://192.168.200.61:9090/alerts ,可以查看相关规则信息。

采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台

至此,企业Prometheus对接企业微信告警部署完毕,出现故障时就能看到如下告警信息和恢复信息了。

此时,模拟其中一台主机宕机,查看配置的告警信息在企业微信中是否生效。

  • 查看到实例存活告警,发现其中一个主机宕机

采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台
采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台

  • 查看企业微信发出告警信息

采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台
采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台
采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台
采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台文章来源地址https://www.toymoban.com/news/detail-501354.html

到了这里,关于采用Prometheus+Grafana+Altermanager搭建部署K8S集群节点可视化监控告警平台的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • k8s集群监控cadvisor+prometheus+grafana部署

    目录 1.新建命名空间monitor 2.部署 2.1部署cadvisor 2.2部署node_exporter 2.3部署prometheus 2.4部署rbac权限 2.5.部署 metrics 2.6部署grafana 3.测试监控效果 参考文章: k8s集群部署cadvisor+node-exporter+prometheus+grafana监控系统 - cyh00001 - 博客园 准备工作: Cluster集群节点介绍: master:192.168.136.21(以

    2024年01月16日
    浏览(39)
  • 外独立部署Prometheus+Grafana+Alertmanager监控K8S

    用集群外的prometheus来监控k8s,主要是想把监控服务跟k8s集群隔离开,这样就能减少k8s资源的开销。 CentOS Linux release 7.7.1908 (Core)  3.10.0-1062.el7.x86_64  Docker version 20.10.21 主机名 IP 备注 prometheus-server.test.cn 192.168.10.166 k8s集群 192.168.10.160:6443 集群master-vip 需要通过exporter收集各种维

    2024年02月08日
    浏览(33)
  • k8s入门:kube-prometheus-stack 全家桶搭建(Grafana + Prometheus)

    系列文章 第一章:✨ k8s入门:裸机部署 k8s 集群 第二章:✨ k8s入门:部署应用到 k8s 集群 第三章:✨ k8s入门:service 简单使用 第四章:✨ k8s入门:StatefulSet 简单使用 第五章:✨ k8s入门:存储(storage) 第六章:✨ K8S 配置 storageclass 使用 nfs 动态申领本地磁盘空间 第七章:

    2024年02月08日
    浏览(46)
  • K8s部署Prometheus+grafana+alertmanager报警监控系统(持续更新)

    自行准备一套k8s集群,如果不知道怎么搭建,可以参考一下我之前的博客 https://blog.csdn.net/qq_46902467/article/details/126660847 我的k8s集群地址是: k8s-master1 10.0.0.10 k8s-node1 10.0.0.11 k8s-node2 10.0.0.12 一、安装nfs服务 二、安装nfs客户端 三、部署Prometheus 四、部署grafana 五、部署alertmanage

    2023年04月24日
    浏览(35)
  • 基于k8s容器化部署Prometheus和Grafana可视化监控数据

    提示:需要提前部署k8s集群(master、node01、node02 .. ) 目录 1.部署kube-state-metrics 2.部署node-export 3.部署nfs-pv 4.部署alertmanager  4.1 vim alertmanager-configmap.yml 4.2 vim alertmanager-deployment.yml   4.3 vim alertmanager-pvc.yml  4.4 vim alertmanager-service.yml 5.部署promethus-server 6.部署grafana 6.1.配置grafa

    2024年04月11日
    浏览(41)
  • Online Boutique在k8s中部署,启用istio,配置Kiali、Jaeger、Prometheus、Grafana

    实验内容主要包括: (1)安装kubernetes集群环境,并安装部署dashboard,以可视化方式管理集群中的pod、service、delpoyment。 (2)将基于微服务架构的Online Boutique应用部署在上述kubernetes环境中。 (3)针对Online Boutique在熔断、限流、监控、认证、授权、安全、负载等方面的不足,

    2024年02月03日
    浏览(31)
  • 使用大卫的k8s监控面板(k8s+prometheus+grafana)

    书接上回,对EKS(AWS云k8s)启用AMP(AWS云Prometheus)监控+AMG(AWS云 grafana),上次我们只是配通了EKS+AMP+AMG的监控路径。这次使用一位大卫老师的grafana的面板,具体地址如下: https://grafana.com/grafana/dashboards/15757-kubernetes-views-global/ 为了想Prometheus暴露一些有用的性能指标,需要在

    2024年04月23日
    浏览(31)
  • Kubernetes(k8s)上安装Prometheus和Grafana监控

    当然前提环境是你得先有一个Kubernetes集群,版本在v1.21.*~v1.27.*之间,当然我已经准备好了Kubernetes: 可以看到我准备的Kubernetes版本为1.21.14的,符合要求。本篇文章也以这个版本来进行安装,上面提到的版本安装步骤和这个版本大体相同,按照步骤来即可。 因为在Kubernetes上安

    2024年02月10日
    浏览(39)
  • 【Minikube & Prometheus】基于Prometheus & Grafana监控由Minikube创建的K8S集群

    通过运行以下命令来检查状态 由于使用的是 Minikube,第二个命令 prometheus-server 使用 NodePort . 这样,当 Pod 准备就绪时,就可以轻松访问 Prometheus Web 界面: http://192.168.20.20:30944/targets 由于使用的是 Minikube,为了轻松访问 Grafana 的 Web 界面,将该服务公开为 NodePort 。 注意: Gr

    2024年02月03日
    浏览(51)
  • Prometheus+Grafana(外)监控Kubernetes(K8s)集群(基于containerd)

    1、k8s环境 版本 v1.26.5 二进制安装Kubernetes(K8s)集群(基于containerd)—从零安装教程(带证书) 主机名 IP 系统版本 安装服务 master01 10.10.10.21 rhel7.5 nginx、etcd、api-server、scheduler、controller-manager、kubelet、proxy master02 10.10.10.22 rhel7.5 nginx、etcd、api-server、scheduler、controller-manager、kubel

    2024年02月16日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包