从Dashboard到Metrics-Server:Kubernetes 1.18.6集群可视化监控实战指南
当你成功搭建Kubernetes集群后,接下来的挑战是如何有效管理和监控这个复杂的系统。就像驾驶一辆高性能跑车,如果没有仪表盘和监控系统,你将无法了解引擎状态、油量消耗或行驶速度。本文将带你从零开始,为你的Kubernetes 1.18.6集群安装"仪表盘"(Dashboard)和"监控仪表"(Metrics-Server),实现集群状态的可视化监控。
1. Kubernetes Dashboard:集群管理的可视化控制台
Kubernetes Dashboard是官方提供的Web用户界面,它让你能够:
- 直观查看集群资源使用情况
- 部署容器化应用到集群
- 排查和解决问题
- 管理集群资源
1.1 部署Dashboard的三种方式对比
在部署Dashboard前,我们先了解不同部署方式的优缺点:
| 部署方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 官方recommended.yaml | 简单直接 | 默认配置较基础 | 快速测试环境 |
| 自定义NodePort | 可直接通过节点IP访问 | 需要管理证书 | 开发/测试环境 |
| Ingress + TLS | 统一入口,安全性高 | 配置复杂 | 生产环境 |
对于大多数场景,我们推荐使用自定义NodePort方式,它提供了良好的平衡。
1.2 详细部署步骤
首先,下载官方推荐的Dashboard部署文件:
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta5/aio/deploy/recommended.yaml -O dashboard.yaml接下来,我们需要修改这个文件以支持NodePort访问。找到Service部分,修改为:
kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kubernetes-dashboard spec: type: NodePort ports: - port: 443 targetPort: 8443 nodePort: 30008 selector: k8s-app: kubernetes-dashboard注意:nodePort范围默认为30000-32767,确保选择的端口未被占用
1.3 证书配置最佳实践
默认情况下,Dashboard会使用自动生成的证书,但这可能导致浏览器警告。我们可以创建自定义证书:
mkdir -p dashboard-certs && cd dashboard-certs openssl genrsa -out dashboard.key 2048 openssl req -new -key dashboard.key -out dashboard.csr -subj '/CN=dashboard-cert' openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt -days 365 kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard1.4 创建管理员账户
Dashboard默认使用RBAC进行权限控制,我们需要创建具有足够权限的ServiceAccount:
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ServiceAccount metadata: name: dashboard-admin namespace: kubernetes-dashboard labels: k8s-app: kubernetes-dashboard EOF cat <<EOF | kubectl apply -f - apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: dashboard-admin-bind-cluster-role labels: k8s-app: kubernetes-dashboard roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: dashboard-admin namespace: kubernetes-dashboard EOF获取访问令牌:
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk '{print $1}')1.5 访问与使用技巧
现在可以通过https://<节点IP>:30008访问Dashboard。登录后,你会发现几个实用功能:
- 工作负载视图:直观展示Deployment、Pod等资源状态
- 资源使用图表:显示CPU/内存使用趋势(需Metrics-Server支持)
- 事件查看器:帮助排查Pod启动失败等问题
- YAML编辑器:直接修改资源定义
安全提示:生产环境应考虑配置Ingress和更严格的网络策略限制访问
2. Metrics-Server:集群资源监控的核心组件
Metrics-Server是Kubernetes集群资源使用数据的聚合器,它:
- 从各节点的kubelet收集CPU/内存指标
- 通过Metrics API暴露数据
- 支持Horizontal Pod Autoscaler (HPA)
- 为Dashboard提供资源使用数据
2.1 部署Metrics-Server的常见问题
在部署Metrics-Server时,开发者常遇到以下问题:
- 证书验证失败:节点kubelet使用自签名证书
- 网络连接问题:Metrics-Server无法访问节点
- 数据延迟:指标更新不及时
- 资源不足:Metrics-Server自身资源限制过低
2.2 详细部署步骤
下载官方部署文件:
git clone https://github.com/kubernetes-sigs/metrics-server.git cd metrics-server/deploy/1.8+/修改metrics-server-deployment.yaml,添加关键参数:
args: - --cert-dir=/tmp - --secure-port=4443 - --kubelet-insecure-tls - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname这些参数解决了以下问题:
--kubelet-insecure-tls:跳过kubelet证书验证--kubelet-preferred-address-types:指定连接kubelet的地址类型
应用所有配置文件:
kubectl apply -f .2.3 验证安装
等待1-2分钟后,检查Metrics-Server状态:
kubectl get pods -n kube-system | grep metrics-server kubectl top nodes如果一切正常,你将看到类似输出:
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% k8s-master 256m 12% 2002Mi 52% k8s-node1 103m 5% 1334Mi 34%2.4 性能调优建议
对于大型集群,可能需要调整Metrics-Server的资源限制:
resources: requests: cpu: 100m memory: 200Mi limits: cpu: 500m memory: 500Mi同时,可以调整指标解析频率(默认60秒):
args: - --metric-resolution=30s3. Dashboard与Metrics-Server集成
成功部署两者后,Dashboard将自动显示资源使用指标。你可以在Dashboard中:
- 查看节点资源使用热图
- 监控Pod的CPU/内存消耗
- 设置资源使用警报阈值
- 分析历史使用趋势
3.1 常见集成问题排查
如果Dashboard中看不到资源指标,检查以下方面:
Metrics-Server是否正常运行:
kubectl logs -n kube-system $(kubectl get pods -n kube-system | grep metrics-server | awk '{print $1}')API服务是否可用:
kubectl get apiservices | grep metrics节点kubelet是否健康:
kubectl get nodes -o wide
3.2 高级监控方案
对于生产环境,可以考虑以下增强方案:
- Prometheus + Grafana:提供更丰富的监控指标和可视化
- 自定义指标采集:支持基于业务指标的自动扩缩容
- 长期存储:使用Thanos或VictoriaMetrics存储历史数据
- 告警系统:集成Alertmanager实现异常告警
4. 安全加固与最佳实践
4.1 Dashboard安全建议
- 启用HTTPS:始终使用HTTPS访问Dashboard
- 限制访问IP:通过NetworkPolicy限制访问来源
- 定期轮换令牌:管理员令牌应定期更新
- 审计日志:记录所有管理操作
- 最小权限原则:为不同用户分配精确的RBAC权限
4.2 Metrics-Server安全配置
启用证书认证(替代--kubelet-insecure-tls):
# 创建证书签名请求 cat <<EOF | kubectl apply -f - apiVersion: certificates.k8s.io/v1beta1 kind: CertificateSigningRequest metadata: name: metrics-server spec: groups: - system:nodes - system:authenticated usages: - digital signature - key encipherment - server auth request: $(cat server.csr | base64 | tr -d '\n') EOF # 批准请求 kubectl certificate approve metrics-server配置网络策略:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: metrics-server-allow namespace: kube-system spec: podSelector: matchLabels: k8s-app: metrics-server ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kubernetes-dashboard policyTypes: - Ingress
4.3 监控系统维护
- 定期升级:保持组件版本与集群同步
- 资源监控:监控监控系统本身的资源使用
- 备份配置:定期备份Dashboard和Metrics-Server的配置
- 性能基准测试:在大规模集群前进行压力测试
5. 真实案例:电商平台监控实践
某电商平台在黑色星期五促销期间,通过完善的Kubernetes监控系统成功应对了流量高峰。他们的架构包括:
- Dashboard:实时查看所有服务的状态
- Metrics-Server:提供基础资源指标
- HPA:基于CPU/内存指标自动扩缩容
- 自定义指标:基于QPS进行更精确的扩缩容
关键配置:
apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: frontend-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: frontend minReplicas: 3 maxReplicas: 20 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 60 - type: External external: metric: name: requests_per_second selector: matchLabels: app: frontend target: type: AverageValue averageValue: 500这套系统帮助他们实现了:
- 秒级自动扩缩容响应
- 资源利用率提高40%
- 零人工干预应对流量高峰
6. 故障排除指南
6.1 Dashboard常见问题
问题1:无法访问Dashboard,连接被拒绝
- 检查Service类型和端口:
kubectl get svc -n kubernetes-dashboard - 验证节点防火墙规则
- 检查kube-proxy是否正常运行
问题2:登录后显示"没有权限"
- 验证ServiceAccount和ClusterRoleBinding
- 检查令牌是否过期
- 确认上下文是否正确:
kubectl config current-context
6.2 Metrics-Server常见问题
问题1:kubectl top返回"metrics not available yet"
- 检查Metrics-Server日志:
kubectl logs -n kube-system deployment/metrics-server - 验证APIService是否注册:
kubectl get apiservice v1beta1.metrics.k8s.io -o yaml - 检查节点kubelet状态:
journalctl -u kubelet -n 50 --no-pager
问题2:指标数据不准确或延迟高
- 调整Metrics-Server的
--metric-resolution参数 - 增加Metrics-Server资源限制
- 检查节点负载情况
7. 版本升级与兼容性
7.1 Kubernetes 1.18.6特定注意事项
- Dashboard版本:推荐使用v2.0.0+
- Metrics-Server版本:v0.3.6+
- API兼容性:
- metrics.k8s.io/v1beta1
- dashboard v1.10.1+ API
7.2 升级路径
备份现有配置:
kubectl get all,sa,secret,configmap -n kubernetes-dashboard -o yaml > dashboard-backup.yaml kubectl get all,sa,secret,configmap -n kube-system -l k8s-app=metrics-server -o yaml > metrics-server-backup.yaml逐步升级策略:
- 先升级Metrics-Server
- 验证指标收集正常
- 再升级Dashboard
- 测试所有功能
回滚计划:
kubectl apply -f dashboard-backup.yaml kubectl apply -f metrics-server-backup.yaml
8. 扩展阅读与资源
8.1 官方文档
- Kubernetes Dashboard GitHub
- Metrics-Server文档
- Kubernetes监控架构
8.2 性能优化工具
- kube-state-metrics:生成关于集群状态的指标
- node-exporter:收集节点级指标
- cAdvisor:容器监控工具(已集成到kubelet)
8.3 社区最佳实践
监控分层架构:
- 基础设施层:节点资源
- 容器层:Pod/Container指标
- 应用层:业务指标
告警策略:
- 设置多级阈值(Warning/Critical)
- 避免告警风暴
- 实现告警抑制和分组
可视化原则:
- 每个仪表盘聚焦一个主题
- 使用一致的配色方案
- 包含必要的上下文信息
9. 未来趋势与替代方案
随着Kubernetes生态的发展,监控方案也在不断演进:
- eBPF技术:更高效的内核级监控
- OpenTelemetry:统一的监控标准
- 服务网格集成:Istio/Linkerd提供的监控能力
- AI驱动的异常检测:自动识别异常模式
对于需要更强大监控功能的用户,可以考虑:
- Prometheus Operator:简化Prometheus部署
- Thanos:提供长期存储和全局视图
- Grafana Loki:日志监控解决方案
- Elastic Kubernetes Monitoring:全栈可观测性
10. 总结与实操建议
通过本文,你已经掌握了在Kubernetes 1.18.6集群上部署Dashboard和Metrics-Server的完整流程。在实际操作中,建议:
- 从小规模开始:先在测试环境验证配置
- 自动化部署:将配置代码化,便于重复使用
- 文档记录:记录所有自定义配置和决策原因
- 监控监控系统:确保监控系统本身健康运行
- 持续优化:根据实际使用情况调整参数
记住,好的监控系统应该:
- 提供准确的实时数据
- 帮助快速定位问题
- 支持容量规划
- 不影响被监控系统性能