如何打印 Kubebuilder 中定义的状态字段以在使用 Kubectl 时显示
How to print Status fields defined in Kubebuilder to show up when using Kubectl
我如何必须指定 +kubebuilder:printcolumn
之类的注释才能将列添加到命令 kubectl get my-crd.my-group.my-domain.com
的输出中?
我有一个 CRD(自定义资源定义),其中包含通常的 struct
规范和状态(类似于此处 https://book.kubebuilder.io/cronjob-tutorial/new-api.html#adding-a-new-api 的 Kubebuilder 教程中的解释)。
我有这样的 状态 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``在 kubectl
. 的输出中显示为空
- 所以我将类型更改为
string
(然后在控制器中执行 oess.Status.LastDeployTime = fmt.Sprintf("%s", metav1.Time{Time: time.Now().UTC()})
),然后添加注释 +kubebuilder:printcolumn:name="Last Deploy",type=string,JSONPath=
.status.lastDeployTime`` 但仍然是字段在 kubectl
. 的输出中显示为空
切片字段[]string
和map字段map[string]string
- 如何配置这些?这里没有提及(单击“显示详细参数帮助”时):https://book.kubebuilder.io/reference/markers/crd.html
- 如果在使用
kubectl
时这些不是格式问题的“简单类型”,这是否意味着我唯一的选择是使用某种 [=26= 使它们 string
]?
- 还有其他选择吗?
解决方案是添加代码以更新资源状态
控制器的 协调器方法 - 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 切片和 Go 地图开箱即用,评论如下:
...
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`
我如何必须指定 +kubebuilder:printcolumn
之类的注释才能将列添加到命令 kubectl get my-crd.my-group.my-domain.com
的输出中?
我有一个 CRD(自定义资源定义),其中包含通常的 struct
规范和状态(类似于此处 https://book.kubebuilder.io/cronjob-tutorial/new-api.html#adding-a-new-api 的 Kubebuilder 教程中的解释)。
我有这样的 状态 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``在kubectl
. 的输出中显示为空
- 所以我将类型更改为
string
(然后在控制器中执行oess.Status.LastDeployTime = fmt.Sprintf("%s", metav1.Time{Time: time.Now().UTC()})
),然后添加注释+kubebuilder:printcolumn:name="Last Deploy",type=string,JSONPath=
.status.lastDeployTime`` 但仍然是字段在kubectl
. 的输出中显示为空
切片字段[]string
和map字段map[string]string
- 如何配置这些?这里没有提及(单击“显示详细参数帮助”时):https://book.kubebuilder.io/reference/markers/crd.html
- 如果在使用
kubectl
时这些不是格式问题的“简单类型”,这是否意味着我唯一的选择是使用某种 [=26= 使它们string
]? - 还有其他选择吗?
解决方案是添加代码以更新资源状态
控制器的 协调器方法 - 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 切片和 Go 地图开箱即用,评论如下:
...
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`