【云原生技术】Pod 列表新增时间字段:取值口径与获取方式

Pod 列表新增时间字段:取值口径与获取方式

下面给出 3 个时间字段的定义、取值规则、数据来源(K8s API)、边界情况。建议你在文档里把它们称为"创建时间 / 运行时间 / 就绪时间",避免一个"启动时间"引发歧义。


1) 创建时间(CreatedAt)

定义

Pod 对象在 K8s 中被创建并持久化的时间。

取值

  • CreatedAt = pod.metadata.creationTimestamp

数据来源

  • K8s API:GET /api/v1/namespaces/{ns}/pods(List Pod)或 GET pod

展示/说明

  • 一定有值(除非数据异常)
  • 不代表容器启动、也不代表可接入流量

2) 运行时间(RunningAt,建议叫"容器开始运行时间/首次运行时间/最近运行时间"要先定口径)

K8s 没有 Pod 级别统一 startedAt 字段,通常从容器状态推导。你需要在文档里明确口径,否则实现会不一致。

推荐口径(用于 Pod 列表最直观)

RunningAt = 业务容器中"最后一个进入 Running"的时间

即:在选定的业务容器集合中取最大值。

取值规则
  1. 从 pod.status.containerStatuses[] 取每个容器的:
    • state.running.startedAt(容器处于 Running 时才有)
  2. 过滤规则(可选但强烈建议写清):
    • 默认只统计业务容器 ,不统计明显的基础设施 sidecar
      • 例如:istio-proxy、linkerd-proxy、vault-agent 等(你们平台若有固定名单,可配置化)
    • 如果无法区分业务/sidecar:则统计全部容器(简单但会导致"RunningAt 被 sidecar 影响")
  3. 聚合:
    • RunningAt = max(startedAt 列表)
  4. 若列表为空(如 Pending、ImagePullBackOff、CrashLoopBackOff 且未进入 Running):
    • RunningAt = null
数据来源
  • K8s API:Pod List/Get 返回的 status.containerStatuses
边界情况说明(文档要写)
  • 容器重启 :state.running.startedAt 会更新为"最近一次启动时间"。
    • 如果你们更想要"首次启动时间",K8s 原生字段不保证保留,需要平台侧记录(见下扩展)。
  • 多容器 Pod:按上述聚合规则取值。
  • 还没 Running:为空,前端可显示 "---/未运行"。

可选增强(如果你们需要"首次运行时间 FirstRunningAt"):平台做 watch 记录"第一次观察到任一业务容器进入 Running 的时间",写库或 annotation。


3) 就绪时间(ReadyAt,可服务时间,最接近"真的启动完成能接流量")

推荐口径

ReadyAt = Pod Ready 条件首次变为 True 的时间(首次可服务时间)

取值优先级(建议写成两级方案,便于落地)

方案 A(优先,若字段可用):直接取 condition 的时间

从 pod.status.conditions[] 找到:

  • type == "Ready" 且 status == "True"
  • 取该条 condition 的时间字段(不同版本字段表现略有差异,文档里可以这么写):
    • 优先取 lastTransitionTime(Ready 从 False→True 的时间)
    • 若无/不可靠,可退化使用 lastProbeTime(但很多环境为空,不建议依赖)

若找不到 Ready=True:

  • ReadyAt = null

数据来源:Pod status.conditions(Pod List/Get)

方案 B(最稳,跨版本一致):平台侧记录 readyAt

如果你们发现 lastTransitionTime 不满足(缺失/不准确/不想受版本影响),就采用平台侧记录法:

  • 平台组件 watch Pod(informer)
  • 当检测到 Ready 条件首次 为 True 时:
    • 写入平台数据库 readyAt
    • 或写入 Pod annotation:platform.xxx/readyAt=RFC3339时间
  • Pod 列表展示优先使用平台记录值

边界情况说明

  • Ready=True 后又变 False(抖动) :
    • "首次 ReadyAt"通常不变(表达首次可服务时刻)
    • 你们也可以另加"最近就绪时间 LastReadyAt"(需求没要求可不做)
  • 没有 readinessProbe:某些场景 Ready 可能很快 True(只代表 K8s 认为可用,不代表业务完全健康),需在文档里提示"Ready 取决于探针定义"。

建议在需求里明确的字段与返回结构(示例)

  • createdAt:string(datetime, RFC3339)
  • runningAt:string(datetime, RFC3339) | null
  • readyAt:string(datetime, RFC3339) | null
  • phase:Pending/Running/Succeeded/Failed/Unknown(辅助理解)

实现备注(你可放到"取数逻辑/伪代码")

  • createdAt:直接读
  • runningAt:
    • 从 containerStatuses 取 state.running.startedAt
    • 过滤 sidecar(可配置)
    • 取 max
  • readyAt:
    • 从 conditions 找 Ready=True 的 lastTransitionTime
    • 若缺失则为空(或采用平台记录)

相关推荐
MrSYJ2 小时前
别人再问你路由表是啥,这篇文章摔它脸上
docker·云原生·kubernetes
羑悻2 小时前
穿越Docker内核迷雾:揭秘镜像分层存储的叠加态与卷挂载的多维空间穿梭技术
后端·docker·容器
运维开发王义杰3 小时前
ingress-nginx 退役后怎么选:Istio、Kong、Traefik 与 APISIX
云原生
吴声子夜歌3 小时前
Nginx应用与运维——Nginx在Kubernetes中的应用(一)
运维·nginx·kubernetes
筑梦之路4 小时前
docker-compose方式部署kafka集群(Kraft方式)——筑梦之路
docker·容器·kafka
JavaPub-rodert4 小时前
Docker 镜像地址总失效?基于 DockerHub 项目用 GitHub Actions 做一个自动检测状态页
docker·容器·github
天衍四九-4 小时前
Docker 进阶实战系列(一):容器镜像安全,最小镜像与非 Root 运行
安全·docker·eureka
天衍四九-5 小时前
Docker进阶实战系列(二):容器日志深度治理|驱动配置、自动切割、磁盘爆满彻底解决
docker·容器·eureka
吴声子夜歌5 小时前
Nginx应用与运维——Nginx在Kubernetes中的应用(三)
运维·nginx·kubernetes
sbjdhjd5 小时前
云安全 | Docker 容器逃逸复盘(一):从隔离边界到运行时链路,如何确认自己身处容器
网络安全·docker·云原生·容器·kubernetes·云计算·云安全