Inhaltsverzeichnis
Probleminhalt
Workaround
Heim Backend-Entwicklung Golang Golang-Fehler „Objekt wurde geändert' beim k8s-Operator

Golang-Fehler „Objekt wurde geändert' beim k8s-Operator

Feb 13, 2024 pm 03:42 PM
golang开发

golang 在 k8s 运算符上出现错误“对象已被修改”

Der PHP-Editor Strawberry ist auf einen häufigen Fehler gestoßen, als er die Verwendung von Golang zur Entwicklung von Kubernetes-Operatoren untersuchte: „Das Objekt wurde geändert“. Dieser Fehler tritt normalerweise auf, wenn mehrere Goroutinen gleichzeitig dasselbe Objekt ändern, was zu Dateninkonsistenzen oder Race Conditions führt. In diesem Artikel werden wir die Ursachen und Lösungen dieses Fehlers untersuchen, um Entwicklern zu helfen, ähnliche Probleme besser zu verstehen und damit umzugehen.

Probleminhalt

Der Fehler „Das Objekt wurde geändert“ wird beim k8s-Operator angezeigt

import "sigs.k8s.io/controller-runtime"
Nach dem Login kopieren

Über diesen Fehler wird viel diskutiert. Die Hauptantwort lautet: „Dieses Problem tritt auf, weil ich eine alte Version des Objekts habe, wenn ich versuche, es zu aktualisieren.“ Aber ich habe auch einige Fragen. Bei meinem Betreiber muss ich in einigen Szenarien die Anmerkung eines Pods während eines einzelnen „Koordinaten“-Aufrufs zweimal aktualisieren. Natürlich bekomme ich oft die Fehlermeldung „Objekt wurde geändert“.

Frage: Ich möchte wissen, wo „r.Get()“ und „r.Update()“ Objekte abrufen/aktualisieren? Vom lokalen Cache oder API-Server?

1: Ich denke, „r.Get()“ holt das Objekt aus „Cache“ und „r.Update()“ aktualisiert das Objekt im Cache, oder? Wenn ja, warum erhalte ich diese Fehlermeldung? Ich kann mein Pod-Objekt während des aktuellen „Abgleichs“ nicht dauerhaft aktualisieren, wenn sich das Pod-Objekt aus anderen Gründen als dem Betreiber ändert? (Da das zwischengespeicherte Objekt lokal ist, ist es bereits nicht mehr mit dem API-Server synchronisiert.) Warum manchmal „wiederholen“, um das neueste Objekt abzurufen?

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
}
Nach dem Login kopieren

2: Wenn „r.Get()“ das Objekt vom API-Server abrufen soll und „r.Update()“ auch den API-Server aktualisiert. Warum muss ich erneut versuchen, das Objekt zu aktualisieren?

Workaround

Wenn Sie r.Get() und r.Update() in einem Kubernetes-Controller verwenden, betrifft die Interaktion mit dem API-Server sowohl den lokalen Cache als auch den API-Server selbst.

r.Get():

Die Funktion

r.Get() ruft das Objekt aus dem lokalen Cache ab, falls es vorhanden ist, andernfalls ruft sie es vom API-Server ab. Wenn das Objekt im lokalen Cache vorhanden ist, wird es sofort zurückgegeben. Wenn nicht, fordern Sie den API-Server auf, das Objekt abzurufen, und speichern Sie das erhaltene Objekt zur späteren Verwendung im lokalen Cache. r.Update():

r.Update() Funktion aktualisiert Objekte im lokalen Cache und API-Server. Aktualisierungsvorgänge auf dem API-Server schlagen möglicherweise mit einem „Konflikt“-Fehler fehl, wenn das Objekt seit dem ursprünglichen Abruf im lokalen Cache geändert wurde. Dies geschieht, wenn die Version eines Objekts im Cache nicht mit der Version auf dem API-Server übereinstimmt, was darauf hindeutet, dass jemand anderes das Objekt in der Zwischenzeit geändert hat.

Es gibt Strategien, damit umzugehen -

  1. 乐观并发控制(OCC): – Aktualisiert, um mit der vorherigen Version übereinzustimmen.
  2. retry -
retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error {
        return r.Update(ctx, pod)
    })
    if retryErr != nil {
        return retryErr
    }
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonGolang-Fehler „Objekt wurde geändert' beim k8s-Operator. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Entwickeln Sie leistungsstarke Desktop-Anwendungen mit Golang Entwickeln Sie leistungsstarke Desktop-Anwendungen mit Golang Mar 19, 2024 pm 05:45 PM

Entwickeln Sie leistungsstarke Desktop-Anwendungen mit Golang

Sicherheitsherausforderungen bei der Golang-Entwicklung: Wie kann verhindert werden, dass es zur Virenentstehung ausgenutzt wird? Sicherheitsherausforderungen bei der Golang-Entwicklung: Wie kann verhindert werden, dass es zur Virenentstehung ausgenutzt wird? Mar 19, 2024 pm 12:39 PM

Sicherheitsherausforderungen bei der Golang-Entwicklung: Wie kann verhindert werden, dass es zur Virenentstehung ausgenutzt wird?

Schritte und Tipps zum Programmieren mit Golang auf dem Mac Schritte und Tipps zum Programmieren mit Golang auf dem Mac Mar 03, 2024 am 08:30 AM

Schritte und Tipps zum Programmieren mit Golang auf dem Mac

Welche Programmiersprachen werden häufig von Golang-Entwicklern verwendet? Welche Programmiersprachen werden häufig von Golang-Entwicklern verwendet? Mar 18, 2024 pm 09:06 PM

Welche Programmiersprachen werden häufig von Golang-Entwicklern verwendet?

Forschung zum Einfluss und zur Rolle von Golang auf die Entwicklung der Blockchain Forschung zum Einfluss und zur Rolle von Golang auf die Entwicklung der Blockchain Feb 26, 2024 pm 04:24 PM

Forschung zum Einfluss und zur Rolle von Golang auf die Entwicklung der Blockchain

Vor- und Nachteile der Verwendung von Golang zur Entwicklung mobiler Spiele Vor- und Nachteile der Verwendung von Golang zur Entwicklung mobiler Spiele Mar 05, 2024 pm 03:51 PM

Vor- und Nachteile der Verwendung von Golang zur Entwicklung mobiler Spiele

Das Go-Kit-Framework hilft, die Leistung der Golang-API zu verbessern Das Go-Kit-Framework hilft, die Leistung der Golang-API zu verbessern May 07, 2024 pm 03:24 PM

Das Go-Kit-Framework hilft, die Leistung der Golang-API zu verbessern

Machbarkeitsanalyse der Verwendung von Golang zur Entwicklung von U3D-Projekten Machbarkeitsanalyse der Verwendung von Golang zur Entwicklung von U3D-Projekten Mar 20, 2024 pm 02:30 PM

Machbarkeitsanalyse der Verwendung von Golang zur Entwicklung von U3D-Projekten

See all articles