自定义crd资源显示信息的配置

原生crd yaml的方法

在 Kubernetes 中,kubectl get 命令输出的列信息是由资源的 API 定义 控制的。内置资源(如 Pod、Deployment)的列信息是预先定义好的,而 自定义资源(Custom Resource,CR) 需要开发者在其 CRD(Custom Resource Definition) 中显式声明需要展示的列。以下是详细解释和配置方法:


一、为何自定义资源默认只有两列?

  1. 默认行为

    Kubernetes 默认仅显示资源的 NAMEAGE(创建时间),因为这是所有资源的共有元数据。 • NAME:取自 .metadata.name。 • AGE:通过 .metadata.creationTimestamp 计算得出。

  2. 内置资源为何有多列

    内置资源(如 Pod、Deployment)在它们的 API 定义中已经通过 additionalPrinterColumns 字段声明了需要展示的列。


二、如何为自定义资源添加更多列?

CRD 的 YAML 定义 中,通过 additionalPrinterColumns 字段定义要展示的列。每个列需要指定以下信息: • name:列名(如 STATUS)。 • type:数据类型(如 stringintegerdate)。 • jsonPath:指向资源中对应字段的 JSON 路径。 • description:列的说明(可选)。

示例:为自定义资源添加 STATUSREADY

yaml 复制代码
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: myresources.example.com
spec:
  group: example.com
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          # ... 你的 CRD 结构定义 ...
      additionalPrinterColumns:
        - name: Status
          type: string
          jsonPath: .status.phase  # 假设你的 CR 的 Status 字段是 .status.phase
          description: 当前资源状态
        - name: Ready
          type: integer
          jsonPath: .status.readyReplicas
          description: 就绪的副本数
  scope: Namespaced
  names:
    plural: myresources
    singular: myresource
    kind: MyResource

三、验证和效果

  1. 应用更新后的 CRD

    bash 复制代码
    kubectl apply -f my-crd.yaml
  2. 检查列信息

    bash 复制代码
    kubectl get myresources

    输出示例:

    perl 复制代码
    NAME           STATUS    READY   AGE
    my-resource-1  Running   2/3     5d

四、高级配置

1. 条件列(Conditional Columns)

通过 priority 字段控制列的显示优先级:

yaml 复制代码
additionalPrinterColumns:
  - name: Priority
    type: string
    jsonPath: .status.priority
    priority: 1  # 0-1000,数字越小优先级越高(默认 0)

2. 格式化时间

使用 format 字段自定义时间格式:

yaml 复制代码
additionalPrinterColumns:
  - name: Created
    type: date
    jsonPath: .metadata.creationTimestamp
    format: date  # 可选值:date、date-time、duration

五、常见问题

Q1:列未显示或显示错误

可能原因

• JSON 路径错误(如 .status.phase 不存在)。

• 未正确应用更新的 CRD。

解决方案

• 使用 kubectl get <crd> -o json 检查资源结构。

• 确保 CRD 中 additionalPrinterColumnsjsonPath 正确。

Q2:如何隐藏 AGE 列?

无法直接隐藏AGE 是 Kubernetes 默认列,但可以通过设置 --show-aging=false 临时隐藏:

bash 复制代码
kubectl get myresources --show-aging=false

总结

内置资源 :列信息由 Kubernetes 核心代码预定义。

自定义资源 :通过 CRD 的 additionalPrinterColumns 字段声明需要展示的列,并确保 jsonPath 指向有效字段。

灵活控制:支持自定义列名、数据类型、格式和优先级,满足不同场景需求。


kubebuilder的方法

