|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
引言
Kubernetes作为容器编排的事实标准,已经成为了现代云原生应用部署和管理的核心平台。然而,随着集群规模的增长和应用复杂度的提升,有效监控Kubernetes集群及其上运行的应用变得至关重要。监控不仅可以帮助我们及时发现和解决问题,还能为容量规划、性能优化和资源分配提供数据支持。
在Kubernetes生态系统中,有众多监控工具可供选择,从基础的资源使用情况收集到复杂的应用性能监控,从简单的指标展示到高级的告警和自动化处理。本文将全面解析Kubernetes资源监控工具,重点关注Prometheus和Grafana这一黄金组合,同时也会介绍其他重要的监控工具,帮助您构建完整的监控体系,高效管理集群性能,实时掌握资源使用情况。
Kubernetes监控基础
在深入探讨具体工具之前,我们需要了解Kubernetes监控的基础知识和关键指标。
监控的关键指标
Kubernetes监控主要关注以下几个方面的指标:
1. 资源使用指标:CPU使用率内存使用量磁盘I/O网络I/O
2. CPU使用率
3. 内存使用量
4. 磁盘I/O
5. 网络I/O
6. 集群组件指标:API服务器性能etcd性能调度器性能控制器管理器性能
7. API服务器性能
8. etcd性能
9. 调度器性能
10. 控制器管理器性能
11. Pod和容器指标:容器重启次数Pod状态资源请求和限制OOM(Out of Memory)事件
12. 容器重启次数
13. Pod状态
14. 资源请求和限制
15. OOM(Out of Memory)事件
16. 应用性能指标:响应时间错误率吞吐量自定义业务指标
17. 响应时间
18. 错误率
19. 吞吐量
20. 自定义业务指标
资源使用指标:
• CPU使用率
• 内存使用量
• 磁盘I/O
• 网络I/O
集群组件指标:
• API服务器性能
• etcd性能
• 调度器性能
• 控制器管理器性能
Pod和容器指标:
• 容器重启次数
• Pod状态
• 资源请求和限制
• OOM(Out of Memory)事件
应用性能指标:
• 响应时间
• 错误率
• 吞吐量
• 自定义业务指标
监控架构模式
在Kubernetes中,常见的监控架构模式包括:
1. 拉取模式(Pull-based):监控系统主动从目标端点拉取指标数据,Prometheus就是这种模式的代表。
2. 推送模式(Push-based):应用程序主动将指标数据推送到监控系统,如StatsD。
3. 代理模式:在每个节点上部署代理,收集本地指标并转发到中央监控系统,如Node Exporter。
Kubernetes监控挑战
Kubernetes环境下的监控面临一些特殊挑战:
1. 动态性:Pod和容器频繁创建和销毁,传统静态配置的监控方式难以适应。
2. 大规模:集群可能包含成百上千个节点和数万个容器,监控系统需要具备良好的扩展性。
3. 多层次:从基础设施到应用程序,需要监控多个层次,每个层次都有其特定的指标和工具。
4. 异构性:集群中可能运行多种类型的应用,使用不同的技术栈,需要统一的监控方案。
Prometheus详解
Prometheus是CNCF(Cloud Native Computing Foundation)的毕业项目,已成为Kubernetes监控的事实标准。它是一个开源的监控和告警系统,专门为云原生环境设计。
Prometheus架构
Prometheus的架构主要由以下组件组成:
1. Prometheus Server:核心组件,负责抓取和存储时间序列数据。
2. Exporters:用于暴露现有应用程序的指标,使其可以被Prometheus抓取。
3. Pushgateway:用于短期作业的指标推送。
4. Alertmanager:处理告警,包括分组、抑制和路由。
5. 客户端库:用于在应用程序中集成指标。
核心概念
了解Prometheus的核心概念对于有效使用它至关重要:
1. 指标(Metrics):Prometheus中的指标是时间序列数据,由指标名称和标签组成。http_requests_total{method="POST", endpoint="/api"}
2. 标签(Labels):键值对,用于区分同一指标的不同特征。cpu_usage{instance="node-1", job="kubernetes-node-exporter"}
3. 时间序列(Time Series):指标名称和标签的组合唯一标识一个时间序列。
4. 抓取(Scraping):Prometheus定期从配置的目标端点拉取指标数据。
5. PromQL:Prometheus的查询语言,用于选择和聚合时间序列数据。
指标(Metrics):Prometheus中的指标是时间序列数据,由指标名称和标签组成。
- http_requests_total{method="POST", endpoint="/api"}
复制代码
标签(Labels):键值对,用于区分同一指标的不同特征。
- cpu_usage{instance="node-1", job="kubernetes-node-exporter"}
复制代码
时间序列(Time Series):指标名称和标签的组合唯一标识一个时间序列。
抓取(Scraping):Prometheus定期从配置的目标端点拉取指标数据。
PromQL:Prometheus的查询语言,用于选择和聚合时间序列数据。
在Kubernetes中部署Prometheus
有多种方式可以在Kubernetes中部署Prometheus,包括使用Helm chart、Operator或手动部署YAML文件。下面我们使用Prometheus Operator进行部署,这是一种更便捷且功能更强大的方式。
首先,我们需要安装Prometheus Operator:
- kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/master/bundle.yaml
复制代码
接下来,创建一个Prometheus实例:
- apiVersion: monitoring.coreos.com/v1
- kind: Prometheus
- metadata:
- name: prometheus
- namespace: monitoring
- spec:
- serviceAccountName: prometheus
- serviceMonitorSelector: {}
- resources:
- requests:
- memory: 400Mi
- enableAdminAPI: false
复制代码
保存为prometheus.yaml并应用:
- kubectl apply -f prometheus.yaml
复制代码
ServiceMonitor是Prometheus Operator的自定义资源,用于定义如何监控一组服务:
- apiVersion: monitoring.coreos.com/v1
- kind: ServiceMonitor
- metadata:
- name: kube-apiserver
- namespace: monitoring
- labels:
- k8s-app: apiserver
- spec:
- selector:
- matchLabels:
- component: apiserver
- provider: kubernetes
- namespaceSelector:
- matchNames:
- - default
- endpoints:
- - port: https
- interval: 30s
- scheme: https
- tlsConfig:
- caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
- serverName: kubernetes
- insecureSkipVerify: false
- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
复制代码
保存为apiserver-servicemonitor.yaml并应用:
- kubectl apply -f apiserver-servicemonitor.yaml
复制代码
Prometheus配置
Prometheus的主要配置文件是prometheus.yml,它定义了抓取目标、规则和告警设置。以下是一个基本配置示例:
- global:
- scrape_interval: 15s
- evaluation_interval: 15s
- rule_files:
- - "rules/*.yml"
- 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
复制代码
PromQL查询示例
Prometheus的强大之处在于其灵活的查询语言PromQL。以下是一些常用的PromQL查询示例:
1. CPU使用率:100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
2. 内存使用率:(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100
3. Pod CPU使用率:sum(rate(container_cpu_usage_seconds_total{image!="", container!="POD"}[5m])) by (pod, namespace)
4. Pod内存使用量:sum(container_memory_working_set_bytes{image!="", container!="POD"}) by (pod, namespace)
5. 节点磁盘使用率:100 - ((node_filesystem_avail_bytes{mountpoint="/"} * 100) / node_filesystem_size_bytes{mountpoint="/"})
CPU使用率:
- 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
复制代码
内存使用率:
- (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100
复制代码
Pod CPU使用率:
- sum(rate(container_cpu_usage_seconds_total{image!="", container!="POD"}[5m])) by (pod, namespace)
复制代码
Pod内存使用量:
- sum(container_memory_working_set_bytes{image!="", container!="POD"}) by (pod, namespace)
复制代码
节点磁盘使用率:
- 100 - ((node_filesystem_avail_bytes{mountpoint="/"} * 100) / node_filesystem_size_bytes{mountpoint="/"})
复制代码
告警规则配置
Prometheus支持配置告警规则,当满足特定条件时触发告警。以下是一些常见的告警规则示例:
- groups:
- - name: kubernetes-apps
- rules:
- - alert: PodCrashLooping
- expr: rate(kube_pod_container_status_restarts_total[15m]) * 60 * 5 > 0
- for: 15m
- labels:
- severity: critical
- annotations:
- summary: "Pod is crash looping ({{ $labels.pod }})"
- description: "Pod {{ $labels.pod }} ({{ $labels.namespace }}) is in crash loop back-off state."
- - alert: PodNotReady
- expr: sum by (namespace, pod) (kube_pod_status_phase{phase=~"Pending|Unknown"}) > 0
- for: 15m
- labels:
- severity: critical
- annotations:
- summary: "Pod is not ready ({{ $labels.pod }})"
- description: "Pod {{ $labels.pod }} ({{ $labels.namespace }}) is not ready."
- - name: kubernetes-resources
- rules:
- - alert: NodeCPUUsage
- expr: (100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)) > 80
- for: 15m
- labels:
- severity: warning
- annotations:
- summary: "Node CPU usage is high (instance {{ $labels.instance }})"
- description: "Node CPU usage is above 80% (current value: {{ $value }})"
- - alert: NodeMemoryUsage
- expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 80
- for: 15m
- labels:
- severity: warning
- annotations:
- summary: "Node memory usage is high (instance {{ $labels.instance }})"
- description: "Node memory usage is above 80% (current value: {{ $value }})"
复制代码
其他监控工具介绍
除了Prometheus,Kubernetes生态系统中还有其他重要的监控工具,它们各自有特定的用途和优势。
Metrics Server
Metrics Server是Kubernetes内置的资源监控组件,它从每个节点上的kubelet收集资源使用指标,并通过Metrics API提供给HPA(Horizontal Pod Autoscaler)和kubectl top命令使用。
- kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
复制代码
部署完成后,可以使用以下命令查看资源使用情况:
- # 查看节点资源使用情况
- kubectl top nodes
- # 查看Pod资源使用情况
- kubectl top pods --all-namespaces
复制代码
cAdvisor
cAdvisor(Container Advisor)是Google开发的开源容器资源使用和性能分析工具。它已集成在kubelet中,自动收集、聚合、处理和导出运行中容器的信息。
cAdvisor通过kubelet的/metrics/cadvisor端点暴露指标:
- kubectl get --raw /api/v1/nodes/<node-name>/proxy/metrics/cadvisor
复制代码
Kube-state-metrics
Kube-state-metrics是一个简单的服务,它监听Kubernetes API服务器并生成关于对象状态(如Deployment、Pod、Node等)的指标。这些指标对于监控Kubernetes资源的状态变化非常有用。
- git clone https://github.com/kubernetes/kube-state-metrics.git
- cd kube-state-metrics/examples/standard
- kubectl apply -f .
复制代码
1. Deployment状态:kube_deployment_status_replicas_available
2. Pod状态:kube_pod_status_phase{phase="Running"}
3. 节点状态:kube_node_status_condition{condition="Ready", status="true"}
Deployment状态:
- kube_deployment_status_replicas_available
复制代码
Pod状态:
- kube_pod_status_phase{phase="Running"}
复制代码
节点状态:
- kube_node_status_condition{condition="Ready", status="true"}
复制代码
Node Exporter
Node Exporter是Prometheus的官方导出器,用于收集硬件和操作系统级别的指标,如CPU、内存、磁盘、网络等。
使用DaemonSet在每个节点上部署Node Exporter:
- apiVersion: apps/v1
- kind: DaemonSet
- metadata:
- name: node-exporter
- namespace: monitoring
- labels:
- app: node-exporter
- spec:
- selector:
- matchLabels:
- app: node-exporter
- template:
- metadata:
- labels:
- app: node-exporter
- spec:
- containers:
- - name: node-exporter
- image: prom/node-exporter:latest
- ports:
- - containerPort: 9100
- name: metrics
- volumeMounts:
- - name: proc
- mountPath: /host/proc
- readOnly: true
- - name: sys
- mountPath: /host/sys
- readOnly: true
- - name: rootfs
- mountPath: /rootfs
- readOnly: true
- volumes:
- - name: proc
- hostPath:
- path: /proc
- - name: sys
- hostPath:
- path: /sys
- - name: rootfs
- hostPath:
- path: /
- hostNetwork: true
- hostPID: true
复制代码
Jaeger
Jaeger是一个开源的分布式追踪系统,用于监控和故障排查基于微服务的分布式系统。它虽然不是传统的资源监控工具,但对于应用性能监控至关重要。
使用Operator部署Jaeger:
- kubectl create namespace observability
- kubectl create -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.38.0/jaeger-operator.yaml -n observability
复制代码
创建Jaeger实例:
- apiVersion: jaegertracing.io/v1
- kind: Jaeger
- metadata:
- name: simplest
复制代码
Grafana详解
Grafana是一个开源的可视化和分析平台,支持多种数据源,包括Prometheus。它提供了丰富的图表和仪表盘功能,使监控数据更加直观和易于理解。
Grafana架构
Grafana的架构相对简单,主要由以下组件组成:
1. Grafana Server:核心组件,处理用户请求、渲染图表和管理仪表盘。
2. 数据源:Grafana支持多种数据源,如Prometheus、InfluxDB、Elasticsearch等。
3. 仪表盘:可视化面板的集合,用于展示相关指标。
4. 告警:Grafana内置的告警系统,可以在满足条件时发送通知。
在Kubernetes中部署Grafana
首先添加Grafana Helm仓库:
- helm repo add grafana https://grafana.github.io/helm-charts
- helm repo update
复制代码
然后安装Grafana:
- helm install grafana grafana/grafana --namespace monitoring --set persistence.storageClassName="gp2" --set persistence.enabled=true --set adminPassword="admin"
复制代码- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: grafana
- namespace: monitoring
- spec:
- replicas: 1
- selector:
- matchLabels:
- app: grafana
- template:
- metadata:
- labels:
- app: grafana
- spec:
- containers:
- - name: grafana
- image: grafana/grafana:latest
- ports:
- - containerPort: 3000
- env:
- - name: GF_SECURITY_ADMIN_PASSWORD
- value: "admin"
- volumeMounts:
- - name: grafana-storage
- mountPath: /var/lib/grafana
- volumes:
- - name: grafana-storage
- emptyDir: {}
- ---
- apiVersion: v1
- kind: Service
- metadata:
- name: grafana
- namespace: monitoring
- spec:
- selector:
- app: grafana
- ports:
- - port: 80
- targetPort: 3000
- type: LoadBalancer
复制代码
配置Grafana数据源
部署完成后,需要配置Grafana连接到Prometheus作为数据源:
1. 访问Grafana UI(默认用户名:admin,密码:admin)
2. 导航到Configuration > Data Sources
3. 点击”Add data source”
4. 选择Prometheus
5. 输入Prometheus服务器的URL(如http://prometheus:9090)
6. 点击”Save & Test”
创建仪表盘
Grafana提供了多种方式创建仪表盘:
Grafana官方和社区提供了许多预定义的仪表盘模板,可以直接导入使用:
1. 导航到Dashboards > Import
2. 输入仪表盘ID(如Kubernetes集群监控的ID是315)
3. 选择Prometheus数据源
4. 点击”Import”
1. 导航到Dashboards > New dashboard
2. 点击”Add new panel”
3. 选择数据源(Prometheus)
4. 输入PromQL查询
5. 配置可视化选项
6. 保存仪表盘
常用Grafana仪表盘模板
以下是一些常用的Kubernetes监控仪表盘模板:
1. Kubernetes Cluster Monitoring(ID: 315)提供集群级别的资源使用情况概览包括CPU、内存、网络和文件系统使用情况
2. 提供集群级别的资源使用情况概览
3. 包括CPU、内存、网络和文件系统使用情况
4. Kubernetes Pod Monitoring(ID: 6417)监控Pod级别的资源使用情况包括CPU、内存和网络指标
5. 监控Pod级别的资源使用情况
6. 包括CPU、内存和网络指标
7. Node Exporter for Prometheus(ID: 1860)监控节点级别的硬件和操作系统指标包括CPU、内存、磁盘和网络详细信息
8. 监控节点级别的硬件和操作系统指标
9. 包括CPU、内存、磁盘和网络详细信息
10. Kubernetes Deployment Statefulset Daemonset Metrics(ID: 8588)监控Kubernetes工作负载资源的状态和性能包括副本数、更新状态和资源使用情况
11. 监控Kubernetes工作负载资源的状态和性能
12. 包括副本数、更新状态和资源使用情况
Kubernetes Cluster Monitoring(ID: 315)
• 提供集群级别的资源使用情况概览
• 包括CPU、内存、网络和文件系统使用情况
Kubernetes Pod Monitoring(ID: 6417)
• 监控Pod级别的资源使用情况
• 包括CPU、内存和网络指标
Node Exporter for Prometheus(ID: 1860)
• 监控节点级别的硬件和操作系统指标
• 包括CPU、内存、磁盘和网络详细信息
Kubernetes Deployment Statefulset Daemonset Metrics(ID: 8588)
• 监控Kubernetes工作负载资源的状态和性能
• 包括副本数、更新状态和资源使用情况
Grafana告警配置
Grafana不仅可以可视化数据,还可以配置告警规则:
1. 在仪表盘中编辑一个面板
2. 切换到”Alert”标签
3. 配置告警条件
4. 设置通知渠道(如电子邮件、Slack等)
以下是一个告警配置示例:
- # 告警规则示例
- name: High CPU Usage
- message: CPU usage is above 80% for 5 minutes
- conditions:
- - evaluator:
- params:
- - 80
- type: gt
- operator:
- type: and
- query:
- params:
- - A
- - 5m
- - now
- reducer:
- type: avg
- type: query
- frequency: 300s
- for: 5m
- notifications:
- - uid: channel1
复制代码
Grafana插件
Grafana支持丰富的插件生态系统,可以扩展其功能:
1. 面板插件:提供新的可视化选项ClockPie ChartStatus Dot
2. Clock
3. Pie Chart
4. Status Dot
5. 数据源插件:支持新的数据源ElasticsearchInfluxDBCloudWatch
6. Elasticsearch
7. InfluxDB
8. CloudWatch
9. 应用插件:提供完整的监控解决方案ZabbixPrometheus
10. Zabbix
11. Prometheus
面板插件:提供新的可视化选项
• Clock
• Pie Chart
• Status Dot
数据源插件:支持新的数据源
• Elasticsearch
• InfluxDB
• CloudWatch
应用插件:提供完整的监控解决方案
• Zabbix
• Prometheus
安装插件的方法:
- # 使用Docker运行Grafana时
- docker run -d -p 3000:3000 grafana/grafana:latest
- # 安装插件
- grafana-cli plugins install grafana-clock-panel
复制代码
监控生态系统整合
将各种监控工具整合到一个统一的监控生态系统中,可以提供全面的可见性和洞察力。下面介绍如何整合Prometheus、Grafana和其他监控工具。
使用Prometheus Operator
Prometheus Operator简化了在Kubernetes上运行Prometheus的过程,它通过Kubernetes自定义资源定义(CRD)来管理Prometheus组件。
1. Prometheus:定义Prometheus服务器实例
2. Alertmanager:定义Alertmanager实例
3. ServiceMonitor:定义如何监控服务
4. PodMonitor:定义如何监控Pod
5. PrometheusRule:定义Prometheus告警规则
6. ThanosRuler:定义Thanos Ruler实例
以下是一个完整的Prometheus Operator配置示例:
- # Prometheus实例
- apiVersion: monitoring.coreos.com/v1
- kind: Prometheus
- metadata:
- name: k8s
- namespace: monitoring
- spec:
- serviceAccountName: prometheus-k8s
- serviceMonitorSelector: {}
- ruleSelector:
- matchLabels:
- prometheus: k8s
- role: alert-rules
- alerting:
- alertmanagers:
- - namespace: monitoring
- name: alertmanager-main
- port: web
- resources:
- requests:
- memory: 400Mi
- enableAdminAPI: false
- # Alertmanager实例
- apiVersion: monitoring.coreos.com/v1
- kind: Alertmanager
- metadata:
- name: main
- namespace: monitoring
- spec:
- replicas: 3
- version: v0.21.0
- # ServiceMonitor示例
- apiVersion: monitoring.coreos.com/v1
- kind: ServiceMonitor
- metadata:
- name: kubelet
- namespace: monitoring
- labels:
- k8s-app: kubelet
- spec:
- endpoints:
- - port: https-metrics
- interval: 30s
- scheme: https
- tlsConfig:
- caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
- serverName: kubernetes
- insecureSkipVerify: false
- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
- jobLabel: k8s-app
- selector:
- matchLabels:
- k8s-app: kubelet
- namespaceSelector:
- matchNames:
- - kube-system
- # PrometheusRule示例
- apiVersion: monitoring.coreos.com/v1
- kind: PrometheusRule
- metadata:
- name: k8s.rules
- namespace: monitoring
- labels:
- prometheus: k8s
- role: alert-rules
- spec:
- groups:
- - name: node.rules
- rules:
- - expr: sum(rate(node_cpu_seconds_total{mode!="idle",mode!="iowait"}[5m])) BY (instance)
- record: instance:node_cpu_utilisation:rate5m
- - expr: sum(rate(node_cpu_seconds_total{mode!="idle",mode!="iowait"}[5m]))
- record: cluster:node_cpu_utilisation:rate5m
复制代码
使用kube-prometheus-stack
kube-prometheus-stack是一个预配置的Prometheus监控栈,包含了Prometheus Operator、Grafana、Alertmanager以及一系列预定义的仪表盘和告警规则。
使用Helm安装kube-prometheus-stack:
- helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
- helm repo update
- helm install prometheus prometheus-community/kube-prometheus-stack \
- --namespace monitoring \
- --set prometheus.prometheusSpec.podMonitorSelectorNilUsesHelmValues=false \
- --set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false
复制代码
可以通过values.yaml文件自定义kube-prometheus-stack的配置:
- # values.yaml
- prometheus:
- prometheusSpec:
- retention: 10d
- resources:
- requests:
- memory: 400Mi
- cpu: 200m
- limits:
- memory: 8Gi
- cpu: 4
- grafana:
- adminPassword: "admin"
- ingress:
- enabled: true
- annotations:
- kubernetes.io/ingress.class: nginx
- hosts:
- - grafana.example.com
- alertmanager:
- alertmanagerSpec:
- resources:
- requests:
- memory: 400Mi
- cpu: 200m
- limits:
- memory: 2Gi
- cpu: 2
复制代码
整合日志监控
除了指标监控,日志监控也是Kubernetes监控体系的重要组成部分。常用的日志监控工具包括Elasticsearch、Fluentd和Kibana(EFK)或Loki、Promtail和Grafana(PLG)。
Loki是一个受Prometheus启发的日志聚合系统,与Grafana紧密集成。
- helm repo add grafana https://grafana.github.io/helm-charts
- helm repo update
- # 安装Loki
- helm install loki grafana/loki --namespace monitoring
- # 安装Promtail
- helm install promtail grafana/promtail --namespace monitoring \
- --set "loki.serviceName=loki"
复制代码
在Grafana中添加Loki作为数据源:
1. 导航到Configuration > Data Sources
2. 点击”Add data source”
3. 选择Loki
4. 输入Loki服务器的URL(如http://loki:3100)
5. 点击”Save & Test”
Loki使用LogQL查询语言,类似于PromQL。以下是一些示例:
1. 查询特定应用的日志:{app="myapp"}
2. 查询错误日志:{app="myapp"} |= "error"
3. 统计错误率:count_over_time({app="myapp"} |= "error" [5m])
查询特定应用的日志:
查询错误日志:
统计错误率:
- count_over_time({app="myapp"} |= "error" [5m])
复制代码
整合分布式追踪
分布式追踪可以帮助我们理解请求在微服务架构中的流转情况。Jaeger和Zipkin是常用的分布式追踪系统。
- kubectl create namespace observability
- kubectl create -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.38.0/jaeger-operator.yaml -n observability
复制代码- apiVersion: jaegertracing.io/v1
- kind: Jaeger
- metadata:
- name: simplest
复制代码
在应用程序中集成Jaeger客户端库:
- package main
- import (
- "context"
- "log"
- "net/http"
- "time"
- "github.com/opentracing/opentracing-go"
- "github.com/uber/jaeger-client-go"
- jaegercfg "github.com/uber/jaeger-client-go/config"
- )
- func main() {
- // Jaeger配置
- cfg := jaegercfg.Configuration{
- ServiceName: "my-service",
- Sampler: &jaegercfg.SamplerConfig{
- Type: jaeger.SamplerTypeConst,
- Param: 1,
- },
- Reporter: &jaegercfg.ReporterConfig{
- LogSpans: true,
- },
- }
- // 初始化Tracer
- tracer, closer, err := cfg.NewTracer(jaegercfg.Logger(jaeger.StdLogger))
- if err != nil {
- log.Fatal("cannot initialize Jaeger Tracer", err)
- }
- defer closer.Close()
- opentracing.SetGlobalTracer(tracer)
- // HTTP处理函数
- http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
- // 从请求中提取span上下文
- wireCtx, err := opentracing.GlobalTracer().Extract(
- opentracing.HTTPHeaders,
- opentracing.HTTPHeadersCarrier(r.Header),
- )
- if err != nil {
- log.Printf("Failed to extract span context: %v", err)
- }
- // 创建新的span
- span := opentracing.StartSpan("handle-request", opentracing.ChildOf(wireCtx))
- defer span.Finish()
- // 设置span标签
- span.SetTag("http.method", r.Method)
- span.SetTag("http.url", r.URL.Path)
- // 模拟处理时间
- time.Sleep(100 * time.Millisecond)
- w.Write([]byte("Hello, World!"))
- })
- log.Fatal(http.ListenAndServe(":8080", nil))
- }
复制代码
实践案例
通过实际案例来理解如何构建完整的Kubernetes监控系统。
案例1:构建完整的Kubernetes监控栈
在这个案例中,我们将构建一个完整的Kubernetes监控栈,包括Prometheus、Grafana、Alertmanager、Node Exporter、Kube-state-metrics和Loki。
首先,创建一个命名空间用于部署监控组件:
- kubectl create namespace monitoring
复制代码- kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/master/bundle.yaml
复制代码
创建一个monitoring.yaml文件,包含所有监控组件的定义:
应用配置:
- kubectl apply -f monitoring.yaml
复制代码
创建ServiceMonitor来监控Kubernetes组件:
- apiVersion: monitoring.coreos.com/v1
- kind: ServiceMonitor
- metadata:
- name: kube-apiserver
- namespace: monitoring
- labels:
- k8s-app: apiserver
- spec:
- selector:
- matchLabels:
- component: apiserver
- provider: kubernetes
- namespaceSelector:
- matchNames:
- - default
- endpoints:
- - port: https
- interval: 30s
- scheme: https
- tlsConfig:
- caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
- serverName: kubernetes
- insecureSkipVerify: false
- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
复制代码
1. 获取Grafana服务的外部IP:
- kubectl get svc grafana -n monitoring
复制代码
1. 访问Grafana UI(默认用户名:admin,密码:admin)
2. 添加Prometheus作为数据源
3. 导入预定义的仪表盘(如ID: 315)
- # 安装Loki
- helm install loki grafana/loki --namespace monitoring
- # 安装Promtail
- helm install promtail grafana/promtail --namespace monitoring \
- --set "loki.serviceName=loki"
复制代码
创建告警规则:
- apiVersion: monitoring.coreos.com/v1
- kind: PrometheusRule
- metadata:
- name: prometheus-rules
- namespace: monitoring
- spec:
- groups:
- - name: node.rules
- rules:
- - alert: HighCPUUsage
- expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
- for: 5m
- labels:
- severity: warning
- annotations:
- summary: "High CPU usage on {{ $labels.instance }}"
- description: "CPU usage is above 80% (current value: {{ $value }})"
- - alert: HighMemoryUsage
- expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 80
- for: 5m
- labels:
- severity: warning
- annotations:
- summary: "High memory usage on {{ $labels.instance }}"
- description: "Memory usage is above 80% (current value: {{ $value }})"
复制代码
案例2:监控应用程序性能
在这个案例中,我们将展示如何监控一个在Kubernetes上运行的应用程序的性能。
创建一个简单的Web应用程序:
- package main
- import (
- "fmt"
- "log"
- "math/rand"
- "net/http"
- "time"
- "github.com/prometheus/client_golang/prometheus"
- "github.com/prometheus/client_golang/prometheus/promhttp"
- )
- var (
- httpRequestsTotal = prometheus.NewCounterVec(
- prometheus.CounterOpts{
- Name: "http_requests_total",
- Help: "Total number of HTTP requests.",
- },
- []string{"method", "endpoint", "status"},
- )
- httpRequestDuration = prometheus.NewHistogramVec(
- prometheus.HistogramOpts{
- Name: "http_request_duration_seconds",
- Help: "Duration of HTTP requests.",
- Buckets: prometheus.DefBuckets,
- },
- []string{"method", "endpoint"},
- )
- inProgressRequests = prometheus.NewGauge(
- prometheus.GaugeOpts{
- Name: "http_in_progress_requests",
- Help: "Number of HTTP requests in progress.",
- },
- )
- )
- func init() {
- prometheus.MustRegister(httpRequestsTotal)
- prometheus.MustRegister(httpRequestDuration)
- prometheus.MustRegister(inProgressRequests)
- }
- func main() {
- http.Handle("/metrics", promhttp.Handler())
- http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
- inProgressRequests.Inc()
- defer inProgressRequests.Dec()
- start := time.Now()
- defer func() {
- httpRequestDuration.WithLabelValues(r.Method, r.URL.Path).Observe(time.Since(start).Seconds())
- }()
- // 模拟处理时间
- processingTime := time.Duration(rand.Intn(100)) * time.Millisecond
- time.Sleep(processingTime)
- // 模拟错误率
- status := http.StatusOK
- if rand.Intn(10) == 0 {
- status = http.StatusInternalServerError
- }
- w.WriteHeader(status)
- fmt.Fprintf(w, "Hello, World! Processed in %v\n", processingTime)
- httpRequestsTotal.WithLabelValues(r.Method, r.URL.Path, fmt.Sprintf("%d", status)).Inc()
- })
- log.Println("Server starting on port 8080...")
- log.Fatal(http.ListenAndServe(":8080", nil))
- }
复制代码
创建Dockerfile:
- FROM golang:1.16-alpine AS builder
- WORKDIR /app
- COPY . .
- RUN go mod init example.com/webapp
- RUN go mod tidy
- RUN CGO_ENABLED=0 GOOS=linux go build -o webapp .
- FROM alpine:latest
- WORKDIR /root/
- COPY --from=builder /app/webapp .
- CMD ["./webapp"]
复制代码
构建镜像:
- docker build -t my-webapp:latest .
复制代码
创建Kubernetes部署文件:
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: webapp
- namespace: default
- spec:
- replicas: 3
- selector:
- matchLabels:
- app: webapp
- template:
- metadata:
- labels:
- app: webapp
- spec:
- containers:
- - name: webapp
- image: my-webapp:latest
- ports:
- - containerPort: 8080
- resources:
- requests:
- cpu: 100m
- memory: 64Mi
- limits:
- cpu: 200m
- memory: 128Mi
- livenessProbe:
- httpGet:
- path: /
- port: 8080
- initialDelaySeconds: 5
- periodSeconds: 10
- readinessProbe:
- httpGet:
- path: /
- port: 8080
- initialDelaySeconds: 5
- periodSeconds: 10
- ---
- apiVersion: v1
- kind: Service
- metadata:
- name: webapp
- namespace: default
- labels:
- app: webapp
- spec:
- selector:
- app: webapp
- ports:
- - name: http
- port: 80
- targetPort: 8080
- type: LoadBalancer
复制代码
应用部署:
- kubectl apply -f webapp.yaml
复制代码
创建ServiceMonitor:
- apiVersion: monitoring.coreos.com/v1
- kind: ServiceMonitor
- metadata:
- name: webapp
- namespace: monitoring
- spec:
- selector:
- matchLabels:
- app: webapp
- namespaceSelector:
- matchNames:
- - default
- endpoints:
- - port: http
- interval: 15s
- path: /metrics
复制代码
1. 在Grafana中创建新的仪表盘
2. 添加面板来监控以下指标:HTTP请求总数HTTP请求持续时间HTTP错误率并发请求数
3. HTTP请求总数
4. HTTP请求持续时间
5. HTTP错误率
6. 并发请求数
• HTTP请求总数
• HTTP请求持续时间
• HTTP错误率
• 并发请求数
以下是一些PromQL查询示例:
- # HTTP请求总数
- sum(rate(http_requests_total[5m])) by (status)
- # HTTP请求持续时间
- histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, method, endpoint))
- # HTTP错误率
- sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) * 100
- # 并发请求数
- http_in_progress_requests
复制代码
创建应用程序特定的告警规则:
- apiVersion: monitoring.coreos.com/v1
- kind: PrometheusRule
- metadata:
- name: webapp-rules
- namespace: monitoring
- spec:
- groups:
- - name: webapp.rules
- rules:
- - alert: HighErrorRate
- expr: sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) * 100 > 5
- for: 5m
- labels:
- severity: critical
- annotations:
- summary: "High error rate for webapp"
- description: "Error rate is above 5% (current value: {{ $value }}%)"
- - alert: HighLatency
- expr: histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, method, endpoint)) > 0.1
- for: 5m
- labels:
- severity: warning
- annotations:
- summary: "High latency for webapp"
- description: "95th percentile latency is above 100ms (current value: {{ $value }}s)"
复制代码
最佳实践和优化建议
在构建和维护Kubernetes监控系统时,遵循一些最佳实践可以帮助您提高系统的效率和可靠性。
监控策略
1. 分层监控:基础设施层:节点、网络、存储平台层:Kubernetes组件、API服务器应用层:应用程序性能、业务指标
2. 基础设施层:节点、网络、存储
3. 平台层:Kubernetes组件、API服务器
4. 应用层:应用程序性能、业务指标
5. 关键指标优先:识别对业务最关键的指标确保这些指标被优先监控和告警
6. 识别对业务最关键的指标
7. 确保这些指标被优先监控和告警
8. 监控覆盖:确保所有关键组件都被监控定期审查监控覆盖范围
9. 确保所有关键组件都被监控
10. 定期审查监控覆盖范围
分层监控:
• 基础设施层:节点、网络、存储
• 平台层:Kubernetes组件、API服务器
• 应用层:应用程序性能、业务指标
关键指标优先:
• 识别对业务最关键的指标
• 确保这些指标被优先监控和告警
监控覆盖:
• 确保所有关键组件都被监控
• 定期审查监控覆盖范围
性能优化
1. Prometheus性能优化:调整--storage.tsdb.retention.time设置适当的保留时间使用--storage.tsdb.retention.size限制存储大小考虑使用远程存储进行长期存储优化记录规则和告警规则
2. 调整--storage.tsdb.retention.time设置适当的保留时间
3. 使用--storage.tsdb.retention.size限制存储大小
4. 考虑使用远程存储进行长期存储
5. 优化记录规则和告警规则
6. 资源限制:为Prometheus和Grafana设置适当的资源请求和限制监控监控组件本身的资源使用情况
7. 为Prometheus和Grafana设置适当的资源请求和限制
8. 监控监控组件本身的资源使用情况
9. 采样和聚合:对高基数指标进行采样使用记录规则预先计算常用聚合
10. 对高基数指标进行采样
11. 使用记录规则预先计算常用聚合
Prometheus性能优化:
• 调整--storage.tsdb.retention.time设置适当的保留时间
• 使用--storage.tsdb.retention.size限制存储大小
• 考虑使用远程存储进行长期存储
• 优化记录规则和告警规则
资源限制:
• 为Prometheus和Grafana设置适当的资源请求和限制
• 监控监控组件本身的资源使用情况
采样和聚合:
• 对高基数指标进行采样
• 使用记录规则预先计算常用聚合
告警管理
1. 告警分级:定义清晰的告警级别(如critical、warning、info)根据严重程度设置不同的通知渠道和频率
2. 定义清晰的告警级别(如critical、warning、info)
3. 根据严重程度设置不同的通知渠道和频率
4. 告警抑制:使用Alertmanager的抑制功能减少告警噪音配置告警分组,将相关告警合并通知
5. 使用Alertmanager的抑制功能减少告警噪音
6. 配置告警分组,将相关告警合并通知
7. 告警测试:定期测试告警规则和通知渠道确保告警在关键时刻能够正常工作
8. 定期测试告警规则和通知渠道
9. 确保告警在关键时刻能够正常工作
告警分级:
• 定义清晰的告警级别(如critical、warning、info)
• 根据严重程度设置不同的通知渠道和频率
告警抑制:
• 使用Alertmanager的抑制功能减少告警噪音
• 配置告警分组,将相关告警合并通知
告警测试:
• 定期测试告警规则和通知渠道
• 确保告警在关键时刻能够正常工作
安全考虑
1. 访问控制:使用RBAC限制对监控系统的访问为Grafana配置适当的用户权限
2. 使用RBAC限制对监控系统的访问
3. 为Grafana配置适当的用户权限
4. 数据加密:使用TLS加密监控数据传输考虑加密静态存储的监控数据
5. 使用TLS加密监控数据传输
6. 考虑加密静态存储的监控数据
7. 审计日志:启用监控系统的审计日志定期审查访问和配置变更
8. 启用监控系统的审计日志
9. 定期审查访问和配置变更
访问控制:
• 使用RBAC限制对监控系统的访问
• 为Grafana配置适当的用户权限
数据加密:
• 使用TLS加密监控数据传输
• 考虑加密静态存储的监控数据
审计日志:
• 启用监控系统的审计日志
• 定期审查访问和配置变更
可扩展性
1. 水平扩展:考虑使用Thanos或Cortex进行Prometheus的水平扩展使用Grafana的高可用配置
2. 考虑使用Thanos或Cortex进行Prometheus的水平扩展
3. 使用Grafana的高可用配置
4. 联邦:在多集群环境中使用Prometheus联邦考虑使用中央监控平台汇总多个集群的数据
5. 在多集群环境中使用Prometheus联邦
6. 考虑使用中央监控平台汇总多个集群的数据
7. 自动化:使用GitOps管理监控配置自动部署和更新监控组件
8. 使用GitOps管理监控配置
9. 自动部署和更新监控组件
水平扩展:
• 考虑使用Thanos或Cortex进行Prometheus的水平扩展
• 使用Grafana的高可用配置
联邦:
• 在多集群环境中使用Prometheus联邦
• 考虑使用中央监控平台汇总多个集群的数据
自动化:
• 使用GitOps管理监控配置
• 自动部署和更新监控组件
维护和更新
1. 版本管理:跟踪监控组件的版本定期更新到最新稳定版本
2. 跟踪监控组件的版本
3. 定期更新到最新稳定版本
4. 备份和恢复:定期备份Grafana仪表盘和Prometheus配置测试恢复流程
5. 定期备份Grafana仪表盘和Prometheus配置
6. 测试恢复流程
7. 文档:维护监控系统的文档记录自定义指标和告警规则
8. 维护监控系统的文档
9. 记录自定义指标和告警规则
版本管理:
• 跟踪监控组件的版本
• 定期更新到最新稳定版本
备份和恢复:
• 定期备份Grafana仪表盘和Prometheus配置
• 测试恢复流程
文档:
• 维护监控系统的文档
• 记录自定义指标和告警规则
总结和未来趋势
Kubernetes监控是确保集群健康和性能的关键环节。通过本文,我们详细介绍了从Prometheus到Grafana的监控工具生态系统,包括它们的功能、部署方法和最佳实践。
主要收获
1. Prometheus是Kubernetes监控的核心,提供了强大的指标收集、存储和查询能力。
2. Grafana提供了丰富的可视化功能,使监控数据更加直观和易于理解。
3. 其他监控工具如Metrics Server、cAdvisor、Kube-state-metrics等,各自有特定的用途,共同构成了完整的监控体系。
4. 整合监控生态系统需要考虑指标、日志和追踪的统一管理。
5. 实践案例展示了如何构建完整的监控栈和监控应用程序性能。
6. 最佳实践和优化建议有助于提高监控系统的效率和可靠性。
未来趋势
Kubernetes监控领域正在不断发展,以下是一些未来趋势:
1. AI/ML驱动的监控:使用机器学习算法进行异常检测预测性分析和自动修复
2. 使用机器学习算法进行异常检测
3. 预测性分析和自动修复
4. 更紧密的集成:监控工具与Kubernetes平台的更紧密集成服务网格与监控的深度整合
5. 监控工具与Kubernetes平台的更紧密集成
6. 服务网格与监控的深度整合
7. 更强大的可观测性:指标、日志和追踪的统一平台更好的关联分析和上下文信息
8. 指标、日志和追踪的统一平台
9. 更好的关联分析和上下文信息
10. 边缘计算监控:适应边缘计算环境的监控解决方案分布式监控和数据处理
11. 适应边缘计算环境的监控解决方案
12. 分布式监控和数据处理
13. 更智能的告警:减少误报和漏报更智能的告警路由和处理
14. 减少误报和漏报
15. 更智能的告警路由和处理
AI/ML驱动的监控:
• 使用机器学习算法进行异常检测
• 预测性分析和自动修复
更紧密的集成:
• 监控工具与Kubernetes平台的更紧密集成
• 服务网格与监控的深度整合
更强大的可观测性:
• 指标、日志和追踪的统一平台
• 更好的关联分析和上下文信息
边缘计算监控:
• 适应边缘计算环境的监控解决方案
• 分布式监控和数据处理
更智能的告警:
• 减少误报和漏报
• 更智能的告警路由和处理
通过持续关注这些趋势并采用最佳实践,您可以构建一个强大、高效且可扩展的Kubernetes监控系统,帮助您实时掌握资源使用情况,高效管理集群性能,确保应用程序的稳定运行。
版权声明
1、转载或引用本网站内容(精选Kubernetes资源监控工具全面解析从Prometheus到Grafana助您高效管理集群性能实时掌握资源使用情况)须注明原网址及作者(威震华夏关云长),并标明本网站网址(https://www.pixtech.cc/)。
2、对于不当转载或引用本网站内容而引起的民事纷争、行政处理或其他损失,本网站不承担责任。
3、对不遵守本声明或其他违法、恶意使用本网站内容者,本网站保留追究其法律责任的权利。
本文地址: https://www.pixtech.cc/thread-36837-1-1.html
|
|