awesome-kubernetes中的资源监控:cAdvisor与metrics-server配置详解
在Kubernetes(简称K8s)集群管理中,资源监控是保障应用稳定运行的关键环节。你是否还在为Pod异常重启、节点资源耗尽而烦恼?本文将详细介绍如何通过cAdvisor(容器顾问) 和metrics-server(指标服务器) 构建基础监控体系,帮你实时掌握集群资源动态,解决80%的常见性能问题。读完本文,你将能够:部署轻量级容器监控工具、配置集群级指标采集、排查资源瓶颈并优化应用配置。
为什么需要资源监控?
Kubernetes集群由多个节点和容器组成,资源(CPU、内存、磁盘I/O)的合理分配直接影响应用性能。当某个Pod占用过多CPU时,可能导致同一节点的其他服务响应延迟;内存泄漏则可能引发OOM(内存溢出)杀死容器。通过监控工具,我们可以:
- 实时跟踪节点/容器资源使用率
- 预测资源瓶颈并提前扩容
- 优化Pod的资源请求(Requests)和限制(Limits)配置
- 满足SLA(服务等级协议)对可用性的要求
在docs/projects.md中,监控类工具被归类为Monitoring Services,其中cAdvisor和metrics-server是构建基础监控能力的核心组件。
cAdvisor:容器级监控的"基础设施"
什么是cAdvisor?
cAdvisor(Container Advisor)是Google开发的开源容器监控工具,已内置在Kubernetes kubelet组件中,无需单独部署。它会自动收集节点上所有容器的CPU、内存、网络和磁盘使用情况,并提供基础的Web UI和API接口。
cAdvisor的核心功能
- 自动发现容器:支持Docker、containerd等主流容器运行时
- 多维度指标采集:
- CPU使用率(使用率、累积占用时间、负载均衡情况)
- 内存使用(当前用量、峰值、缓存和交换分区)
- 网络I/O(收发字节数、包数量、错误率)
- 磁盘I/O(读写吞吐量、操作次数)
- 历史数据存储:默认保留2分钟的指标数据(可通过第三方工具扩展)
- 集成Prometheus:原生支持Prometheus metrics格式输出
访问cAdvisor数据
1. Web UI直接查看
在集群节点上访问http://<节点IP>:10255/metrics/cadvisor,可获取原始指标数据;访问http://<节点IP>:4194可打开cAdvisor的Web控制台(部分发行版可能禁用此端口,需检查kubelet配置)。
2. 通过kubectl代理访问
执行以下命令将节点端口转发到本地:
kubectl proxy --port=8001
然后访问http://localhost:8001/api/v1/nodes/<节点名称>/proxy/metrics/cadvisor获取指定节点的容器指标。
3. 关键指标示例
# CPU使用率(单位:核心数)
container_cpu_usage_seconds_total{container="nginx",pod="web-0"} 123.45
# 内存使用(单位:字节)
container_memory_usage_bytes{container="mysql",pod="db-1"} 536870912
metrics-server:集群级指标聚合
为什么需要metrics-server?
cAdvisor仅能提供单节点的容器指标,而Kubernetes的Horizontal Pod Autoscaler(HPA,水平自动扩缩容) 和kubectl top命令需要集群级的聚合指标。metrics-server正是解决这一问题的核心组件,它从kubelet采集指标并通过Metrics API提供给其他组件使用。
metrics-server的工作原理
- 部署形态:以Deployment形式运行在集群中,通常位于kube-system命名空间
- 数据流向:
- 数据处理:
- 从各节点kubelet的
/metrics/resource端点拉取数据 - 聚合节点和Pod级别的指标
- 提供Metrics API(
metrics.k8s.io/v1beta1)供查询
- 从各节点kubelet的
部署metrics-server
1. 从官方仓库部署
kubectl apply -f https://gitcode.com/gh_mirrors/aw/awesome-kubernetes/raw/master/deploy/metrics-server/components.yaml
2. 自定义配置(解决常见问题)
创建metrics-server-config.yaml,添加以下内容解决证书验证和节点名称解析问题:
apiVersion: v1
kind: ConfigMap
metadata:
name: metrics-server-config
namespace: kube-system
data:
config.yaml: |
apiVersion: metrics-server.config.k8s.io/v1beta1
kind: MetricsConfiguration
insecureSkipTLSVerify: true # 开发环境可禁用TLS验证(生产环境需配置证书)
metricResolution: 15s # 指标采集间隔
nodeAddressType: HostName # 使用主机名而非IP解析节点
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: metrics-server
namespace: kube-system
spec:
template:
spec:
containers:
- name: metrics-server
args:
- --config=/etc/config/config.yaml
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: metrics-server-config
应用配置:
kubectl apply -f metrics-server-config.yaml
验证metrics-server部署
- 检查Pod状态:
kubectl get pods -n kube-system | grep metrics-server
预期输出:
metrics-server-7f9c5b8d9d-abcde 1/1 Running 0 5m
- 使用kubectl top命令:
# 查看节点资源使用
kubectl top nodes
# 查看Pod资源使用
kubectl top pods -n kube-system
成功输出示例:
NAME CPU(cores) MEMORY(bytes)
metrics-server-... 15m 45Mi
kube-apiserver-... 250m 512Mi
常见问题与解决方案
问题1:metrics-server启动失败,日志显示"x509: certificate signed by unknown authority"
原因:kubelet使用自签名证书,metrics-server默认验证TLS证书。
解决:在metrics-server启动参数中添加--kubelet-insecure-tls(仅测试环境),或配置CA证书。
问题2:kubectl top命令返回"Error from server (NotFound): pods "xxx" not found"
原因:metrics-server未正确采集到Pod数据,可能是网络策略阻止访问kubelet 10250端口。
解决:检查网络策略,确保metrics-server所在命名空间能访问所有节点的10250端口。
问题3:cAdvisor指标中未包含自定义容器的数据
原因:容器运行时未正确配置CGroup驱动。
解决:确保容器运行时(如Docker)和kubelet使用相同的CGroup驱动(systemd或cgroupfs)。
监控数据的进阶应用
配置HPA实现自动扩缩容
结合metrics-server提供的CPU/内存指标,可实现Pod的自动扩缩容。示例HPA配置:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-server-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-server
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70 # CPU使用率超过70%时扩容
- type: Resource
resource:
name: memory
target:
type: AverageValue
averageValue: 512Mi # 内存平均使用超过512Mi时扩容
集成Prometheus和Grafana
虽然cAdvisor和metrics-server提供了基础监控能力,但生产环境通常需要更强大的存储和可视化工具。可参考docs/projects.md中的Prometheus和Grafana Kubernetes App配置完整监控平台。
总结
cAdvisor和metrics-server是Kubernetes资源监控的"基础设施":cAdvisor负责容器级指标采集,metrics-server实现集群级指标聚合,二者配合为HPA、kubectl top等功能提供数据支撑。通过本文的配置指南,你可以快速搭建基础监控体系,为后续性能优化和故障排查奠定基础。
更多监控工具和最佳实践,可参考项目中的docs/projects.md文档,其中收录了Alertmanager、VictoriaMetrics等进阶工具的配置方法。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