步骤 1:在 API 类型文件中定义列(api/v1/foo_types.go

在您生成的 api/v1/foo_types.go 文件中,通过 +kubebuilder:printcolumn 注释标记定义要展示的列:

go 复制代码
type FooSpec struct {
    // 定义 Spec 字段
    Replicas int32 `json:"replicas"`
    Image    string `json:"image"`
}

type FooStatus struct {
    // 定义 Status 字段(必须要有 Status 才能展示动态信息)
    ReadyReplicas int32 `json:"readyReplicas"`
    Phase         string `json:"phase"`
    LastUpdated   metav1.Time `json:"lastUpdated"`
}

// +kubebuilder:object:root=true
// +kubebuilder:subresource:status
// +kubebuilder:printcolumn:name="Replicas",type=integer,JSONPath=`.spec.replicas`,description="期望副本数"
// +kubebuilder:printcolumn:name="Ready",type=integer,JSONPath=`.status.readyReplicas`,description="就绪副本数"
// +kubebuilder:printcolumn:name="Status",type=string,JSONPath=`.status.phase`,description="当前状态"
// +kubebuilder:printcolumn:name="LastUpdated",type=date,JSONPath=`.status.lastUpdated`,description="最后更新时间"
// +kubebuilder:printcolumn:name="Age",type=date,JSONPath=`.metadata.creationTimestamp`
type Foo struct {
    metav1.TypeMeta   `json:",inline"`
    metav1.ObjectMeta `json:"metadata,omitempty"`

    Spec   FooSpec   `json:"spec,omitempty"`
    Status FooStatus `json:"status,omitempty"`
}

步骤 2:重新生成 CRD 清单

运行以下命令,将注释标记生成到 CRD YAML 文件中:

bash 复制代码
make manifests

这会更新 config/crd/bases/apps.foo.yaml 文件,其中包含生成的 additionalPrinterColumns 字段。


步骤 3:应用更新后的 CRD

bash 复制代码
kubectl apply -f config/crd/bases/apps.foo.yaml

步骤 4:验证列显示

创建一个 Foo 资源实例后,使用 kubectl get 查看列信息:

bash 复制代码
kubectl get foos

输出示例:

perl 复制代码
NAME       REPLICAS   READY   STATUS    LASTUPDATED          AGE
my-foo     3          2       Running   2023-10-05T14:30:00Z 5m

关键参数说明

标记参数 作用
name 列名(如 Replicas
type 数据类型(stringintegerdateboolean
JSONPath 指向资源字段的 JSON 路径(如 .spec.replicas
description 列的说明(可选)
priority 优先级(0-1000,数字越小优先级越高,控制列是否默认显示)
format 格式(如 datedate-time,仅对 type=date 有效)

完整示例参考

yaml 复制代码
# config/crd/bases/apps.foo.yaml
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: foos.apps.example.com
spec:
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          # ... 自动生成的 Schema ...
      additionalPrinterColumns:
        - name: Replicas
          type: integer
          jsonPath: .spec.replicas
          description: 期望副本数
        - name: Ready
          type: integer
          jsonPath: .status.readyReplicas
          description: 就绪副本数
        - name: Status
          type: string
          jsonPath: .status.phase
          description: 当前状态
        - name: LastUpdated
          type: date
          jsonPath: .status.lastUpdated
          description: 最后更新时间
        - name: Age
          type: date
          jsonPath: .metadata.creationTimestamp

注意事项

  1. Status 字段必须存在 :动态信息(如 READYSTATUS)需要依赖 .status 字段,请确保资源控制器会更新状态。

  2. JSONPath 准确性 :使用 kubectl get foos -o json 验证 JSON 路径是否正确。

  3. 列优先级 :若列过多,低优先级列(priority > 0)可能需要通过 -o wide 显示:

    bash 复制代码
    kubectl get foos -o wide

通过以上步骤,您可以为自定义资源实现类似 Pod 的列显示效果。

相关推荐
剩下了什么4 小时前
Gf命令行工具下载
go
地球没有花5 小时前
tw引发的对redis的深入了解
数据库·redis·缓存·go
BlockChain88816 小时前
字符串最后一个单词的长度
算法·go
龙井茶Sky17 小时前
通过higress AI统计插件学gjson表达式的分享
go·gjson·higress插件
宇宙帅猴2 天前
【Ubuntu踩坑及解决方案(一)】
linux·运维·ubuntu·go
SomeBottle3 天前
【小记】解决校园网中不同单播互通子网间 LocalSend 的发现问题
计算机网络·go·网络编程·学习笔记·计算机基础
且去填词3 天前
深入理解 GMP 模型:Go 高并发的基石
开发语言·后端·学习·算法·面试·golang·go
大厂技术总监下海3 天前
向量数据库“卷”向何方?从Milvus看“全功能、企业级”的未来
数据库·分布式·go·milvus·增强现实
冷冷的菜哥3 天前
go(golang)调用ffmpeg对视频进行截图、截取、增加水印
后端·golang·ffmpeg·go·音视频·水印截取截图
Grassto4 天前
深入 `modload`:Go 是如何加载并解析 module 的
golang·go·go module