【无标题】

1. 实验目标

基于 Kubernetes 搭建一个简单电商系统,实现:

  • 前后端业务容器化部署

  • MariaDB 数据存储

  • Prometheus 业务监控

  • kube-state-metrics Kubernetes状态监控

  • Alertmanager 告警管理

  • Prometheus异常检测

  • Kubernetes Pod自动恢复

整体架构:

                    用户浏览器
                         |
                         |
              http://192.168.116.169:31080
                         |
                         ↓
              ecommerce-frontend
                    (node1)
                         |
                         ↓
              ecommerce-backend
                    (node1)
                         |
                         ↓
          MariaDB 10.6.19
       192.168.116.169:3306
                         |
                         ↓
              /metrics (业务指标)
                         |
                         ↓
              Prometheus
            master:30090
                         |
                         ↓
             Alertmanager
            master:30093
                         |
                         ↓
          告警展示 / 自动恢复

2. 实验环境

2.1 Kubernetes集群

节点IP用途
master192.168.116.168K8s控制节点、Prometheus、Alertmanager
node1192.168.116.169电商业务节点 + MariaDB数据库
node2192.168.116.170原有IoT业务节点

2.2 版本信息

Kubernetes: v1.20.15
Docker: 20.10.24
操作系统: CentOS 7.9
Prometheus: v2.45.0
Alertmanager: v0.26.0
MariaDB: 10.6.19

2.3 数据库说明

MariaDB 是独立部署在 node1 上的物理服务,IP:192.168.116.169:3306,不是 K8s 中的 Pod。验证连接:


3. 服务端口规划

多项目共用一个 K8s 集群时,NodePort 是稀缺资源,必须提前分配避免冲突。

3.1 端口分配表

组件运行位置访问方式端口说明
电商前端node1NodePort31080用户访问商城页面
电商后端node1ClusterIP5000前端调用后端接口
MariaDBnode1物理机物理端口3306存储商品、订单数据
PrometheusmasterNodePort30090监控页面
AlertmanagermasterNodePort30093告警管理页面
kube-state-metricskube-systemClusterIP8080K8s状态指标

3.2 访问入口汇总

用途地址
电商商城页面http://192.168.116.169:31080
Prometheus监控面板http://192.168.116.168:30090
Alertmanager告警管理http://192.168.116.168:30093
后端Metrics指标http://ecommerce-backend:5000/metrics(集群内部)
MariaDB数据库192.168.116.169:3306

3.3 端口设计思路

  • 31080:电商前端 NodePort,用户通过浏览器访问

  • 30090:Prometheus NodePort,用于查看监控数据和告警状态

  • 30093:Alertmanager NodePort,用于查看告警接收情况

  • 5000:后端 ClusterIP,仅集群内部访问,不对外暴露

后端服务只需要被前端 Pod 调用,不需要外部直接访问。使用 ClusterIP 更安全,也节省 NodePort 资源。


4. 项目目录说明

4.1 目录结构


4.2 目录作用说明

目录/文件作用
backend/Flask后端代码 + Dockerfile
frontend/前端静态页面 + Nginx镜像
k8s/电商业务的 Deployment + Service
manifests/监控组件(Prometheus、Alertmanager等)
*.tar监控组件镜像(直接放在 ecommerce 根目录)

5. 部署电商业务

5.1 后端镜像

查看已构建的镜像:


5.2 部署业务

在 master 执行:


5.3 查看 Service
访问前端页面:



6. 部署 kube-state-metrics

6.1 为什么需要 kube-state-metrics?

kube-state-metrics 将 Kubernetes 对象状态(Pod、Deployment、Node)转换为 Prometheus 可读取指标。没有它,Prometheus 只能看到容器资源使用情况,无法感知 Pod 是否 Crash、Deployment 副本数是否正常。

核心指标示例

  • kube_pod_status_phase{pod="xxx", phase="Running"} → 1

  • kube_deployment_status_replicas{deployment="xxx"} → 期望副本数

6.2 部署

kubectl apply -f /root/ecommerce/manifests/kube-state-metrics.yaml

