You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求实现Kubernetes中CreationTimestamp转AGE的Go代码(与kubectl输出格式一致)及对应源码位置

解决Kubernetes中CreationTimestamp转kubectl风格AGE格式的问题

刚好我之前也处理过这个需求,Kubernetes本身就提供了现成的工具函数来实现这个转换,不用自己从零开始写逻辑。下面是具体的实现步骤和源码位置说明:

1. 实现示例(修改你的Go代码)

首先需要导入k8s.io/apimachinery/pkg/util/duration包,这个包中的HumanDuration函数就是kubectl用来格式化AGE字段的核心方法。它会把时间差转换成易读的字符串格式(比如29d、13d、5h、3m等)。

修改后的代码片段如下:

import (
	"fmt"
	"log"
	"time"

	v1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/util/duration" // 新增这个导入
)

// 假设你的Volume和VolumesOutput结构体已经定义
type Volume struct {
	Name     string
	Capacity string
	Age      string
	UserID   string // 假设UserID是字符串类型,根据你的实际定义调整
}

type VolumesOutput struct {
	Volumes []Volume
}

var (
	ClientSet *kubernetes.Clientset // 假设你的ClientSet已经初始化
	UserID    string
)

func getVolumes() VolumesOutput {
	userNamespace := "test"
	listOptions := metav1.ListOptions{
		Limit: 100,
	}
	volumeList, err := ClientSet.CoreV1().PersistentVolumeClaims(userNamespace).List(listOptions)
	if err != nil {
		// 这里可以添加错误处理逻辑,比如log.Fatal(err)
		log.Fatalf("Failed to list PVCs: %v", err)
	}
	volumeItems := volumeList.Items
	volumes := make([]Volume, 0, len(volumeItems)) // 预分配容量更高效

	for _, volumeItem := range volumeItems {
		quant := volumeItem.Spec.Resources.Requests[v1.ResourceStorage]
		// 计算CreationTimestamp到现在的时间差,然后转成kubectl风格的AGE格式
		ageDuration := time.Since(volumeItem.ObjectMeta.CreationTimestamp.Time)
		volume := Volume{
			Name:     volumeItem.Name,
			Capacity: quant.String(),
			Age:      duration.HumanDuration(ageDuration), // 替换原来的String()调用
			UserID:   UserID,
		}
		volumes = append(volumes, volume)
	}

	if len(volumes) == 0 {
		fmt.Println("no volumes found")
	}

	log.Println(volumes)
	vol := VolumesOutput{
		Volumes: volumes,
	}
	return vol
}

2. Kubernetes源码中的实现位置

你要找的转换逻辑就在Kubernetes的pkg/util/duration/duration.go文件中,核心是HumanDuration函数。这个函数会根据时间差的量级自动选择最合适的单位(天、小时、分钟等),完全和kubectl输出的AGE格式一致。

函数的核心逻辑大致是:

  • 先判断时间差的范围,比如大于等于24小时就用天(d),大于等于1小时用小时(h),以此类推
  • 对时间差进行取整和格式化,确保输出简洁易读

如果你想深入看源码,可以查看这个文件中的HumanDuration和辅助函数approximateDuration的实现。

内容的提问来源于stack exchange,提问作者cdalar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:23:01