windows 部署cAdvisor
离线部署cAdvisor
安装之前小操作:
删除之前安装: kubectl delete -f D:\KTKJ\cAdvisor\cadvisor-daemonset.yaml kubectl delete -f D:\KTKJ\cAdvisor\cadvisor-svc.yaml 清除镜像: 验证: kubectl get pods -n monitoring -l app=cadvisor 检查 Service 是否还存在 kubectl get svc -n monitoring | select-string cadvisor 验证prometheus 能否访问cAdvisor: kubectl exec -it prometheus-prometheus-kube-prometheus-prometheus-0 -n monitoring -- sh wget -qO- http://cadvisor.monitoring.svc.cluster.local:8080/metrics 是否输出包含container .... 有的话就可配置抓取规则了
一、安装cAdvisor(内网环境适配)
离线部署cAdvisor
在外网环境中下载镜像并保存为离线包:
docker pull gcr.io/cadvisor/cadvisor:v0.39.3 docker save -o cadvisor.tar gcr.io/cadvisor/cadvisor:v0.39.3 将cadvisor.tar传输至内网,加载镜像:
docker load -i cadvisor.tar 创建DaemonSet部署cAdvisor
编写cadvisor-daemonset.yaml(关键配置):
应用配置: kubectl apply -f /地址/cadvisor-daemonset.yaml kubectl delete pod -l app=cadvisor -n monitoring --删除让其重新生成
验证DaemonSet运行状态 kubectl get pods -n monitoring -l app=cadvisor
二、与Prometheus集成
cadvisor-svc.yaml
-
apiVersion: v1 kind: Service metadata:name: cadvisornamespace: monitoring spec:selector:name: cadvisorports: - protocol: TCPport: 8080targetPort: 8080type: ClusterIP
kubectl apply -f /地址/cadvisor-svc.yaml
若使用Helm部署Prometheus,在values.yaml中添加以下配置: 修改Prometheus抓取配置
##additionalScrapeConfigs: []additionalScrapeConfigs:- job_name: 'node-exporter'static_configs:- targets:- 'prometheus-prometheus-node-exporter.monitoring.svc.cluster.local:9100'- job_name: 'cadvisor'kubernetes_sd_configs:- role: podrelabel_configs:- source_labels: [__meta_kubernetes_pod_label_app]regex: cadvisoraction: keep- source_labels: [__meta_kubernetes_pod_container_name]regex: cadvisoraction: keep- source_labels: [__address__]target_label: instance
更新Helm Release:
--helm upgrade prometheus prometheus-community/prometheus -f values.yaml helm upgrade prometheus ./kube-prometheus-stack -f D:\KTKJ\Prometheus\kube-prometheus-stack\values.yaml --namespace monitoring
验证Prometheus抓取状态
访问Prometheus Web界面(http://localhost:9090/targets),确认cadvisor任务状态为UP24。
三、网络流量监控指标使用
核心网络指标
接收流量:container_network_receive_bytes_total{namespace="<命名空间>", pod="<Pod名称>"} 发送流量:container_network_transmit_bytes_total{namespace="<命名空间>", pod="<Pod名称>"}15 Grafana仪表板配置
导入官方模板(Dashboard ID 14282),或自定义面板: promql sum(rate(container_network_receive_bytes_total{namespace="$namespace"}[5m])) by (pod)
四、内网部署注意事项
镜像仓库替代方案
若内网存在私有镜像仓库(如Harbor),推送镜像并修改YAML中的镜像地址:
image: <私有仓库地址>/cadvisor:v0.39.3 安全策略与资源限制
启用privileged: true(若因权限问题采集失败):
securityContext: privileged: true 添加资源限制(防止资源耗尽): yaml Copy Code resources: limits: cpu: "500m" memory: "512Mi"
五、常见问题排查
cAdvisor无法挂载宿主机路径:检查路径是否存在(如/var/lib/docker),确保Windows Docker Desktop使用Linux容器模式67。 Prometheus抓取失败:通过kubectl port-forward临时转发端口,验证cAdvisor的/metrics端点是否可达28。 指标数据延迟:调整Prometheus的scrape_interval(默认15秒),降低采集间隔至5s
六 Java代码实现
/**** 查询 Pod 的网络流量(接收字节)* @param podName* @return*/ @Override public BigDecimal queryNetworkReceiveBytes(String podName){try {String query = "sum(rate(container_network_receive_bytes_total{pod=\"" + podName + "\",container!=\"POD\"}[1m])) by (pod)";BigDecimal bytesPerSecond = fetchMemoryMetric(query);BigDecimal kbPerSecond = bytesPerSecond.divide(BigDecimal.valueOf(1024), 2, RoundingMode.HALF_UP); // 保留两位小数return kbPerSecond; } catch (Exception e) {e.printStackTrace();}return BigDecimal.ZERO; } /**** 查询 Pod 的网络流量(发送字节)* @param podName* @return*/ @Override public BigDecimal queryNetworkTransmitBytes(String podName){try {String query = "sum(rate(container_network_transmit_bytes_total{pod=\"" + podName + "\",container!=\"POD\"}[1m])) by (pod)";BigDecimal bigDecimal = fetchMemoryMetric(query);BigDecimal kbBigDecimal = bigDecimal.divide(BigDecimal.valueOf(1024), 2, RoundingMode.HALF_UP); // 保留两位小数return kbBigDecimal;} catch (Exception e) {e.printStackTrace();}return BigDecimal.ZERO; }