Kubernetes v1.37:追踪 PVC 访问时间,识别闲置存储

利用新特性识别闲置存储,优化资源成本与运维效率

好游模型 来源:原创整理 23
Kubernetes v1.37:追踪 PVC 访问时间,识别闲置存储

Kubernetes v1.37 引入了一个 Beta 功能,为 PersistentVolumeClaim (PVC) 资源添加了 `lastAccessTime` 字段。该功能通过追踪 PVC 最后一次被 Pod 挂载或访问的时间,解决了长期存在的存储使用状态不可见问题。本文将深入解析其工作原理,并提供实用的启用、查看与排查步骤,帮助运维团队有效识别闲置卷,实现存储资源的精细化管理与成本优化。

引言

插图1
插图1

在 Kubernetes 生态中,PersistentVolumeClaim (PVC) 是应用持久化存储的核心抽象。它允许开发者声明存储需求,而无需关心底层存储的具体实现。然而,长期以来,运维团队面临一个痛点:如何知道一个 PVC 是否还在被使用?哪些 PVC 已经闲置,可以安全回收?

配图
配图

传统的排查方式往往依赖于手动检查关联的 Pod 状态,或者依赖存储后端提供的有限日志,效率低下且不准确。Kubernetes v1.37 引入的 PersistentVolumeClaimLastAccessTime 功能(Beta 阶段),正是为了解决这一可见性问题。它通过在 PVC 对象上记录 lastAccessTime 字段,为存储资源的使用状态提供了清晰的时间戳。

原理要点

lastAccessTime 字段的更新机制是理解该功能的关键。它并非实时追踪每一次 I/O 操作,而是基于 PVC 的“挂载”状态进行更新。

  1. 触发条件:当 PVC 被一个 Pod 成功挂载(Mount)时,lastAccessTime 会被更新为当前时间。这包括 Pod 启动、重启或重新调度到不同节点时,只要该 PVC 被挂载,时间戳就会刷新。
  2. 存储位置:该时间戳作为 PVC 对象的一个字段,存储在 Kubernetes API Server 中。这意味着它可以通过标准的 kubectl 命令或 API 直接查询,无需访问存储后端。
  3. 功能开关:由于是 Beta 功能,默认情况下可能未启用。需要在 API Server 的启动参数中启用相应的功能门控(Feature Gate)。

这个设计使得运维人员能够以极低的开销,获得 PVC 使用状态的宏观视图,为存储清理、成本分析和容量规划提供了数据基础。

实战步骤

插图2
插图2

1. 启用功能

首先,确保你的 Kubernetes 集群版本为 v1.37 或更高。然后,需要在控制平面的 API Server 配置中启用 PersistentVolumeClaimLastAccessTime 功能门控。

通常,这可以通过修改 API Server 的启动参数或配置文件来实现。例如,在 kube-apiserver 的启动参数中添加:

bash
--feature-gates=PersistentVolumeClaimLastAccessTime=true

对于使用 kubeadm 部署的集群,可能需要修改 /etc/kubernetes/manifests/kube-apiserver.yaml 文件中的 command 部分,加入上述参数,然后重启 API Server 组件。

2. 查看 PVC 的 lastAccessTime

功能启用后,你可以使用 kubectl 命令查看 PVC 的详细状态,其中就包括 lastAccessTime。

bash
kubectl get pvc -o yaml

在输出的 YAML 中,寻找 status.lastAccessTime 字段。例如:

yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-data-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
status:
  phase: Bound
  lastAccessTime: "2024-05-20T10:30:00Z"

3. 编写查询脚本识别闲置 PVC

为了批量识别闲置的 PVC,可以编写一个简单的脚本,结合 kubectl 输出和当前时间进行判断。以下是一个通用的 Bash 脚本示例,用于找出在过去 30 天内未被访问的 PVC。

bash
#!/bin/bash

# 定义闲置阈值(天数)
THRESHOLD_DAYS=30

# 获取所有 PVC 的名称和 lastAccessTime
pvc_list=$(kubectl get pvc -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.lastAccessTime}{"\n"}{end}')

# 遍历每个 PVC
echo "$pvc_list" | while read -r pvc_name last_access; do
    if [ -z "$last_access" ]; then
        echo "PVC: $pvc_name - 无 lastAccessTime 记录 (可能功能未启用或 PVC 从未被挂载)"
        continue
    fi

    # 将 lastAccessTime 转换为时间戳进行比较
    # 注意:这里使用 date 命令进行简单转换,实际生产环境可能需要更精确的处理
    last_access_ts=$(date -d "$last_access" +%s 2>/dev/null)
    if [ $? -ne 0 ]; then
        echo "PVC: $pvc_name - lastAccessTime 格式无法解析: $last_access"
        continue
    fi

    current_ts=$(date +%s)
    diff_seconds=$((current_ts - last_access_ts))
    diff_days=$((diff_seconds / 86400))

    if [ $diff_days -gt $THRESHOLD_DAYS ]; then
        echo "⚠️  闲置 PVC: $pvc_name (最后访问: $last_access, 闲置天数: $diff_days)"
    fi
