英文:
Update status in a custom Kubernetes controller in golang
问题
我正在构建一个Go Kubernetes操作员。我已经使用kubebuilder创建了它。
我想将一些内部细节存储在CRD状态中。我尝试过:
- 更新整个资源:
if err = r.Client.Update(ctx, upCRD); err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err)
}
- 只更新状态:
if err = r.Status().Update(ctx, upCRD); err != nil {
return reconcile.Result{}, client.IgnoreNotFound(err)
}
状态结构定义如下:
type HAAuditStatus struct {
ChaosStrategyCron cron.EntryID `json:"chaosStrategyCron,omitempty"`
TestStatus TestStatus `json:"testStatus,omitempty"`
MetricStatus MetricStatus `json:"metricStatus,omitempty"`
RoundRobinStrategy RoundRobinStrategy `json:"roundRobinStrategy,omitempty"`
FixedStrategy FixedStrategy `json:"fixedStrategy,omitempty"`
NextChaosDateTime int64 `json:"nextChaosDateTime,omitempty"`
Created bool `json:"created,default=false"`
}
没有引发错误,并且修改的specs字段实际上已经持久化,但是status字段的值在下一次调和步骤中仍然保持默认值。
我查看了GitHub或StackOverflow上的其他问题,但是没有任何建议解决我的问题,我无法弄清楚问题出在哪里。有关更全面的信息,您可以参考操作员所在的repo。
非常欢迎任何建议
英文:
I am building a Go Kubernetes operator. I have used kubebuilder to create it.
I want to store some internal details in the CRD status. I have tried :
- To update the whole resource :
if err = r.Client.Update(ctx, upCRD); err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err)
}
- And to update only the status :
if err = r.Status().Update(ctx, upCRD); err != nil {
return reconcile.Result{}, client.IgnoreNotFound(err)
}
The status struct is defined as follows :
type HAAuditStatus struct {
ChaosStrategyCron cron.EntryID `json:"chaosStrategyCron,omitempty"`
TestStatus TestStatus `json:"testStatus,omitempty"`
MetricStatus MetricStatus `json:"metricStatus,omitempty"`
RoundRobinStrategy RoundRobinStrategy `json:"roundRobinStrategy,omitempty"`
FixedStrategy FixedStrategy `json:"fixedStrategy,omitempty"`
NextChaosDateTime int64 `json:"nextChaosDateTime,omitempty"`
Created bool `json:"created,default=false"`
}
No error is raised and the specs fields modified are actually persisted but not the status field whose values remain the default at the next reconciling step.
I have looked at the other issues on GitHub or StackOverflow but any suggestion made solved my issue and I can't figure out what is the problem. For a a bigger picture, you can refer to the repo where the operator is located.
Any suggestion is very welcomed
答案1
得分: 1
我可能找到了状态未更新的原因。
在更新状态之前,我还在更新规格字段(以向用户提供有关创建资源的反馈)。
问题是规格更新触发了新的协调,而在此更新之后的指令(其中包括状态更新)未执行。
我意识到使用规格来向用户提供反馈并不合适,事件更适合此目的。
英文:
I might have found the reason why the status were not updated.
Before updating the status, I was also updating the spec fields (to give some feedback to the user on created resources).
The issue is caused by the fact that the specs updates trigger a new reconcilation, and the instruction after this update (among them the status update) were not execute.
I realized that using specs to give feedback to the user is not suitable and the events were more appropriate for this purpose.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论