阶段六:Prometheus+Grafana监控系统进阶(K8s)

K8s 可观测性

可观测性(Observability) 是指系统内部状态能否从外部数据推断出来,核心观测目标

1. 监控 Metrics(指标) → 系统性能、资源利用率 2. 日志(Logs) → 系统事件、错误排查 3. 追踪(Tracing) → 分布式调用链、性能瓶颈 4. 拓扑 / 依赖关系 → 服务间调用关系

Kubernetes 环境是动态、分布式且高度复杂的,这带来了独特的挑战

Kubernetes 可观测性核心对象

<sheet sheet-id="tPPHwf" token="Jb02sok7Gh06XWtQdxbcPUN7nje"></sheet>

可观测性工具

(1) Metrics(指标)

(2) Logs(日志)

(3) Tracing(调用链)

(4) 可视化与告警

kube-prometheus-stack

简介

kube-prometheus-stackPrometheus Operator 官方提供的 Helm Chart

主要目的是 快速在 Kubernetes 集群中部署完整的监控解决方案

核心组件包括:

<sheet sheet-id="jSWBfC" token="Jb02sok7Gh06XWtQdxbcPUN7nje"></sheet>

可观测性实现原理

安装kube-prometheus-stack

#添加官方helm仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

#拉取安装包
helm pull prometheus-community/kube-prometheus-stack --version v76.4.1

注意事项:

[root@master ~]# tar -xv -f kube-prometheus-stack-76.4.0.tgz
[root@master ~]# cd kube-prometheus-stack
#Prometheus持久化配置
[root@master ~]# vim values.yaml
4329     storageSpec:
4330     ## Using PersistentVolumeClaim
4331     ##
4332       volumeClaimTemplate:
4333         spec:
4334           storageClassName: nfs-storage
4335           accessModes: ["ReadWriteOnce"]
4336           resources:
4337             requests:
4338               storage: 5Gi

#创建监控命名空间
[root@master ~]# kubectl create ns monitor
[root@master ~]# cd ../
[root@master ~]# helm install prometheus-monitor ./kube-prometheus-stack \
  --set prometheus.prometheusSpec.retention="90d" \
  --set grafana.adminPassword="admin123" \
  --set grafana.ingress.enabled=true \
  --set grafana.ingress.hosts[0]="grafana.lanqicheng.top" \
  --set grafana.ingress.ingressClassName="nginx" \
  --set prometheus.ingress.enabled=true \
  --set prometheus.ingress.hosts[0]="prometheus.lanqicheng.top" \
  --set prometheus.ingress.ingressClassName="nginx" -n monitor

注意事项:

Prometheus 告警规则

Prometheus 告警规则(Alerting Rule)是一组 YAML 定义,告诉 Prometheus:

groups:
- name: example.rules  # 规则组的名字
  interval: 30s        # 评估周期,多久计算一次表达式
  rules:
  - alert: HighCPUUsage
    expr: rate(container_cpu_usage_seconds_total{image!=""}[5m]) > 0.8
    for: 2m
    labels:
      severity: warning
      team: ops
    annotations:
      summary: "Pod CPU 使用率过高"
      description: "Pod {{ $labels.pod }} 在过去5分钟内 CPU 使用率大于 80%"

注意事项:

# 查看告警规则
[root@master ~]# kubectl get prometheusrule -n monitor

# 查看规则详情
[root@master ~]# kubectl describe prometheusrule prometheus-monitor-kube-pr-kubernetes-resources  -n monitor

# 直接获取 YAML 查看所有规则细节
[root@master ~]# kubectl get  prometheusrule prometheus-monitor-kube-pr-kubernetes-resources   -n monitor -o yaml

注意事项:

2.1.5 核心组件监听地址修改

kubectl edit configmap kube-proxy -n kube-system
 kind: KubeProxyConfiguration
    logging:
      flushFrequency: 0
      options:
        json:
          infoBufferSize: "0"
        text:
          infoBufferSize: "0"
      verbosity: 0
    metricsBindAddress: "0.0.0.0"   #修改监听地址成0.0.0.0
    mode: ""
    nftables:
      masqueradeAll: false
      masqueradeBit: null
      minSyncPeriod: 0s
      syncPeriod: 0s

注意事项:

vim /etc/kubernetes/manifests/kube-controller-manager.yaml
- command:
    - kube-controller-manager
    - --allocate-node-cidrs=true
    - --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
    - --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
    - --bind-address=192.168.50.209    #修改成当前服务器节点IP地址
    - --client-ca-file=/etc/kubernetes/pki/ca.crt
    - --cluster-cidr=10.244.0.0/16
    - --cluster-name=kubernetes
    - --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt
    - --cluster-signing-key-file=/etc/kubernetes/pki/ca.key
    - --controllers=*,bootstrapsigner,tokencleaner
    - --kubeconfig=/etc/kubernetes/controller-manager.conf
    - --leader-elect=true
    - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
    - --root-ca-file=/etc/kubernetes/pki/ca.crt
    - --service-account-private-key-file=/etc/kubernetes/pki/sa.key
    - --service-cluster-ip-range=10.96.0.0/12
    - --use-service-account-credentials=true

