Home  >  Article  >  Backend Development  >  Update status of custom Kubernetes controller in golang

Update status of custom Kubernetes controller in golang

王林
王林forward
2024-02-11 08:57:08349browse

更新 golang 中自定义 Kubernetes 控制器的状态

php editor Youzi brings you the latest technology sharing: This article will delve into how to customize the status update of the Kubernetes controller in golang. As an open source container orchestration engine, Kubernetes has become a popular choice for cloud native application development. The controller is one of the core components in Kubernetes and is used to manage the state of the application. Understanding how to customize controller status updates will help developers better grasp the flexibility and scalability of Kubernetes. In this article, we will introduce related concepts and provide detailed code examples to help readers get started quickly. Stay tuned!

Question content

I am building a go kubernetes operator. I use kubebuilder to create it. I want to store some internal details in crd state. I've tried:

  • Update the entire resource:
if err = r.client.update(ctx, upcrd); err != nil {
    return ctrl.result{}, client.ignorenotfound(err)
}
  • And only update status:
if err = r.status().update(ctx, upcrd); err != nil {
    return reconcile.result{}, client.ignorenotfound(err)
}

The status structure 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 errors will be thrown, and the modified specification fields will actually be retained, but the status field will not be retained, and its value will remain at its default value in the next reconciliation step. I looked at other questions on github or stackoverflow and any suggestions that came up solved my problem but I can't figure out what the problem was. To get a greater understanding, you can refer to the repository where the operator is located.

Any suggestions are very welcome :)

Solution

I may have found the reason why the status is not updating.

Before updating the status, I also updated the canonical fields (to provide some feedback to the user about the created resource).

The issue is due to a specification update triggering a new reconciliation, and this updated directive (which includes status updates) is not executed.

I realize that using specs to provide feedback to users is not appropriate and events are better suited for this purpose.

The above is the detailed content of Update status of custom Kubernetes controller in golang. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete