
系列专栏《深入剖析 Kubernetes》· 基于张磊极客时间专栏思想整理 · 适合 CSDN 发布12 | 监控日志与 HPA 弹性伸缩前面我们靠replicas: 3手动定副本数。但流量是波动的白天高峰要 10 个 Pod凌晨只要 2 个。靠人盯着改不现实。本篇讲清楚 K8s 怎么自己看指标、自己扩缩容以及日志怎么收。一、监控体系三件套K8s 的指标链路有清晰的分工容器/Pod 运行时 | | 暴露原始指标 (cAdvisor 内置在 kubelet) v ------------------ 聚合 ------------------- | Metrics Server | ------- | cAdvisor / kubelet| | (核心指标: CPU/ | | (每节点采集容器) | | 内存) | ------------------- ------------------ | /apis/metrics.k8s.io v ------------------ | HPA | 读取核心指标做扩缩 ------------------ 自定义/业务指标: ------------------ | Prometheus | 抓取任意指标(Custom Metrics API) ------------------ | v HPA(v2) 也能基于 Prometheus 提供的自定义指标扩缩cAdvisor集成在 kubelet 里自动采集每个容器的 CPU/内存/网络无需额外装。Metrics Server把 cAdvisor 数据聚合成 K8s APImetrics.k8s.io是 HPA 默认的核心指标来源。安装kubectl apply -f components.yaml官方 metrics-server 仓库。Prometheus采集自定义/业务指标QPS、队列长度、延迟通过Custom Metrics API喂给 HPA。二、HPA基于指标的自动扩缩HPAHorizontal Pod Autoscaler监听指标自动改 Deployment 的replicas。apiVersion:autoscaling/v2kind:HorizontalPodAutoscalermetadata:name:nginx-hpaspec:scaleTargetRef:apiVersion:apps/v1kind:Deploymentname:nginx# 目标自动调这个 Deployment 的副本minReplicas:2maxReplicas:10metrics:-type:Resourceresource:name:cputarget:type:UtilizationaverageUtilization:50# 当 Pod 平均 CPU 使用率 50% 就扩容behavior:# 扩缩行为调优v2 新增scaleUp:stabilizationWindowSeconds:0policies:-type:Percentvalue:100# 扩容最多一次翻倍periodSeconds:15scaleDown:stabilizationWindowSeconds:300# 缩容冷静 5 分钟防抖动policies:-type:Podsvalue:2periodSeconds:60# 每分钟最多缩 2 个关键参数解释scaleTargetRefHPA 控制谁必须是带 replicas 的控制器如 Deployment。averageUtilization: 50指requests 的百分比。所以目标 Deployment 必须设resources.requests.cpu否则 HPA 算不出利用率。behavior扩缩节奏。stabilizationWindowSeconds防止指标抖动导致反复横跳scaleDown通常比scaleUp保守避免刚缩完又暴涨。常用命令kubectl get hpa# 看当前指标与副本kubectl describe hpa nginx-hpa# 看扩缩事件与原因kubectl autoscale deployment nginx --cpu-percent50--min2--max10# 快捷创建也可基于内存或自定义指标如type: Pods指定某个 metric 的目标值由 Prometheus Adapter 提供。真实集群实测HPA 把 2 副本打到 10 副本在本文配套的 4 节点真实集群v1.28.2上我们用nginx:1.25仅设requests.cpu: 100m HPA(min2,max10,target50%) 实测# 负载施加前基线 NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS hpa-demo Deployment/hpa-demo 0%/50% 2 10 2 # 两个 Pod 内制造 CPU 忙循环后约 100s NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS hpa-demo Deployment/hpa-demo 200%/50% 2 10 10副本从2 自动扩到 10命中maxReplicas且均衡散落到 3 个 Worker。kubectl top也在装好 Metrics Server 后正常输出节点/ Pod 真实指标。完整部署步骤、YAML 与踩坑404/503/RBAC/镜像分发见实战篇 14Metrics Server 部署与 HPA/Ingress 实测。三、自定义指标Custom Metrics实战思路单纯 CPU 不够用时比如按每秒请求数扩缩流程是应用暴露/metricsPrometheus 格式prometheus-adapter把 Prometheus 指标注册为 K8s 的custom.metrics.k8s.ioHPA 的metrics里写type: Pods 指标名 目标值。这样QPS 到 1000 就加 Pod就成了现实而不只是看 CPU。四、容器日志收集链路K8s 规定容器把日志打到标准输出stdout/stderr由运行时如 containerd重定向到节点文件再由 DaemonSet 统一采集。容器 app | 写 stdout/stderr v containerd 重定向 | v Node: /var/log/containers/*.log (软链到 /var/lib/docker/containers/...) | | DaemonSet 在每个 Node 跑一个采集器 v ------------------ | Fluent Bit | 解析/过滤/打标签 | (DaemonSet, 每节点1份) ------------------ | v Kafka / Elasticsearch / Loki (集中存储与检索)为什么用DaemonSet因为日志采集是每节点一份的 node 级任务见第 07 篇 DaemonSet 专题DaemonSet 保证集群里每个或匹配的Node 上都恰好跑一个采集 Pod。Fluent Bit 最简 DaemonSet 片段apiVersion:apps/v1kind:DaemonSetmetadata:name:fluent-bitnamespace:loggingspec:selector:matchLabels:{app:fluent-bit}template:metadata:labels:{app:fluent-bit}spec:containers:-name:fluent-bitimage:fluent/fluent-bit:3.0volumeMounts:-name:varlogmountPath:/var/log# 挂载节点日志目录-name:containersmountPath:/var/lib/containersvolumes:-name:varloghostPath:{path:/var/log}# 直接用宿主机路径-name:containershostPath:{path:/var/lib/containers}参数解释kind: DaemonSet每个 Node 自动部署一个采集器新增 Node 也会自动补。hostPath把节点上的/var/log挂进容器才能读到其他容器的日志文件。采集器把日志打上 Pod/Node/Namespace 标签后发往后端便于检索。五、从食之无味到弹性伸缩实战很多团队初期觉得 HPA食之无味——配了不生效、扩缩不灵敏。常见坑没设resources.requestsHPA 基于 requests 算利用率缺它直接不工作。伸缩太激进/太保守用behavior的 stabilizationWindow 调冷静期。只盯 CPUWeb 服务更该用 QPS 自定义指标。日志不收集故障复盘没数据。按本文第四节先把 DaemonSet 采集打通。把监控Metrics Server/Prometheus、弹性HPA、日志DaemonSet Fluent Bit三件摆正应用才真正活在 K8s 上。小结 / 核心要点监控三件套cAdvisor采集→ Metrics Server核心指标 API→ HPA扩缩Prometheus 提供自定义指标。HPA v2 基于scaleTargetRef自动改副本核心指标默认是 CPU/内存利用率相对 requests。behavior控制扩缩节奏用 stabilizationWindow 防抖动缩容比扩容更保守。自定义指标QPS 等通过prometheus-adapter接入让扩缩更贴合业务。日志链路容器 stdout → 节点/var/log/containers→ DaemonSetFluent Bit采集 → 集中存储。HPA 生效前提目标 Deployment 必须配置resources.requests。