K8s集群监控
K8s集群监控模块提供对Kubernetes集群的全面监控能力,帮助用户实时掌握集群、节点、命名空间、Pod、容器等资源的运行状态和性能指标,确保容器化应用的稳定运行。
1. 功能概述
K8s集群监控模块提供以下核心功能:
- 集群概览:实时监控集群的整体健康状态和资源使用情况
- 节点监控:监控集群中所有节点的CPU、内存、磁盘、网络等性能指标
- 工作负载监控:监控Deployment、StatefulSet、DaemonSet等工作负载的状态和指标
- Pod监控:监控所有Pod的运行状态、重启次数、资源使用等
- 容器监控:监控容器级别的CPU、内存、网络、文件系统等指标
- 服务监控:监控Service、Ingress等服务组件的访问情况和性能
- 事件监控:收集和分析Kubernetes事件,及时发现集群异常
- 集群拓扑:可视化展示集群资源之间的关系和依赖
- 自动发现:自动发现集群中的新资源并加入监控
2. 监控指标
2.1 集群级别指标
| 指标名称 | 单位 | 描述 | 告警阈值建议 |
|---|---|---|---|
| 节点就绪率 | % | 就绪节点数/总节点数 | <95% |
| Pod就绪率 | % | 就绪Pod数/总Pod数 | <90% |
| 资源使用率(CPU) | % | 集群CPU资源使用率 | >80% |
| 资源使用率(内存) | % | 集群内存资源使用率 | >80% |
| 资源使用率(存储) | % | 集群存储资源使用率 | >80% |
| 异常事件数 | 个/分钟 | 每分钟产生的警告/错误事件数 | >10 |
| API Server请求延迟 | ms | Kubernetes API Server的请求延迟 | >100ms |
| API Server错误率 | % | API Server请求错误比例 | >1% |
2.2 节点级别指标
| 指标名称 | 单位 | 描述 | 告警阈值建议 |
|---|---|---|---|
| 节点CPU使用率 | % | 节点CPU总体使用率 | >85% |
| 节点内存使用率 | % | 节点内存总体使用率 | >85% |
| 节点磁盘使用率 | % | 节点根分区使用率 | >85% |
| 节点网络发送速率 | MB/s | 节点网络发送数据的速率 | - |
| 节点网络接收速率 | MB/s | 节点网络接收数据的速率 | - |
| 节点容器运行数 | 个 | 节点上运行的容器数量 | - |
| 节点Pod运行数 | 个 | 节点上运行的Pod数量 | - |
| 节点Pod限制数 | 个 | 节点可运行的最大Pod数 | - |
| 节点就绪状态 | - | 节点是否就绪 | 非Ready状态 |
2.3 Pod级别指标
| 指标名称 | 单位 | 描述 | 告警阈值建议 |
|---|---|---|---|
| Pod CPU使用率 | % | Pod的CPU使用率(相对于请求/限制) | >80% |
| Pod内存使用率 | % | Pod的内存使用率(相对于请求/限制) | >80% |
| Pod重启次数 | 次 | Pod重启次数 | >3次/小时 |
| Pod就绪状态 | - | Pod是否就绪 | 非Ready状态 |
| Pod容器状态 | - | Pod中容器的状态 | CrashLoopBackOff |
| Pod网络接收流量 | KB/s | Pod网络接收速率 | - |
| Pod网络发送流量 | KB/s | Pod网络发送速率 | - |
| Pod重启原因 | - | Pod重启的原因 | - |
2.4 容器级别指标
| 指标名称 | 单位 | 描述 | 告警阈值建议 |
|---|---|---|---|
| 容器CPU使用率 | % | 容器CPU使用率 | >80% |
| 容器内存使用率 | % | 容器内存使用率 | >80% |
| 容器文件系统使用率 | % | 容器挂载的文件系统使用率 | >80% |
| 容器网络接收流量 | KB/s | 容器网络接收速率 | - |
| 容器网络发送流量 | KB/s | 容器网络发送速率 | - |
| 容器CPU限制 | 核 | 容器的CPU限制 | - |
| 容器内存限制 | MB/GB | 容器的内存限制 | - |
| 容器CPU请求 | 核 | 容器的CPU请求 | - |
| 容器内存请求 | MB/GB | 容器的内存请求 | - |
2.5 工作负载指标
| 指标名称 | 单位 | 描述 | 告警阈值建议 |
|---|---|---|---|
| 期望Pod数 | 个 | 工作负载期望的Pod数量 | - |
| 就绪Pod数 | 个 | 工作负载就绪的Pod数量 | 不等于期望Pod数 |
| 可用Pod数 | 个 | 工作负载可用的Pod数量 | 不等于期望Pod数 |
| 工作负载重启次数 | 次/小时 | 工作负载中Pod的重启次数 | >5次/小时 |
3. 部署与配置
3.1 安装Node Exporter
Node Exporter用于采集节点级别的指标:
# 使用DaemonSet部署Node Exporter
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/nodeExporter-daemonset.yaml
3.2 安装kube-state-metrics
kube-state-metrics用于采集Kubernetes资源状态指标:
# 部署kube-state-metrics
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kube-state-metrics/master/examples/standard/cluster-role-binding.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kube-state-metrics/master/examples/standard/cluster-role.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kube-state-metrics/master/examples/standard/deployment.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kube-state-metrics/master/examples/standard/service-account.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kube-state-metrics/master/examples/standard/service.yaml
3.3 配置AIOPS平台接入
- 在AIOPS平台界面中,点击"配置中心" > "数据源管理"
- 点击"新增数据源",选择"Kubernetes"类型
- 填写以下信息:
- 名称:K8s集群名称
- API Server地址:Kubernetes API Server地址(如 https://kubernetes.default.svc)
- 认证方式:选择合适的认证方式(如Service Account Token、kubeconfig等)
- 访问令牌:如果使用Service Account Token,填写令牌内容
- kubeconfig:如果使用kubeconfig,上传配置文件
- 采集间隔:设置数据采集间隔,默认为15秒
- 点击"测试连接"验证连接是否成功
- 点击"确定"保存配置
3.4 配置RBAC权限
确保用于监控的服务账户有足够的权限:
apiVersion: v1
kind: ServiceAccount
metadata:
name: aiops-monitor
namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: aiops-monitor-role
rules:
- apiGroups: [""]
resources: ["nodes", "pods", "services", "endpoints", "configmaps", "events"]
verbs: ["get", "list", "watch"]
- apiGroups: ["apps"]
resources: ["deployments", "statefulsets", "daemonsets", "replicasets"]
verbs: ["get", "list", "watch"]
- apiGroups: ["batch"]
resources: ["jobs", "cronjobs"]
verbs: ["get", "list", "watch"]
- apiGroups: ["metrics.k8s.io"]
resources: ["nodes", "pods"]
verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: aiops-monitor-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: aiops-monitor-role
subjects:
- kind: ServiceAccount
name: aiops-monitor
namespace: default
4. 使用指南
4.1 集群概览
在AIOPS平台界面中,点击左侧菜单栏的"监控中心" > "K8s集群监控" > "集群概览",进入集群概览页面:
- 集群健康状态:展示集群的整体健康状态和关键指标
- 节点状态分布:展示节点不同状态(Ready、NotReady等)的分布情况
- 工作负载状态:展示各类工作负载的状态统计
- 资源使用趋势:展示集群级别的CPU、内存等资源使用趋势
- 异常事件:展示最近的异常事件
4.2 节点管理
点击"节点管理"标签页,进入节点列表页面:
- 节点列表:展示所有集群节点的基本信息和状态
- 节点详情:点击节点名称查看节点的详细监控数据
- 节点筛选:支持按状态、标签等筛选节点
- 节点操作:支持节点信息编辑、监控配置调整等操作
4.3 工作负载监控
点击"工作负载"标签页,进入工作负载监控页面:
- 工作负载列表:展示所有工作负载的基本信息和状态
- 工作负载类型筛选:支持按Deployment、StatefulSet、DaemonSet等类型筛选
- 命名空间筛选:支持按命名空间筛选工作负载
- 工作负载详情:点击工作负载名称查看详细监控数据和关联的Pod列表
4.4 Pod监控
点击"Pod"标签页,进入Pod监控页面:
- Pod列表:展示所有Pod的基本信息和状态
- Pod筛选:支持按命名空间、标签、状态等筛选Pod
- Pod详情:点击Pod名称查看Pod的详细信息、容器列表、日志等
- Pod重启记录:查看Pod的历史重启记录和原因
4.5 容器监控
在Pod详情页面,可以查看该Pod中所有容器的监控数据:
- 容器列表:展示Pod中所有容器的基本信息
- 容器资源使用:展示容器的CPU、内存、网络等资源使用情况
- 容器日志:查看容器的实时和历史日志
- 容器事件:查看与容器相关的事件
4.6 服务监控
点击"服务"标签页,进入服务监控页面:
- 服务列表:展示所有Service的基本信息
- 服务筛选:支持按命名空间、类型等筛选服务
- 服务详情:点击服务名称查看服务的详细信息和关联的Pod
- 服务访问统计:展示服务的访问量、响应时间等指标
4.7 事件监控
点击"事件"标签页,进入事件监控页面:
- 事件列表:展示所有集群事件的详细信息
- 事件筛选:支持按类型、级别、资源等筛选事件
- 事件详情:查看事件的详细信息和相关资源
- 事件统计:展示事件的数量统计和趋势
5. 告警配置
5.1 集群级别告警规则
- name: "集群节点就绪率低"
description: "集群节点就绪率低于95%"
severity: "high"
condition: "sum(kube_node_status_condition{condition="Ready",status="true"}) / count(kube_node_status_condition{condition="Ready"}) * 100 < 95"
duration: 300
notifiers: ["email", "sms"]
tags: ["k8s", "cluster"]
- name: "集群Pod就绪率低"
description: "集群Pod就绪率低于90%"
severity: "high"
condition: "sum(kube_pod_status_ready{condition="true"}) / sum(kube_pod_status_phase{phase!="Failed",phase!="Succeeded"}) * 100 < 90"
duration: 300
notifiers: ["email", "sms"]
tags: ["k8s", "cluster"]
5.2 节点级别告警规则
- name: "节点CPU使用率高"
description: "节点CPU使用率超过85%"
severity: "high"
condition: "100 - (avg by(instance)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85"
duration: 300
notifiers: ["email", "sms"]
tags: ["k8s", "node"]
- name: "节点内存使用率高"
description: "节点内存使用率超过85%"
severity: "high"
condition: "(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 85"
duration: 300
notifiers: ["email", "sms"]
tags: ["k8s", "node"]
- name: "节点未就绪"
description: "节点处于NotReady状态"
severity: "critical"
condition: "kube_node_status_condition{condition="Ready",status="true"} == 0"
duration: 60
notifiers: ["email", "sms"]
tags: ["k8s", "node"]
5.3 Pod级别告警规则
- name: "Pod重启频繁"
description: "Pod在1小时内重启超过3次"
severity: "high"
condition: "rate(kube_pod_container_status_restarts_total[1h]) > 3"
duration: 60
notifiers: ["email", "sms"]
tags: ["k8s", "pod"]
- name: "Pod未就绪"
description: "Pod处于未就绪状态"
severity: "high"
condition: "kube_pod_status_ready{condition="true"} == 0"
duration: 300
notifiers: ["email", "sms"]
tags: ["k8s", "pod"]
- name: "Pod内存使用率高"
description: "Pod内存使用率超过80%"
severity: "medium"
condition: "container_memory_usage_bytes{container!="",container!="POD"} / container_spec_memory_limit_bytes{container!="",container!="POD"} * 100 > 80"
duration: 300
notifiers: ["email"]
tags: ["k8s", "pod"]
5.4 容器级别告警规则
- name: "容器CPU使用率高"
description: "容器CPU使用率超过80%"
severity: "medium"
condition: "sum(rate(container_cpu_usage_seconds_total{container!="",container!="POD"}[5m])) by (container, pod, namespace) / sum(container_spec_cpu_quota{container!="",container!="POD"} / container_spec_cpu_period{container!="",container!="POD"}) by (container, pod, namespace) * 100 > 80"
duration: 300
notifiers: ["email"]
tags: ["k8s", "container"]
- name: "容器文件系统使用率高"
description: "容器文件系统使用率超过80%"
severity: "medium"
condition: "container_fs_usage_bytes{container!="",container!="POD"} / container_fs_limit_bytes{container!="",container!="POD"} * 100 > 80"
duration: 300
notifiers: ["email"]
tags: ["k8s", "container"]
6. 性能优化建议
6.1 资源配置优化
- 合理设置资源请求和限制:根据应用的实际需求设置合理的CPU和内存请求和限制
- 避免资源过度分配:确保集群中所有Pod的资源请求总和不超过集群的实际资源容量
- 使用HorizontalPodAutoscaler:根据负载自动调整Pod数量
- 使用VerticalPodAutoscaler:根据实际使用情况自动优化Pod的资源请求和限制
6.2 集群规模优化
- 节点数量调整:根据工作负载情况调整节点数量,避免资源浪费或不足
- 节点亲和性和反亲和性:合理设置Pod的节点亲和性和反亲和性规则,优化Pod分布
- 使用节点标签和污点:使用节点标签和污点实现工作负载的精细化调度
- 考虑使用集群自动扩缩容:配置集群自动扩缩容,根据负载自动添加或移除节点
6.3 网络优化
- 选择合适的网络插件:根据集群规模和网络需求选择合适的网络插件(如Calico、Flannel、Cilium等)
- 优化Pod网络配置:调整MTU、连接跟踪等网络参数
- 使用网络策略:实施适当的网络策略,优化网络流量
- 考虑使用服务网格:对于复杂的微服务架构,考虑使用服务网格(如Istio)进行网络管理
6.4 存储优化
- 选择合适的存储类:根据应用需求选择合适的存储类(如高性能SSD、标准HDD等)
- 使用本地存储:对于需要高性能的应用,考虑使用本地存储
- 实施存储QoS:为不同的工作负载设置不同的存储QoS
- 优化PV回收策略:根据需要调整PV的回收策略(Retain、Delete等)
7. 故障排除
7.1 节点问题
- 节点NotReady状态:检查kubelet服务状态、网络连接、磁盘空间等
- 节点资源不足:查看节点资源使用情况,考虑迁移Pod或增加节点
- 节点重启:检查节点日志,了解重启原因
7.2 Pod问题
- Pod处于Pending状态:检查资源请求是否过大、节点资源是否充足、NodeSelector是否匹配等
- Pod处于CrashLoopBackOff状态:检查容器日志,了解崩溃原因
- Pod处于ImagePullBackOff状态:检查镜像名称、标签、镜像仓库访问权限等
- Pod重启频繁:分析应用日志,检查代码问题或资源配置
7.3 工作负载问题
- Deployment未就绪:检查Deployment的事件、Pod状态、滚动更新策略等
- StatefulSet问题:检查StatefulSet的事件、PVC状态、Pod有序性等
- DaemonSet未在所有节点运行:检查节点标签、污点容忍度等
7.4 服务问题
- Service无法访问:检查Service配置、Endpoints状态、Pod就绪状态等
- Ingress路由问题:检查Ingress规则、后端Service状态、Ingress控制器日志等
- 服务响应缓慢:分析Pod资源使用情况、网络延迟、应用性能等
8. 最佳实践
8.1 监控覆盖范围
- 全面监控:监控集群的各个层面,从节点到容器
- 关注核心指标:重点关注影响应用性能和稳定性的核心指标
- 设置合理阈值:根据应用特性和资源情况设置合理的告警阈值
- 定期审查告警规则:定期审查和优化告警规则,减少误报
8.2 资源管理
- 实施资源配额:为命名空间设置资源配额,避免单个应用占用过多资源
- 使用命名空间隔离:使用命名空间隔离不同的应用或团队
- 定期审查资源使用:定期审查和优化资源使用情况
- 实施资源回收策略:及时清理未使用的资源,避免资源浪费
8.3 安全最佳实践
- 使用RBAC:实施最小权限原则的RBAC配置
- 定期更新镜像:定期更新容器镜像,修复安全漏洞
- 使用镜像扫描:在部署前扫描镜像中的安全漏洞
- 实施网络策略:限制Pod间的网络通信
8.4 日常维护
- 定期备份etcd:定期备份etcd数据,确保集群数据安全
- 定期更新Kubernetes版本:及时更新Kubernetes版本,获取新功能和安全补丁
- 监控集群组件:监控etcd、API Server、Scheduler、Controller Manager等核心组件
- 定期审查集群事件:定期审查集群事件,及时发现潜在问题
