从零搭建容器化监控体系:Docker+K8s+Prometheus全栈实践

一、容器化基础设施搭建

1.1 Kubernetes集群高可用部署

容器化监控体系的基础是稳定运行的K8s集群。推荐采用三节点控制平面架构,通过Keepalived+HAProxy实现API Server的高可用负载均衡。具体步骤如下:

  • 节点初始化配置:禁用Swap分区,配置内核参数net.bridge.bridge-nf-call-iptables=1
  • 容器运行时选择:对比Containerd与CRI-O特性,推荐使用Containerd 1.6+版本
  • 证书管理方案:采用cfssl工具生成集群证书,设置合理的证书有效期(建议2年)
  • 节点加入流程:通过kubeadm join命令动态扩展工作节点,支持滚动升级

典型配置示例:

  1. # kubeadm-config.yaml
  2. apiVersion: kubeadm.k8s.io/v1beta3
  3. controlPlaneEndpoint: "api.k8s.local:6443"
  4. etcd:
  5. local:
  6. imageRepository: registry.k8s.io
  7. imageTag: v3.5.4-0
  8. networking:
  9. podSubnet: 10.244.0.0/16
  10. serviceSubnet: 10.96.0.0/12

1.2 核心资源调度机制

掌握Pod调度原理是优化集群性能的关键:

  • 调度策略:默认使用DefaultScheduler,可通过scheduler-framework扩展自定义策略
  • 亲和性配置
    1. affinity:
    2. nodeAffinity:
    3. requiredDuringSchedulingIgnoredDuringExecution:
    4. nodeSelectorTerms:
    5. - matchExpressions:
    6. - key: disktype
    7. operator: In
    8. values: ["ssd"]
    9. podAntiAffinity:
    10. preferredDuringSchedulingIgnoredDuringExecution:
    11. - weight: 100
    12. podAffinityTerm:
    13. labelSelector:
    14. matchExpressions:
    15. - key: app
    16. operator: In
    17. values: ["nginx"]
  • 拓扑感知:通过topologySpreadConstraints实现跨故障域分布

二、服务暴露与流量管理

2.1 Service与Ingress实践

  • Service类型选择
    • ClusterIP:内部服务通信(默认)
    • NodePort:开发测试环境快速暴露
    • LoadBalancer:云环境集成(需底层支持)
  • Ingress高级配置
    1. apiVersion: networking.k8s.io/v1
    2. kind: Ingress
    3. metadata:
    4. annotations:
    5. nginx.ingress.kubernetes.io/rewrite-target: /
    6. spec:
    7. rules:
    8. - host: app.example.com
    9. http:
    10. paths:
    11. - path: /api
    12. pathType: Prefix
    13. backend:
    14. service:
    15. name: backend-service
    16. port:
    17. number: 8080

2.2 Kube-Proxy模式对比

模式 优势 适用场景
iptables 稳定可靠 小规模集群
IPVS 高性能(O(1)复杂度) 千节点以上大规模集群
userspace 兼容旧版本 特殊调试场景

三、数据持久化方案

3.1 存储卷类型选择

  • 临时存储:emptyDir(适合无状态应用缓存)
  • 持久存储
    • hostPath:单节点开发测试
    • 本地卷:高性能场景(需手动管理)
    • 网络存储:CSI驱动集成(推荐生产环境使用)

3.2 StorageClass动态供给

  1. apiVersion: storage.k8s.io/v1
  2. kind: StorageClass
  3. metadata:
  4. name: fast-ssd
  5. provisioner: kubernetes.io/aws-ebs
  6. parameters:
  7. type: gp3
  8. fsType: ext4
  9. reclaimPolicy: Delete

四、Prometheus监控体系搭建

4.1 监控组件架构

  1. [Exporters] [Prometheus Server] [AlertManager]
  2. [Grafana Dashboard]

4.2 核心组件配置

Prometheus配置示例

  1. global:
  2. scrape_interval: 15s
  3. evaluation_interval: 15s
  4. scrape_configs:
  5. - job_name: 'kubernetes-nodes'
  6. static_configs:
  7. - targets: ['10.0.0.1:9100', '10.0.0.2:9100']
  8. - job_name: 'kubernetes-pods'
  9. kubernetes_sd_configs:
  10. - role: pod
  11. relabel_configs:
  12. - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
  13. action: keep
  14. regex: true

告警规则示例

  1. groups:
  2. - name: node-alert
  3. rules:
  4. - alert: NodeCPUUsage
  5. expr: (100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)) > 80
  6. for: 5m
  7. labels:
  8. severity: warning
  9. annotations:
  10. summary: "CPU使用率过高 {{ $labels.instance }}"
  11. description: "当前值: {{ $value }}%"

4.3 主流组件监控集成

组件 监控方式 关键指标
MySQL mysqld_exporter QPS、连接数、慢查询
Redis redis_exporter 命中率、内存使用、键数量
Nginx nginx-module-vts + exporter 请求速率、状态码分布
Java应用 JMX Exporter JVM内存、GC次数、线程数

五、生产环境优化建议

  1. 监控数据存储:配置远程存储(如对象存储)实现长期保留
  2. 高可用部署:采用Thanos或Cortex方案实现全局视图
  3. 告警收敛策略:设置合理的group_waitgroup_interval
  4. 安全加固:启用TLS加密和RBAC权限控制
  5. 资源控制:为Prometheus Pod设置合理的requests/limits

常见问题解答

Q1:如何选择监控数据保留周期?
A:短期数据(7-30天)存储在本地,长期数据(1年以上)归档到对象存储,通过--storage.tsdb.retention.time参数配置

Q2:多集群监控方案如何选择?
A:中小规模推荐使用Prometheus Federation,大规模建议采用Thanos或Cortex架构

Q3:如何降低监控系统资源消耗?
A:优化采集间隔(建议15-60s),使用recording rules预计算常用指标,合理设置--web.max-connections参数

本实践方案经过多个生产环境验证,完整代码和配置模板可在配套资源包中获取。建议读者在测试环境先行验证,再逐步迁移到生产环境。