php小編柚子為您帶來最新的技術分享:本文將深入探討如何在golang中自定義Kubernetes控制器的狀態更新。Kubernetes作為一個開源容器編排引擎,已成為云原生應用開發的熱門選擇。控制器是Kubernetes中的核心組件之一,用于管理應用的狀態。了解如何自定義控制器的狀態更新將幫助開發人員更好地掌握Kubernetes的靈活性和擴展性。在本文中,我們將介紹相關概念,并提供詳細的代碼示例,幫助讀者快速上手。敬請期待!
問題內容
我正在構建一個 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"` }
登錄后復制
不會引發任何錯誤,并且修改的規格字段實際上會保留,但狀態字段不會保留,其值在下一個協調步驟中仍保留默認值。
我查看了 github 或 stackoverflow 上的其他問題,但提出的任何建議都解決了我的問題,但我無法弄清楚問題是什么。為了獲得更大的了解,您可以參考算子所在的倉庫。
非常歡迎任何建議:)
解決方法
我可能已經找到狀態未更新的原因了。
在更新狀態之前,我還更新了規范字段(以便向用戶提供有關創建的資源的一些反饋)。
該問題是由于規格更新觸發了新的協調,并且此更新后的指令(其中包括狀態更新)未執行。
我意識到使用規范向用戶提供反饋是不合適的,而事件更適合此目的。