Kuboard部署Metrics Server时443端口异常的诊断与修复指南

张开发
2026/4/13 6:22:34 15 分钟阅读

分享文章

Kuboard部署Metrics Server时443端口异常的诊断与修复指南
1. 问题现象与初步排查最近在通过Kuboard部署Metrics Server时遇到了一个典型问题集群监控数据无法正常显示执行kubectl top nodes命令时返回错误the server is currently unable to handle the request。这种情况在实际部署中相当常见特别是使用Kuboard这种图形化管理工具时。首先我们需要理解Metrics Server的工作原理。它相当于Kubernetes的仪表盘负责收集节点和Pod的CPU、内存等资源指标。当它出现问题时不仅会影响命令行工具还会导致Kuboard控制台的资源监控面板显示异常。我按照标准流程做了初步检查确认metrics-server Pod状态正常检查APIService资源状态查看Pod日志在metrics-server的日志中发现了关键线索I0515 08:08:43.918797 1 serving.go:312] Generated self-signed cert (/tmp/apiserver.crt, /tmp/apiserver.key) I0515 08:08:44.589845 1 secure_serving.go:116] Serving securely on [::]:4443这表明metrics-server实际上是在4443端口监听而不是默认的443端口。2. 深入分析443端口问题2.1 网络连通性测试通过kubectl检查APIService资源时发现了明确的错误信息status: conditions: - message: - failing or missing response from https://10.104.148.145:443/apis/metrics.k8s.io/v1beta1: Get https://10.104.148.145:443/apis/metrics.k8s.io/v1beta1: dial tcp 10.104.148.145:443: connect: connection refused reason: FailedDiscoveryCheck status: False type: Available我手动测试了443端口的连通性curl -ik https://10.104.148.145:443/apis/metrics.k8s.io/v1beta1确实返回了connection refused错误。但有趣的是当我测试4443端口时curl https://10.51.13.60:4443 --insecure虽然返回了403错误但至少证明端口是可达的。这种差异就是问题的关键所在。2.2 服务配置检查查看metrics-server的Service定义发现了配置不一致的问题spec: clusterIP: 10.104.148.145 ports: - name: https port: 443 # 对外暴露的端口 protocol: TCP targetPort: 4443 # 实际监听的端口 selector: k8s-app: metrics-server这种配置意味着外部通过443端口访问但请求会被转发到Pod的4443端口问题在于Pod根本没有监听443端口3. 解决方案与实施步骤3.1 方案一修改Service配置最直接的解决方案是保持Pod监听4443端口不变仅修改Service配置编辑metrics-server的Servicekubectl edit svc metrics-server -n kube-system将port和targetPort都改为4443ports: - name: https port: 4443 protocol: TCP targetPort: 4443同时需要修改APIService的定义kubectl edit apiservice v1beta1.metrics.k8s.io将spec.service.port从443改为4443。3.2 方案二调整Pod启动参数另一种方法是让metrics-server监听443端口修改metrics-server的Deploymentkubectl edit deploy metrics-server -n kube-system在容器参数中添加args: - --secure-port443 - --cert-dir/tmp同时保持Service配置不变port:443 → targetPort:4433.3 方案对比与选择两种方案的优缺点对比方案优点缺点修改Service无需重启Pod改动最小需要修改APIService配置调整Pod参数符合默认配置规范需要重建Pod根据我的经验方案一更为稳妥因为metrics-server默认使用4443端口有其合理性避免与API Server冲突不需要改动Pod的证书生成逻辑修改Service配置影响范围更小4. 验证与后续处理实施方案一后验证步骤如下检查APIService状态kubectl get apiservice v1beta1.metrics.k8s.io -o yaml应该看到Available状态变为True。测试指标接口curl -k https://service-ip:4443/apis/metrics.k8s.io/v1beta1验证kubectl top命令kubectl top nodes检查Kuboard控制台 监控数据应该能够正常显示节点资源利用率图表会开始更新。如果仍然遇到问题可以检查网络策略是否允许4443端口通信节点防火墙规则metrics-server的日志是否有证书相关错误5. 问题根源与预防措施这个问题的根本原因在于Kuboard部署的metrics-server使用了非标准端口。经过分析这通常是由于安全考虑避免与API Server的443端口冲突证书配置自签名证书通常与特定端口绑定版本差异不同Kubernetes版本的默认配置可能不同为避免类似问题建议部署前检查官方文档的配置要求使用--v6参数查看详细的API请求日志在测试环境验证配置后再上生产对于使用Kuboard的用户可以在集群概览→组件状态中提前检查metrics-server的健康状态比命令行更直观。6. 高级调试技巧当标准解决方案不奏效时可以尝试以下高级调试方法端口转发直接测试Podkubectl port-forward -n kube-system metrics-server-xxxx 4443:4443 curl -k https://localhost:4443/apis/metrics.k8s.io/v1beta1检查Endpoint是否正常kubectl get endpoints metrics-server -n kube-system查看kube-apiserver日志journalctl -u kube-apiserver -f | grep metrics使用临时Pod进行网络测试kubectl run -it --rm testpod --imagenicolaka/netshoot -- /bin/bash curl -vk https://metrics-server.kube-system.svc:4437. 相关配置参数详解metrics-server有几个关键启动参数会影响端口配置--secure-port: 指定监听端口默认4443--cert-dir: 证书目录默认/tmp--tls-cert-file/--tls-private-key-file: 自定义证书路径在Kuboard的安装配置中可以通过修改metrics-server的Deployment来调整这些参数。例如要强制使用443端口可以添加args: - --secure-port443 - --cert-dir/certs volumeMounts: - mountPath: /certs name: certs-vol volumes: - name: certs-vol secret: secretName: metrics-server-certs这种配置方式更适合生产环境因为它使用固定端口证书持久化存储可以通过Secret管理证书8. 典型错误与解决方法在实际操作中可能会遇到以下常见错误x509证书错误 解决方法添加--kubelet-insecure-tls参数或配置正确的CA证书权限不足 解决方法检查RBAC配置确保ServiceAccount有足够权限网络不通 解决方法检查Calico/Flannel网络插件是否正常工作资源不足 解决方法调整metrics-server的资源请求/限制对于Kuboard特有的问题可以检查控制台集群设置中的组件状态页面它通常会给出更友好的错误提示。

更多文章