20250712-1-Kubernetes 监控与日志管理-K8s日志管理与维护_笔记

一、监控集群资源利用率

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)
  • 项目文件下载

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 文件需与集群版本匹配 | ⭐⭐⭐⭐ |

相关推荐
快乐点吧5 分钟前
【前端】异步任务风控验证与轮询机制技术方案(通用笔记版)
前端·笔记
搂……住17 分钟前
shiro550反序列化漏洞复现(附带docker源)
安全·docker·容器
IT成长日记20 分钟前
【Docker基础】Dockerfile指令速览:基础常用指令详解
docker·容器·dockerfile·cmd·copy·from·run
ezreal_pan1 小时前
docker设置镜像加速
运维·docker·容器
cainiao0806052 小时前
容器化改造避坑指南:传统应用迁移K8s的10个关键节点(2025实战复盘)
云原生·容器·kubernetes
伊成3 小时前
docker安装Consul笔记
笔记·docker·consul
zstar-_4 小时前
Claude code在Windows上的配置流程
笔记·算法·leetcode
憨堡包^—^4 小时前
Docker —— MySQL主从复制集群
mysql·docker·容器
hi0_64 小时前
03 数组 VS 链表
java·数据结构·c++·笔记·算法·链表