ホームページ >バックエンド開発 >Golang >k8s オペレーターでの golang エラー「オブジェクトが変更されました」

k8s オペレーターでの golang エラー「オブジェクトが変更されました」

王林
王林転載
2024-02-13 15:42:08777ブラウズ

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

php エディター Strawberry は、kubernetes オペレーターの開発に golang の使用を検討しているときに、「オブジェクトが変更されました」という一般的なエラーに遭遇しました。このエラーは通常、複数のゴルーチンが同じオブジェクトを同時に変更し、データの不整合や競合状態が発生した場合に発生します。この記事では、開発者が同様の問題をよりよく理解し、対処できるように、このエラーの原因と解決策を検討します。

問題の内容

k8s オペレーターで「オブジェクトが変更されました」エラーが表示される

リーリー

このエラーについては多くの議論が行われています。主な答えは、「更新しようとしたときにオブジェクトのバージョンが古いためにこの問題が発生する」です。 しかし、いくつか疑問もあります。私のオペレーターでは、一部のシナリオで、1 回の「座標」呼び出し中にポッドのアノテーションを 2 回更新する必要があります。もちろん、「オブジェクトは変更されました」というエラーがよく表示されます。

質問: 「r.Get()」と「r.Update()」がオブジェクトを取得/更新する場所を知りたいです。ローカル キャッシュからですか、それとも API サーバーからですか?

1: 「r.Get()」は「キャッシュ」からオブジェクトを取得し、「r.Update()」はオブジェクトをキャッシュに更新していると思いますよね?もしそうなら、なぜこのエラーが発生するのでしょうか?オペレーター以外の理由でポッド オブジェクトが変更された場合、現在の「調整」中にポッド オブジェクトを更新することはできなくなりますか? (キャッシュされたオブジェクトはローカルであるため、すでに API サーバーと同期していません。)最新のオブジェクトを取得するために時々「再試行」するのはなぜでしょうか?

リーリー

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 サーバー上のバージョンと一致しない場合に発生し、その間に他の誰かがオブジェクトを変更したことを示します。

それに対処するための戦略を採用することができます -

  1. オプティミスティック同時実行制御 (OCC): - 以前のバージョンと一致するように更新します。
  2. 再試行 -
リーリー

以上がk8s オペレーターでの golang エラー「オブジェクトが変更されました」の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。