php小編草莓在探索使用golang開發kubernetes運算子時,遇到了一個常見的錯誤:「物件已被修改」。這個錯誤通常發生在多個goroutine同時修改同一個物件時,導致資料不一致或競爭條件。在本文中,我們將探討這個錯誤的原因和解決方案,幫助開發者更好地理解和處理類似的問題。
問題內容
k8s 運算子上出現「物件已被修改」錯誤
import "sigs.k8s.io/controller-runtime"
關於這種錯誤有很多討論。主要答案是“發生此問題是因為當我嘗試更新時我有舊版本的物件。” 但我也有一些問題。在我的操作員中,對於某些場景,我需要在一次「協調」呼叫期間更新 pod 的註釋 2 次。當然,我經常收到“對像已被修改”的錯誤。
問題:我想知道 'r.Get()' 和 'r.Update()' 在哪裡取得/更新物件?來自本地緩存,還是 API 伺服器?
1: 我認為 'r.Get()' 是從 'cache' 取得對象,而 'r.Update()' 是更新對像到緩存,對嗎?如果是這樣,為什麼我會收到此錯誤?如果 pod 物件因操作員以外的原因而更改,我將無法在目前「協調」期間永遠更新我的 pod 物件? (由於快取物件是本地的,它已經與 API 伺服器不同步。)為什麼要「重試」有的時候能取得到最新的物件嗎?
import "sigs.k8s.io/controller-runtime" var pod corev1.Pod if err := r.Get(ctx, req.NamespacedName, &pod); err != nil { if !apierrors.IsNotFound(err) { log.Error(err, "unable to get pod") return ctrl.Result{}, err } } if err := r.Update(ctx, &pod); err != nil { log.Error(err, "unable to update chaosctl status") return ctrl.Result{}, err }
2:如果'r.Get()'是從API伺服器取得對象,並且'r.Update()'也更新API伺服器。為什麼我需要重試更新物件?
解決方法
當您在 Kubernetes 控制器中使用 r.Get() 和 r.Update() 時,與 API 伺服器的互動涉及本機快取和 API 伺服器本身。
r.Get()
:
r.Get() 函數從本機快取中檢索物件(如果存在);否則,它會從 API 伺服器取得它。 如果該物件存在於本機快取中,則立即傳回。如果沒有,則向API伺服器請求取得該對象,並將取得到的對象儲存在本機快取中以供後續使用。 r.Update():
r.Update()
函數會更新本機快取和 API 伺服器中的物件。
如果該物件自最初檢索以來已在本機快取中修改,則對 API 伺服器的更新操作可能會失敗並出現「衝突」錯誤。當快取中物件的版本與 API 伺服器上的版本不符時,就會發生這種情況,表示其他人在此期間修改了該物件。
可以採取策略來處理它 -
-
樂觀並發控制(OCC):
- 更新先前的版本符合。 -
retry
-
retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error { return r.Update(ctx, pod) }) if retryErr != nil { return retryErr }
以上是golang 在 k8s 運算子上出現錯誤'物件已被修改”的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Go語言的核心特性包括垃圾回收、靜態鏈接和並發支持。 1.Go語言的並發模型通過goroutine和channel實現高效並發編程。 2.接口和多態性通過實現接口方法,使得不同類型可以統一處理。 3.基本用法展示了函數定義和調用的高效性。 4.高級用法中,切片提供了動態調整大小的強大功能。 5.常見錯誤如競態條件可以通過gotest-race檢測並解決。 6.性能優化通過sync.Pool重用對象,減少垃圾回收壓力。

Go語言在構建高效且可擴展的系統中表現出色,其優勢包括:1.高性能:編譯成機器碼,運行速度快;2.並發編程:通過goroutines和channels簡化多任務處理;3.簡潔性:語法簡潔,降低學習和維護成本;4.跨平台:支持跨平台編譯,方便部署。

關於SQL查詢結果排序的疑惑學習SQL的過程中,常常會遇到一些令人困惑的問題。最近,筆者在閱讀《MICK-SQL基礎�...

golang ...

Go語言中如何對比並處理三個結構體在Go語言編程中,有時需要對比兩個結構體的差異,並將這些差異應用到第�...

GoLand中自定義結構體標籤不顯示怎麼辦?在使用GoLand進行Go語言開發時,很多開發者會遇到自定義結構體標籤在�...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Dreamweaver Mac版
視覺化網頁開發工具

記事本++7.3.1
好用且免費的程式碼編輯器