6.3 验证



7. 部署 Prometheus

7.1 文件说明

文件作用
prometheus-deployment.yaml部署 Prometheus 容器
prometheus-service.yaml暴露 9090 端口(NodePort: 30090)
prometheus-config.yaml配置采集目标和 scrape 规则
prometheus-rules.yaml告警规则定义

7.3 验证


访问 Prometheus UI:


8. 添加业务监控指标

8.1 业务指标说明

后端 Flask 应用提供 /metrics 端点,暴露以下指标:

指标名类型说明
ecommerce_orders_totalCounter累计订单数
ecommerce_checkout_queue_lengthGauge当前队列长度

访问 Prometheus Targets 页面:

状态显示 UP 表示采集成功。


9. 配置告警规则

9.1 告警规则设计思路

prometheus-rules.yaml 定义异常条件:

yaml

- alert: EcommerceCheckoutQueueHigh
  expr: ecommerce_checkout_queue_length > 10
  for: 30s
  labels:
    severity: warning
  annotations:
    summary: "订单队列积压超过10"

设计逻辑

  • expr:触发条件,队列长度 > 10

  • for:持续 30s,避免瞬时抖动误报

  • severity:严重程度分级

9.2 查看规则

10. 部署 Alertmanager

10.1 文件说明

文件作用
alertmanager-config.yaml配置接收方式和路由规则
alertmanager-deployment.yaml部署 Alertmanager 容器
alertmanager-service.yaml暴露 9093 端口(NodePort: 30093)

10.2 部署

kubectl apply -f alertmanager-config.yaml
kubectl apply -f alertmanager-deployment.yaml
kubectl apply -f alertmanager-service.yaml

10.3 验证


访问 Alertmanager UI:


11. 模拟业务异常

11.1 进入后端 Pod

kubectl exec -it $(kubectl get pod -l app=ecommerce-backend -o name) -- sh

11.2 模拟队列积压

后端提供了专门的测试接口 /api/test/queue

python -c "
import urllib.request

req = urllib.request.Request(
    'http://localhost:5000/api/test/queue',
    method='POST'
)

print(
    urllib.request.urlopen(req)
    .read()
    .decode()
)
"

多次调用后,队列长度指标上升。

11.3 观察指标变化

在 Prometheus 查询:

ecommerce_checkout_queue_length


12. 查看告警触发

12.1 Prometheus 告警状态

访问 Prometheus Alerts 页面:

邮件警告:

状态变化链路:

  • Inactive(正常)→ Pending(30s等待)→ Firing(触发)

12.2 Alertmanager 查看告警

访问 Alertmanager UI:



【截图12】Alertmanager 告警列表

显示 EcommerceCheckoutQueueHigh 告警已接收。

说明:Alertmanager 完成告警接收和展示验证。邮件通知功能因 QQ SMTP TLS 配置兼容性问题未继续展开,不影响核心监控链路验证。


13. Kubernetes 自动恢复验证

13.1 为什么 K8s 能自动恢复?

Deployment 控制器保证 replicas 副本数。当 Pod 被删除时,ReplicaSet 控制器检测到实际副本数少于期望值,自动创建新 Pod。

13.2 手动删除 Pod

kubectl delete pod -l app=ecommerce-backend

13.3 观察自动恢复

kubectl get pods -w


14. 实验总结

14.1 完整链路
text用户访问 → 电商业务 → 业务指标采集 → Prometheus监控 → Alertmanager告警 → Kubernetes自动恢复

14.2 掌握技能

  • Kubernetes 业务部署(Deployment/Service)

  • 自定义业务指标暴露(Prometheus Client)

  • Prometheus 监控配置(Targets/Rules)

  • Alertmanager 告警管理

  • Kubernetes 自愈机制(ReplicaSet 自动恢复)

14.3 核心设计思路总结

组件设计思路
端口规划多项目共存时提前分配端口,避免冲突
kube-state-metrics将 K8s 对象状态转换为 Prometheus 指标
告警规则持续30s异常才触发,防止误报
自动恢复Deployment 控制器的 ReplicaSet 机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值