done

将此脚本保存为 check_idle_pvc.sh,赋予执行权限后运行,即可输出闲置 PVC 列表。

4. 结合监控与告警

可以将上述脚本集成到日常的运维巡检流程中,或者将其输出作为监控数据源。例如,通过 Prometheus 的自定义 Exporter 收集 PVC 的使用时间信息,并设置告警规则,当某个重要 PVC 长时间未被访问时发出通知。

常见坑与排查清单

  1. 功能未启用:lastAccessTime 字段为空或未显示。首先检查 API Server 的 --feature-gates 参数是否正确配置并生效。
  2. 时间戳未更新:PVC 已绑定但 lastAccessTime 未变化。确认关联的 Pod 是否真的成功挂载了该 PVC。可以通过 kubectl describe pod <pod-name> 查看卷挂载详情。
  3. 时间格式问题:lastAccessTime 遵循 RFC3339 格式。在编写解析脚本时,需确保时间处理库能正确解析该格式。
  4. 性能考量:虽然该功能开销很小,但在拥有海量 PVC 的超大集群中,频繁查询所有 PVC 的详细信息可能对 API Server 造成压力。建议采用分页查询或定期批量处理的方式。
  5. 与存储后端同步:lastAccessTime 反映的是 Kubernetes 层面的挂载事件,并不直接等同于存储后端(如云盘、NAS)的实际 I/O 时间。对于需要精确 I/O 计费的场景,仍需结合存储提供商的计量数据。

小结

Kubernetes v1.37 的 PersistentVolumeClaimLastAccessTime 功能,虽然处于 Beta 阶段,但已为存储运维带来了实质性的改进。它填补了 PVC 使用状态可见性的空白,使得识别闲置存储、优化资源分配变得简单直接。

对于运维工程师而言,掌握这一特性意味着能够更主动地进行存储资源管理,避免资源浪费,并提升集群的整体运营效率。随着该功能从 Beta 走向 GA,它有望成为 Kubernetes 存储管理中的标准工具之一。建议团队尽早评估并试点使用,为未来的存储精细化运营做好准备。

技术分享更多资讯

查看全部
布里吉斯游戏引擎更新:波次与技能机制重构
技术分享

布里吉斯游戏引擎更新:波次与技能机制重构

游戏开发者布里吉斯发布最新技术更新,重点重构了敌人波次生成逻辑与干员技能释放机制。此次更新涉及底层数据配置与快照保存系统的优化,为后续数据库更新及前端开发奠定基础。开发者透露将学习Unity引擎技术,并计划未来转向自研引擎,标志着项目从原型向工业化开发的重要转型。

AI 编辑 3
Agent 上下文治理全景原则篇:构建目标导向的智能判断体系
技术分享

Agent 上下文治理全景原则篇:构建目标导向的智能判断体系

本文聚焦 Agent 上下文治理的核心原则,从目标、依据、边界、记忆、探索及进展六个维度,深入剖析上下文机制如何辅助智能体围绕既定任务进行持续且精准的判断。通过明确各机制职责,旨在提升 Agent 在复杂环境下的任务执行效率与稳定性,为构建更可靠的 AI 系统提供理论框架与实践指导。

AI 编辑 3
Python 3.13 引入 Queue.shutdown 解决异步退出难题
技术分享

Python 3.13 引入 Queue.shutdown 解决异步退出难题

Python 3.13 正式引入 Queue.shutdown 方法,旨在解决异步消费者在收到停止信号后难以优雅退出的长期痛点。此前,开发者需手动处理取消信号,常导致部分已取出的任务处理中断或资源泄漏。新特性简化了异步队列的生命周期管理,提升了并发编程的可靠性与代码简洁性,对 Python 异步生态具有积极意义。

AI 编辑 4
游戏团队管理进阶:从被动救火到主动规划
技术分享

游戏团队管理进阶:从被动救火到主动规划

本文基于对游戏团队管理实践的深入思考,指出许多管理者陷入“解决问题”的时间陷阱。通过定期复盘日程,作者发现大量精力耗费在应对架构、需求及人员冲突等突发状况上。文章主张管理者应转变思维,从被动响应转向主动发现潜在问题,优化团队效能,避免陷入低效的救火循环,为游戏行业团队管理提供新的视角。

AI 编辑 3