1. 先聊清楚:Dashboard和Metrics Server到底各管哪一段
很多刚开始接触Kubernetes监控的同学,最容易犯的一个认知错误就是把Dashboard当成一个“什么都能看”的监控大屏。装上Dashboard之后发现页面空空如也,CPU和内存的曲线永远不显示,然后就开始怀疑是不是安装姿势不对。
其实Dashboard本身的设计定位是管理界面,不是数据采集器。它负责把集群里的工作负载、Pod、Service、存储卷这些资源对象以图形化的方式呈现出来,让你不用敲一堆kubectl get命令就能看清楚集群长什么样。但如果你想让Dashboard上的节点卡片和Pod详情页出现CPU、内存的使用曲线和实时数值,那必须有另一个组件在背后默默收集这些指标——这就是Metrics Server。
两者是配合关系:Metrics Server负责“采数”,Dashboard负责“展示”。没有Metrics Server,Dashboard照样能跑,但监控页面就是一片空白;没有Dashboard,Metrics Server照常采集数据,你可以用kubectl top node命令看到同样的指标。
从我实际接触过的不少项目来看,很多团队的Kubernetes集群用的是云厂商托管的版本,默认情况下Metrics Server是不预装的。也就是说,你装完Dashboard之后大概率会遇到“有界面、没数据”的状态。这其实是整个Kubernetes监控体系搭建里最常见的一个入口坑。
Metrics Server解决的是核心指标(CPU和内存)的采集问题。它通过metrics.k8s.io这个API对外提供数据,kubectl top命令和HPA水平自动扩缩容都靠它。Dashboard则是把这份数据消费掉,渲染成图表。搞清楚这层关系之后,后面的所有操作才有了明确的目的——我们要做的不是“装一个监控工具”,而是“打通一条从kubelet到Dashboard的指标链路”。
这条链路的具体走向是这样的:每个节点上的kubelet组件内置了一个叫cAdvisor的容器指标采集器,Metrics Server定时去每个节点的kubelet请求汇总数据,然后聚合后暴露成标准的Kubernetes API,Dashboard再通过这个API读数据画图。
这个链路听起来不复杂,但真正动手部署的时候,版本匹配、证书认证、网络策略这些细节一个都不能漏。下面我从部署顺序讲起,把每一步的关键点和容易踩的坑都摊开说。
2. Metrics Server部署:版本选择与启动参数里容易被忽略的细节
2.1 版本不是越新越好,先看Kubernetes集群的版本号
部署Metrics Server的第一步不是急着下载YAML文件,而是先确认你集群的Kubernetes版本。这点很关键,因为Metrics Server的不同版本对Kubernetes的兼容范围有明确限制。你当然可以直接拉最新版本的组件清单来用,但新版本可能会依赖较新的API特性,在旧集群上会报各种奇怪的错误。
稳妥的做法是去GitHub上Metrics Server仓库的release页面,对照表格里标注的Kubernetes版本范围来选。一般来说,Kubernetes 1.21以上的集群选最新稳定版问题都不大,但如果你的集群还停留在1.18左右的版本,那最好选对应时间段的Metrics Server版本。
我自己曾经在一个模拟项目X的环境里图省事,直接用了最新版Metrics Server去对接一个1.20版本的集群,结果Metrics Server的Pod起来了,但API一直注册不上,日志里反复爆出证书相关的问题。后来换了合适的版本,问题迎刃而解。
2.2 组件清单的获取方式与参数调整
部署Metrics Server:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml这个命令会创建一个名为metrics-server的Deployment、一个Service、一个ClusterRole以及对应的ClusterRoleBinding。注意,默认的components.yaml里有几个参数在多数生产环境下需要调整,最典型的就是--kubelet-insecure-tls。
这个参数的含义很直接:Metrics Server去访问节点上的kubelet时默认会校验TLS证书,但很多自建集群里kubelet的证书签发机构并不是集群CA,或者证书里的IP SAN不包含节点IP,导致校验失败。加了这个参数之后,Metrics Server就不再强制校验kubelet的证书了。
不过这里我要多提醒一句:生产环境不要无脑加这个参数。如果你的集群所有节点证书都是统一由集群CA签发的,完全可以通过正确配置证书来避免跳过校验。但如果是测试环境、临时环境,或者你的kubelet证书配置比较混乱,那这个参数是你排查问题的第一选择。
修改方式如下,编辑Deployment的启动参数:
spec: containers: - name: metrics-server args: - --kubelet-insecure-tls - --kubelet-preferred-address-types=InternalIP--kubelet-preferred-address-types=InternalIP参数也很实用。它告诉Metrics Server优先用节点的内网IP去访问kubelet,而不是用主机名。有些网络环境下主机名无法解析,不加这个参数就会导致Metrics Server连不上kubelet。
2.3 部署后的自检:正确姿势是先看API再开Dashboard
装完之后不要急着装Dashboard,先验证Metrics Server是否真正工作。验证方式就两个命令:
kubectl get apiservices | grep metrics kubectl top node第一条命令检查metrics.k8s.io这个API服务是否注册成功,正常状态应该显示True和Available。如果这行是红色的False,那说明Metrics Server的Pod虽然跑着,但API注册环节出了问题。最常见的元凶就是证书校验失败,按上面的--kubelet-insecure-tls参数调整后一般能解决。
第二条命令是实际拉一次数据。如果它能把每个节点的CPU和内存数值打印出来,那么Metrics Server这块就已经通了。如果数据出不来,不要急着往后走,先回头看Metrics Server的Pod日志:
kubectl logs -n kube-system -l k8s-app=metrics-server日志里通常会有很明确的报错,比如“unable to fetch node metrics for node xxx”或者“dial tcp ... connect: connection refused”。前者大概率是TLS问题,后者往往是kubelet的监听端口或者网络策略的问题。
我第一次搭这套环境的时候,就是在kubectl top node这里卡了一个多小时。后来发现是云平台的安全组规则没放行10250端口,Metrics Server访问kubelet的超时全都折在这里。所以如果你用的是托管集群或者自建的带防火墙环境,别忘了检查节点间的10250端口互通情况。
3. 安装Dashboard并接入监控数据:从零到能看到曲线
3.1 两种安装方式,我建议你这么选
Dashboard的安装方式主要有两种:一种是直接用官方推荐的命令安装,另一种是用Helm Chart安装。我更倾向于用Helm方式,因为后期升级、改参数都方便,而且Helm Chart里的默认配置已经比较合理。
用Helm安装Dashboard:
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard \ --namespace kubernetes-dashboard \ --create-namespace \ --set service.type=NodePort \ --set service.nodePort=30001这里把Service类型设为NodePort,并指定了访问端口30001。生产环境你完全可以用Ingress把Dashboard暴露出来,但为了本地测试和演示方便,NodePort是最直接的方式。如果你只想在本地电脑上看效果,kubectl proxy也能解决问题。
3.2 创建访问账号:这一步很多人嫌麻烦就糊弄过去了
装好Dashboard之后,访问地址会要求你登录。Dashboard支持Token和kubeconfig两种登录方式。如果你用的是云厂商托管集群,kubeconfig登录其实挺方便的,但你得留意kubeconfig里用户的token是否拥有足够的权限。
我更推荐用Token方式登录,因为Token的权限范围你自己说了算,而且在排查问题的时候思路更清晰。创建一个具备管理员权限的ServiceAccount其实并不复杂:
apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard保存为dashboard-admin.yaml,然后执行:
kubectl apply -f dashboard-admin.yaml kubectl -n kubernetes-dashboard create token admin-user第二条命令会直接输出一串Bearer Token,复制到Dashboard的登录页里就能进去了。
这里要提醒一句:cluster-admin是全集群最高权限,日常使用没问题,但如果团队里有多个人共用集群,建议按照最小权限原则给每个成员单独建账号。我自己就在测试环境里图省事创建了一个永不过期的管理员Token,结果某次排查问题时发现其他人也在用这个Token操作集群,安全上心里始终不踏实。
3.3 登录后的期望效果:哪些数据应该出现,哪些数据不该出现
登录Dashboard之后,正常情况下切换左侧菜单到“节点”页面,每个节点卡片上应该显示CPU和内存的使用量和百分比进度条。点进某个节点详情,能看到近一小时的CPU和内存趋势曲线。Pod列表页面同样有这样的展示。
如果你看到的还是“N/A”或者空值,那就说明Metrics Server的数据没有正常透传过来。这时候优先检查Dashboard后端的日志——Dashboard本身不会报错,因为它在Dashboard处理中已经把这些指标当作可选信息,读取失败就静默显示为空。
从实际操作经验来看,“Dashboard显示N/A”的问题,90%以上出在Metrics Server那一侧,而不是Dashboard这一侧。所以排查思路不要先动Dashboard,先回到kubectl top node,确定Metrics Server是否正常,再做下一步。
3.4 最后再补一个实用技巧:如何临时访问Dashboard
如果你不想暴露NodePort,也不想创建Service,只想快速看一眼Dashboard效果,kubectl proxy是最省事的方案:
kubectl proxy然后浏览器打开:
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/这种方式适合本地开发,生产环境不推荐。因为kubectl proxy是单用户会话,多人协作的时候大家共享同一个代理通道,权限边界很难控制。
4. 从Dashboard的图表反向理解指标链路:数据是怎么流转的
很多教程会在你看到曲线图之后就结束了。但我觉得如果你只是停留在“能看图”这一步,后面遇到指标缺失、数值对不上等问题时又会一脸懵。搞清楚指标链路的流转逻辑,排起错来才有方向感。
4.1 一次点击背后的完整数据流
你在Dashboard页面上点开某个Pod的CPU监控曲线,背后大致经历了这样几个环节:
- Dashboard后端向
metrics.k8s.io这个API发请求,路径大致长这样:/apis/metrics.k8s.io/v1beta1/namespaces/<namespace>/pods/<pod-name> - API Server收到请求后,把请求路由给Metrics Server(API服务聚合机制)。
- Metrics Server根据Pod所在的节点,向该节点的kubelet发起请求,拿取Pod对应的容器指标数据。
- kubelet内置的cAdvisor从容器运行时读取cgroup里的CPU和内存统计数据,整理后返回给Metrics Server。
- Metrics Server汇总后返回JSON数据。
- Dashboard拿到JSON数据,通过前端的图表库渲染成曲线。
每一步都可能是故障点。我遇到过一个很典型的案例:某次集群中有个节点的时钟偏移严重,导致该节点返回的数据时间戳混乱,Dashboard上其他节点都正常,唯独那个节点的曲线是断断续续的。当时排查了很久才想到去检查节点时间同步,后来发现是ntpd服务挂了。Kubernetes集群里节点间时钟必须同步,这点在监控场景下尤其重要,因为指标数据都是带时间戳的。
4.2 Metrics Server的缓存机制:为什么你看到的“当前值”会滞后
还有一个大家经常疑问的地方:Dashboard上显示的CPU和内存“当前值”,其实并不是严格意义的实时值。Metrics Server默认是每15秒从kubelet采集一次数据,并且会在自己内存里保留一份缓存。所以你在Dashboard上看到的数值最多可能滞后15到30秒。
但这个特性不影响日常监控和排障判断。真正需要注意的是,Metrics Server的数据只用于实时观测和HPA扩缩容,不应该被当作历史数据存储。你关闭Dashboard页面之后,再打开看到的是重新从当前时刻开始的曲线,中间的历史数据不会保留。如果你想做长期的性能趋势分析、容量规划、历史回溯,需要另外部署类似Prometheus + 存储的方案。
这个区别就像“看仪表盘”和“装行车记录仪”的区别。Metrics Server + Dashboard是前者,告诉你车现在的速度和发动机转速;Prometheus是后者,把全程的数据都录下来供你事后复盘。两者可以共存,各自承担的角色不同。
4.3 为什么某些Pod显示不了指标,但节点显示正常
还有一种情况在混部场景(同一个节点上跑系统组件和业务Pod)下很常见:节点的整体CPU使用率能显示,但某个具体Pod的CPU一直显示N/A。
这种问题通常是Pod启动时间太短的瞬时状态,或者Metrics Server还没从kubelet拉到这个Pod的数据。你可以等15到30秒再刷新看一次。如果一直报错,那就要蹲点看Metrics Server日志,确认是否为权限或网络拦截问题。
另外有一种情况值得一提:static Pod在有些场景下会显示指标,但**镜像Pod(Mirror Pod)**本身的指标归属在Dashboard上可能对不上号。因为镜像Pod只是在API Server里为了展示而存在的一个映射,真正算资源的是节点上跑的那个实际容器。如果遇到这类问题,建议直接看节点维度的数据,别在一个Pod的显示问题上卡太久。
5. 当监控还是“看不到数”时,我总结的一套排查顺序
这部分是我自己踩过不少坑后总结出来的排查路径,逻辑性比较强,你可以直接照着这个顺序走,能省下大量时间。
5.1 指标链路的五级排查法
第一级:检查API服务状态
kubectl get apiservice v1beta1.metrics.k8s.io -o yaml看这个API服务的Conditions,重点看Available是否为True。如果为False,大概率是Metrics Server的Pod有问题,继续往下看。
第二级:检查Metrics Server的Pod是否健康和日志
kubectl get pods -n kube-system -l k8s-app=metrics-server kubectl logs -n kube-system -l k8s-app=metrics-server --tail=50Pod处于CrashLoopBackOff状态的话,日志里十有八九是证书校验或者启动参数非法的问题。Pod运行正常但日志不断刷报错,最常见的是“unable to fetch node metrics”,这就要结合节点与集群的连通性来判断。
第三级:检查kubelet是否正常工作
kubectl get --raw "/healthz/kubelet" | head这个请求直接打向每个节点的kubelet健康检查接口,如果返回的不是OK,说明kubelet本身可能不健康。更直接的办法是看节点状态,kubectl get nodes如果节点已经显示NotReady,那Metrics Server采集不到该节点数据再正常不过。
第四级:验证API Server到kubelet的网络连通性
在Metrics Server的Pod里直接发起请求:
kubectl exec -it -n kube-system metrics-server-xxx -- wget -O- https://<节点IP>:10250/metrics/resource --no-check-certificate这一步能很明确地区分是网络不通还是证书不匹配。
第五级:检查集群的聚合层配置
Kubernetes API Server启动时需要配置--enable-aggregator-routing=true,某些自建集群可能没有打开这个开关。如果API服务器没有正确配置聚合层,Metrics Server的API服务就会注册失败或者超时。
这个排查顺序基本可以覆盖90%以上的“Dashboard没有监控数据”的场景。剩下的10%就是各种版本兼容的特殊情况,处理起来费时费力,但逻辑也是沿着这条链路去核对。
5.2 一个容易误导人的现象:Pod是Running状态,但数据一直不出来
我遇到过几次Metrics Server状态正常、API注册也正常、kubectl top node能输出数据,但Dashboard上就是刷不出节点曲线的情况。
这个现象的核心是Dashboard的权限和网络配置。Dashboard访问Metrics Server的API时,如果Dashboard的ServiceAccount没有相应权限,API请求会被拒绝。这个点经常被忽略,因为你的登录账号是cluster-admin,但Dashboard后端服务用的是自己的ServiceAccount。
解决办法很直接,给Dashboard的ServiceAccount绑定访问监控数据的角色:
kubectl create clusterrolebinding kubernetes-dashboard-metrics \ --clusterrole=view \ --serviceaccount=kubernetes-dashboard:kubernetes-dashboard或者干脆用cluster-admin角色绑上去,省心但权限过大,看你的接受程度。这里要注意命名空间和ServiceAccount名称要以实际情况为准。
6. 结合HPA和真实负载测试:让监控数据发挥实际价值
6.1 用压力测试验证监控链路是否真的通了
光看空跑的Pod曲线其实意义不大,真正验证监控链路可靠性的方式是把负载打上去,看曲线有没有跟着动。
用一条简单的压测命令模拟高CPU负载:
kubectl run cpu-burner --image=busybox -- /bin/sh -c "while true; do :; done"这个Pod会空转CPU,然后你到Dashboard的节点页面观察对应节点的CPU曲线,正常情况下几秒钟内就能看到曲线明显爬升。如果你说到这一步曲线还是平的,那数据链路八成还有问题。
说句题外话,用yes > /dev/null跑一个CPU密集的循环也可以达到类似效果,但busybox镜像更轻量,适合快速测试。
6.2 让HPA动起来:监控数据不只是“用来看”的
Metrics Server采集的指标除了给Dashboard看图,还有一个更重要的用途是驱动HPA。你可以给刚才的cpu-burner部署对象配一个HPA:
kubectl autoscale deployment cpu-burner --cpu-percent=50 --min=1 --max=5这样当负载上升、CPU使用率超过50%阈值时,HPA会自动扩容副本数。你可以通过kubectl get hpa -w实时观察HPA的Targets列,看currentCPUUtilizationPercentage是不是在向50%靠近,以及副本数有没有变化。
这套流程走通之后,你对Metrics Server价值的理解会从“给Dashboard提供数据”升级为“给集群的自动伸缩能力提供决策依据”。这才是核心指标在Kubernetes里的真正地位。
6.3 一个实战细节:HPA和Dashboard看到的数据为什么不同步
有时候你会发现HPA已经扩容了,但Dashboard上的CPU曲线显示好像还没到阈值。这个不一致的原因主要在于计算口径和刷新频率不同。
HPA拿到指标后计算的是一段时间内的平均值,而Dashboard展示的是某个时间点的瞬时值。再加上网络延迟、数据缓存等因素,两者之间有几十秒的偏差是完全正常的。不要在这个细节上过度纠结。
7. 生产环境里Metrics Server和Dashboard的定位与局限
7.1 什么时候这套组合够用,什么时候不够
如果团队的业务对资源监控的需求仅限于“看一眼集群是否健康”,以及“Pod挂了能及时扩容”,那Metrics Server + Dashboard这套组合完全够用。它部署简单、维护成本低、没有额外的存储和告警组件的负担。
但如果你的需求还包括:查看历史趋势、做容量规划、配置复杂告警规则、多集群统一监控,那这套组合就会显得力不从心。这时候你应该考虑引入专门的监控体系。Metrics Server的数据是存在内存里的,进程一重启,历史数据全部清零。它本质上就不是为长期存储设计的。
7.2 两套监控共存时的端口和资源注意点
当你在集群里同时装了Metrics Server和Prometheus全家桶时,要注意两者都在采集节点的核心指标,但因为Metrics Server走的是Kubernetes API聚合层,而Prometheus抓取的是kubelet的/metrics接口,两者互不冲突,可以并行工作。唯一需要注意的是节点上kubelet的资源占用会有所上升,在节点规格偏小的环境下用free -h多观察一下就好。
7.3 Dashboard的权限管控,别让“能看到”变成“能改”
Dashboard本身是个超管利器,但也正因为权限太大,它经常成为安全事故的重灾区。建议从两个层面约束:一是生产环境不要用NodePort暴露Dashboard,尽量走Ingress并配好认证;二是Dashboard的ServiceAccount尽量单集群独立,别为了省事把所有环境的Dashboard共用一套权限。
我见过一些团队把所有环境(测试、预发、生产)都共用一套Dashboard账号,哪怕只是图管理方便,也等于把生产集群的安全边界撕开了一个口子。在这个问题上,宁可初期麻烦一点,也不要把权限敞着用。
8. 我踩过几次坑后的经验总结
整套部署和排查流程走完,我最想分享的经验就这几点。
第一,先确认Metrics Server通了再动Dashboard。这个顺序一旦反了,你会在大屏界面上折腾半天却毫无进展。
第二,遇到问题先看日志,别猜原因。Metrics Server的日志信息其实非常清晰,直接指向问题所在。哪怕只是“Unable to connect to x.x.x.x:10250”这样的报错,也足以告诉你方向。
第三,不要试图让这套轻量方案承载超出它能力范围的职责。如果团队已经开始讨论“历史趋势回溯”“异常告警通知”这些话题,那就可以认真评估专门监控体系了,别在Dashboard上做无谓的期待。
第四,测试环境建议模拟一次节点故障。主动把某个节点上的kubelet停掉,观察Metrics Server的反应和Dashboard的显示,这会让你对这套监控体系的实际容错能力有一个直观的判断。
我在几次实际部署中还有一个小习惯,就是每次部署完成后把kubectl get apiservice和kubectl top node的结果固定保留一份快照。后面如果有人反馈“监控没了”,对着快照一对比,问题出在新接入的节点还是组件配置也就一目了然了。
这套监控方案是整个Kubernetes运维体系里最基础、最轻量的一环,值得你花半小时把它彻底搞清楚。