0

如何指定注释,例如+kubebuilder:printcolumn在命令的输出中添加列kubectl get my-crd.my-group.my-domain.com

我有一个 CRD(自定义资源定义),struct其规格和状态通常为 s(类似于此处的 Kubebuilder 教程https://book.kubebuilder.io/cronjob-tutorial/new-api.html#添加新的 api)。

我有这样的状态 struct

type ScheduleSetStatus struct {
    // When was the last time the Schedule Set
    // was successfully deployed.
    LastDeployTime string `json:"lastDeployTime"` // metav1.Time
    // The CronJobs that have been successfully deployed
    DeployedCronJobs []string `json:"deployedCronJobs"`
    // The CronJobs that had errors when the deployment
    // has been attempted.
    ErroredCronJobs map[string]string `json:"erroredCronJobs"` // TODO `error` JSON serialisable
}

其中有几个问题:

时间场

  • 我已经尝试将其设为类型metav1.Time(方便的格式,如他们在https://book.kubebuilder.io/cronjob-tutorial/api-design.html?highlight=metav1.Time#designing-an-api中所述),但是然后此注释// +kubebuilder:printcolumn:name="Last Deploy",type="date",JSONPath=.status.lastDeployTime`` 在 .status.lastDeployTime 的输出中显示为空kubectl
  • 所以我将类型更改为string(然后在控制器中执行oess.Status.LastDeployTime = fmt.Sprintf("%s", metav1.Time{Time: time.Now().UTC()})),然后添加注释+kubebuilder:printcolumn:name="Last Deploy",type=string,JSONPath=.status.lastDeployTime`` 但该字段在 .status.lastDeployTime 的输出中仍然显示为空kubectl

切片字段[]string和地图字段map[string]string

  • 我该如何配置这些?这里没有提及(点击“显示详细参数帮助”时):https ://book.kubebuilder.io/reference/markers/crd.html
  • 如果这些不是在使用时出现格式问题的“简单类型” kubectl,这是否意味着我唯一的选择是string用某种方式制作它们fmt.Sprintf(...)
  • 还有其他选择吗?
4

1 回答 1

0

解决方案是在控制器的reconciler 方法中添加更新资源状态的代码- Reconcile(ctx context.Context, req ctrl.Request),如下所示:

    // Update the status for "last deploy time" of a ScheduleSet
    myStruct.Status.LastDeployTime = metav1.Time{Time: time.Now().UTC()} // https://book.kubebuilder.io/cronjob-tutorial/api-design.html?highlight=metav1.Time#designing-an-api
    if err := r.Status().Update(ctx, &myStruct); err != nil {
        log.Error(err, "unable to update status xyz")
        return ctrl.Result{}, err
    }

特殊的 Kubebuilder 注释没问题:

//+kubebuilder:printcolumn:name="Last Deploy",type="date",JSONPath=`.status.lastDeployTime`

此外,Go slices 和 Go maps 开箱即用,注释如下:

...

    DeployedCronJobs []string `json:"deployedCronJobs"`

...

    ErroredCronJobs map[string]string `json:"erroredCronJobs"`
...

//+kubebuilder:printcolumn:name="Deployed CJs",type=string,JSONPath=`.status.deployedCronJobs`
//+kubebuilder:printcolumn:name="Errored CJs",type=string,JSONPath=`.status.erroredCronJobs`
于 2022-01-08T13:07:39.007 回答