一、监控集群资源利用率
1. Metrics Server工作流程图
- 工作原理:
- 数据采集: 从每个节点的Kubelet API收集指标,通过Kubernetes聚合器注册在Master APIServer中
- 功能定位: 为集群提供Node、Pods资源利用率指标,项目地址:https://github.com/kubernetes-sigs/metrics-server
- 工作流程: kubectl top → API server → metrics-server(pod) → 所有节点kubelet(cadvisor指标接口) → 所有容器资源利用率
- 核心组件:
- kubelet/cadvisor: 每个工作节点暴露的指标接口
- 聚合器特性: 聚合所有节点指标数据并进行整理后提供
2. 使用Metrics Server
1)Metrics Server概述
-
应用案例
- 部署必要性: 必须部署Metrics Server才能使用kubectl top查看pod和节点的资源利用率
- 典型场景:
- CPU/Memory基础的水平自动扩展(HPA)
- 自动调整/建议容器所需资源(VPA)
-
项目文件下载
- 获取方式:
- 官方推荐从GitHub下载YAML文件:wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml
- 国内访问建议:可能需要科学上网,或使用已下载好的文件
- 版本兼容性:
- 0.6.x支持Kubernetes 1.19+
- 0.5.x支持Kubernetes 1.8+
- 0.4.x支持Kubernetes 1.8+
- 0.3.x支持Kubernetes 1.8-1.21
2)检查是否部署成功
- 验证方法:
- kubectl get apiservices |grep metrics 查看状态是否为True
- kubectl get -raw /apis/metrics.k8s.io/v1beta1/nodes 检查是否能返回JSON格式的节点指标数据
- 关键参数:
- --kubelet-insecure-tls: 不验证kubelet提供的https证书(内网通信时可安全使用)
- --cert-dir=/tmp: 指定证书目录
- --secure-port=4443: 指定安全端口
3)使用示例
- 常用命令:
- kubectl top node: 查看节点资源使用情况
- kubectl top pod: 查看pod资源使用情况
- 添加--use-protocol-buffers参数可避免JSON格式警告
- 指标解读:
- CPU单位:m表示毫核,1000m=1个CPU核心
- 内存单位:Mi表示Mebibyte(1024×1024字节)
- 显示的是所有容器资源占用的汇总数据
- 注意事项:
- 默认15秒采集一次指标
- 不适合作为监控解决方案的数据源(应直接从kubelet/metrics/resource获取)
- 单实例可支持最多5000节点的集群
二、管理K8s组件日志
- 日志分类:
- K8S系统组件日志
- K8S Cluster中部署的应用程序日志
- 标准输出
- 日志文件
1. 查看容器日志的输出
- 基本命令:kubectl logs <pod_name> -n <namespace>
- 使用场景:当Pod处于非Running状态时,应第一时间查看日志
- 注意事项:
- 必须指定命名空间(-n参数)
- 可查看应用程序的错误输出
- 是排查Pod问题的主要手段
- 组件运行方式:
- 除kubelet外,其他K8S组件都以Pod形式运行
- 这些系统组件都部署在kube-system命名空间下
- 包含网络组件、DNS、数据库等核心组件
2. 查看非容器日志的输出
- kubelet日志:
- kubelet是唯一不以容器形式运行的核心组件
- 通过systemd管理,使用journalctl -u kubelet查看日志
- 二进制部署的组件也采用这种方式查看日志
3. 查看节点日志的输出
- 节点状态检查:
- 使用kubectl get node查看节点状态
- 若节点未就绪(NotReady),通常是kubelet出现问题
- 需要结合kubelet日志和系统日志排查
4. 查看系统日志的输出
- 系统日志位置:/var/log/messages
- 查看方法:使用tail -f /var/log/messages实时查看
- 注意事项:
- 不是所有应用都会将日志写入系统日志
- 主要用于辅助排查系统级问题
- 当其他日志没有明显错误时,可作为补充排查手段
- 日志查看策略:
- 容器化组件:使用kubectl logs
- systemd管理组件:使用journalctl -u
- 系统级问题:查看/var/log/messages
- 多维度日志分析能更有效定位问题
三、管理K8s应用日志
1. 查看容器标准输出日志
基本命令:使用kubectl logs <Pod名称>查看容器标准输出日志
- 实时查看:添加-f参数实现类似tail -f的效果,如kubectl logs -f metrics-server
- 日志路径:标准输出日志在宿主机的路径为/var/lib/docker/containers/<container-id>/<container-id>-json.log
- 日志获取流程:
- 流程说明:kubectl logs请求→API Server→kubelet→docker→获取容器日志
- 接管机制:容器标准输出被docker接管并持久化到文件中
- 限制:只能获取标准输出日志,无法获取应用程序写入文件的日志
- 日志文件查看:
- 先通过kubectl get pods -o wide确定Pod所在节点
- 登录对应节点后进入/var/lib/docker/containers/目录
- 使用docker ps |grep <服务名>查找容器ID
- 查看对应容器ID目录下的<container-id>-json.log文件
2. 查看容器日志文件
- 终端访问:使用kubectl exec -it <Pod名称> -- bash进入容器终端
- 日志类型区分:
- 标准输出:被docker接管,可通过kubectl logs查看
- 日志文件:应用程序直接写入文件的日志,需要进入容器查看
- 系统日志分类:
- systemd管理组件:使用journalctl -u kubelet查看
- Pod部署组件:如kubectl logs kube-proxy-btz4p -n kube-system
- 系统日志文件:路径为/var/log/messages
四、管理K8s应用日志
1. 查看容器标准输出日志
- Docker日志托管机制:容器标准输出日志会被Docker接管并持久化存储,通过kubectl logs命令获取的日志实际上是Docker解析后的标准输出内容
- 日志查看命令:
- kubectl logs <Pod名称>:查看Pod的标准输出日志
- kubectl logs -f <Pod名称>:实时跟踪日志输出
- 日志存储路径:标准输出日志存储在宿主机/var/lib/docker/containers/<container-id>/目录下,每个容器对应一个日志文件
- 日志格式特点:Docker会将日志转换为JSON格式存储,包含时间戳、日志内容和输出流类型等信息
- 日志解析过程:Docker会将原始的JSON格式日志解析为易读的文本格式输出
- 日志内容对应:通过kubectl logs查看的日志内容与容器内程序直接输出的日志内容完全一致
2. 日志文件
- 容器内日志文件查看:
- 使用kubectl exec -it <Pod名称> -- bash命令进入容器终端
- 在容器内部直接查看程序写入日志文件的完整内容
- 命令注意事项:
- 新版本kubectl要求使用--分隔参数:kubectl exec -it <Pod名称> -- bash
- 旧格式kubectl exec -it <Pod名称> bash已被弃用
- 故障排查技巧:进入容器后可以执行常规Linux命令(如ls、cat等)查看日志文件具体内容
- 日志文件位置:需要根据应用程序配置确定,常见路径包括/var/log/或应用程序指定目录
3. 日志收集方案
- 标准输出日志收集:
- 采用DaemonSet方式在每个Node节点部署日志采集器
- 采集/var/lib/docker/containers/目录下所有容器日志
- 适合收集所有容器的标准输出日志
- 容器内日志文件收集:
- 在Pod中增加sidecar容器运行日志采集器
- 使用emptyDir卷共享日志目录
- 适合收集应用程序写入特定文件的日志
- 混合部署优势:DaemonSet+sidecar组合可以覆盖所有日志收集场景
五、问题答疑
1. 日志查看问题
- 非官方镜像问题:当使用kubectl logs命令无输出时,可能是未使用官方镜像导致,官方镜像默认会输出日志
- 排查方法:需检查镜像来源,确认是否为官方标准镜像
2. API Server异常日志查看
- 端口连接问题:kubectl get cs显示connection refused时,是版本升级导致的端口兼容性问题,但不会影响集群正常工作
- 日志查看途径:
- 常规方法:通过kubectl logs查看
- 异常情况:当API Server未启动时,需使用docker logs直接查看容器日志
- 底层排查:所有k8s组件均通过docker启动,可通过docker ps -a | grep apiserver定位容器后查看日志
3. 容器日志查看方法
- docker命令参数:
- -a参数:显示所有容器(包括已停止的),不加则只显示运行中的容器
- 日志格式:容器日志通常包含时间戳、日志级别、输出内容等结构化信息
- 日志存储位置:容器日志默认存储在/var/lib/docker/containers/<容器ID>/目录下
4. 镜像拉取问题
- 国内访问限制:官方镜像registry.k8s.io在国内可能无法直接访问
- 解决方案:
- 使用替代镜像源(如阿里云镜像仓库)
- 通过科学上网下载后推送至私有仓库
- 修改yaml文件中的镜像地址为可用仓库
- 错误状态:ImagePullBackOff表示镜像拉取失败,需检查镜像地址和网络连接
六、知识小结
|---------------------|-------------------------------------------------------------------------------------------------|------------------------------------------------------------|-------|
| 知识点 | 核心内容 | 考试重点/易混淆点 | 难度系数 |
| Metrics Server 部署流程 | 1. 通过 YAML 文件部署 2. 检查 API Service 注册状态 3. 验证指标获取功能 | 证书验证参数:--kubelet-insecure-tls 的作用与安全考量 | ⭐⭐⭐ |
| kubectl top 工作原理 | 1. 请求 API Server 2. 代理到 Metrics Server 3. 采集各节点 kubelet 的 cAdvisor 指标 | 流程顺序:API Server → Metrics Server → kubelet → cAdvisor | ⭐⭐ |
| YAML 部署最佳实践 | 1. 优先使用官方仓库 2. 镜像拉取问题解决方案 3. 参数调优(如跳过证书验证) | 镜像处理:官方镜像→科学上网下载→推送到可访问仓库 | ⭐⭐⭐⭐ |
| 日志管理机制 | 1. 组件日志(kubelet/journalctl) 2. 容器标准输出日志(/var/lib/docker/containers) 3. 应用日志文件(需进入容器查看) | 关键路径:/var/lib/docker/containers/<容器ID>/<容器ID>-json.log | ⭐⭐⭐⭐ |
| 资源监控验证 | 1. kubectl get apiservice 检查注册状态 2. kubectl get --raw 测试原始指标接口 3. kubectl top node/pod 查看资源使用率 | 单位注意:CPU 的 m 单位(1m=0.001核) | ⭐⭐⭐ |
| 故障排查方法 | 1. 非 Running 状态的 Pod 先查日志 2. kubelet 问题查系统日志(journalctl -u kubelet) 3. 节点 NotReady 优先检查 kubelet | 诊断顺序:kubectl describe → kubectl logs → docker logs | ⭐⭐⭐⭐ |
| 日志收集方案 | 1. 标准输出:节点部署日志采集器监控 docker 日志目录 2. 日志文件:Pod 内挂载 sidecar 容器 | Sidecar 模式:通过 emptyDir 共享日志目录 | ⭐⭐⭐⭐⭐ |
| 生产环境建议 | 1. 组件部署在 kube-system 命名空间 2. 重要参数必须检查(如证书验证) 3. 优先使用官网文档而非博客 | 版本控制:YAML 文件需与集群版本匹配 | ⭐⭐⭐⭐ |