注意事项:

vim /etc/kubernetes/manifests/kube-scheduler.yaml
- command:
    - kube-scheduler
    - --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
    - --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
    - --bind-address=192.168.50.209   #修改成当前服务器节点IP地址
    - --kubeconfig=/etc/kubernetes/scheduler.conf
    - --leader-elect=true

注意事项:

CloudAlert 睿象云

睿象云集成 Prometheus

image
image
image

配置 AlertManager 路由

[root@master ~]# cd kube-prometheus-stack
[root@master ~]# vi values.yaml
...

 534     route:
 535       group_by: ['namespace', 'alertname']
 536       group_wait: 30s
 537       group_interval: 5m
 538       repeat_interval: 1h
 539       receiver: 'team-X-pager'    # 默认指向睿象云接收器
 540       routes:
 541       - receiver: 'null'          # 静默某些不需要的告警
 542         matchers:
 543           - alertname = "Watchdog"
               - team = "ops"
 544     receivers:
 545     - name: 'null'
 546     - name: 'team-X-pager'
 547       webhook_configs:
 548         - url: 'http://api.aiops.com/alert/api/event/prometheus/02ecba4aec434a7985c3bca0fcd4754c'
 549           send_resolved: true

...

注意事项:

[root@master ~]# cd  ../
[root@master ~]# helm upgrade prometheus-monitor ./kube-prometheus-stack \
  --set prometheus.prometheusSpec.retention="90d" \
  --set grafana.adminPassword="admin123" \
  --set grafana.ingress.enabled=true \
  --set grafana.ingress.hosts[0]="grafana.lanqicheng.top" \
  --set grafana.ingress.ingressClassName="nginx" \
  --set prometheus.ingress.enabled=true \
  --set prometheus.ingress.hosts[0]="prometheus.lanqicheng.top" \
  --set prometheus.ingress.ingressClassName="nginx" -n monitor

执行结果:

关键参数:

注意事项:



[client]
host=mysql
port=3306
user=exporter
password=123456

metadata: labels: spec: selector: matchLabels: template: metadata: labels: spec: containers: args: ports: volumeMounts: volumes: secret:

metadata: labels: spec: selector: ports:


**注意事项:**



metadata:
  labels:
spec:
  selector:
    matchLabels:
  namespaceSelector:
    matchNames:     
  endpoints:

注意事项:

metadata: labels: spec: groups: rules: labels: annotations:

labels: annotations:

labels: annotations:

labels: annotations:

labels: annotations:

labels: annotations:

labels: annotations:

labels: annotations:

labels: annotations:

labels: annotations:


**注意事项:**


metadata: labels: spec: selector: matchLabels: template: metadata: labels: spec: containers: ports: metadata: labels: spec: ports: selector:


**注意事项:**



metadata:
  labels:
spec:
  selector:
    matchLabels:
  namespaceSelector:
    matchNames:     
  endpoints:

注意事项:

metadata: labels: spec: groups: rules:

labels: annotations:

expr: | / labels: annotations:

expr: | / labels: annotations:

labels: annotations:

labels: annotations:

labels: annotations:

labels: annotations:

labels: annotations:

labels: annotations:

labels: annotations:

labels: annotations:

labels: annotations:

labels: annotations:


**注意事项:**





主要分成两类:
例如:
![](/assets/feishu-images/f997450d5c9e4f4d96c66915.png)


#创建一个目录进行镜像的构建,把下载的jar放到创建目录


############################################
############################################
whitelistObjectNames:

rules:


############################################
############################################


############################################
############################################

############################################
############################################

############################################
############################################


#构建镜像

#推送镜像到仓库

#更新zzy-admin服务

关键参数:

参数说明
-p核心递归创建目录;父目录不存在时一并创建,目录已经存在也不报错。
config.yaml普通配置文件路径,命令会读取这个文件里的配置。
-t普通为构建结果设置镜像名称和标签,值为 harbor.lanqicheng.top/zzyl/zzyl-admin:jvm-exporter
harbor.lanqicheng.top/zzyl/zzyl-admin:jvm-exporter普通harbor.lanqicheng.top/zzyl/zzyl-admin:jvm-exporter 是 Docker build 的目标或参数;它决定当前动作实际处理的镜像、容器、网络、数据卷或 Compose 服务。
.普通Docker 构建上下文,表示当前目录;Dockerfile 中需要的文件必须位于这个目录及其子目录内。
-n普通指定 Kubernetes 命名空间 zzyl,命令只在该命名空间内查找或修改资源。

注意事项:

metadata: labels: spec: ports: selector:


**注意事项:**



metadata:
  labels:
spec:
  selector:
    matchLabels:
  namespaceSelector:
    matchNames:     
  endpoints:

#创建      

#查看

注意事项: